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  }