github.com/jmigpin/editor@v1.6.0/util/parseutil/lrparser/grammarparser_test.go (about) 1 package lrparser 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/jmigpin/editor/util/testutil" 8 ) 9 10 func TestGrammarParser1(t *testing.T) { 11 in := ` 12 ^S = C C; 13 C = "c" C | "d"; 14 ` 15 out := ` 16 ruleindex{ 17 ^S = [{r:C} {r:C}] 18 C = [["c" {r:C}]|"d"] 19 } 20 ` 21 testGrammarParserMode1(t, in, out) 22 } 23 func TestGrammarParser2(t *testing.T) { 24 in := ` 25 ^S = (a|b|("cd")%)?; 26 ` 27 out := ` 28 ruleindex{ 29 ^S = ([{r:a}|{r:b}|("cd")%])? 30 } 31 ` 32 testGrammarParserMode1(t, in, out) 33 } 34 func TestGrammarParser3(t *testing.T) { 35 in := ` 36 ^S = if a?b:c; 37 ` 38 out := ` 39 ruleindex{ 40 ^S = {if {r:a} ? {r:b} : {r:c}} 41 } 42 ` 43 testGrammarParserMode1(t, in, out) 44 } 45 46 //---------- 47 48 func testGrammarParserMode1(t *testing.T, in, out string) { 49 t.Helper() 50 51 fset := &FileSet{Src: []byte(in), Filename: "_.grammar"} 52 ri := newRuleIndex() 53 gp := newGrammarParser(ri) 54 if err := gp.parse(fset); err != nil { 55 t.Fatal(err) 56 } 57 //t.Logf("\n%v\n", ri) 58 59 res := fmt.Sprintf("%v", ri) 60 res2 := testutil.TrimLineSpaces(res) 61 expect2 := testutil.TrimLineSpaces(out) 62 if res2 != expect2 { 63 t.Fatal("\n" + res) 64 } 65 }