github.com/jmigpin/editor@v1.6.0/util/parseutil/lrparser/verticesdata_test.go (about)

     1  package lrparser
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/jmigpin/editor/util/testutil"
     7  )
     8  
     9  func TestVerticesData1(t *testing.T) {
    10  	grammar := `
    11  		^S = C C;
    12  		C = "c" C | "d";
    13  	`
    14  	expect := `
    15  		vertex0:
    16  	        	[{0,^^^->^S},[$]]
    17  	        	[{0,^S->[C C]},[$]]
    18  	        	[{0,C->["c" C]},["c","d"]]
    19  	        	[{0,C->"d"},["c","d"]]
    20  	        	^S->vertex1
    21  	        	C->vertex2
    22  	        	"c"->vertex3
    23  	        	"d"->vertex4
    24  	        vertex1:
    25  	        	[{1,^^^->^S},[$]]
    26  	        vertex2:
    27  	        	[{1,^S->[C C]},[$]]
    28  	        	[{0,C->["c" C]},[$]]
    29  	        	[{0,C->"d"},[$]]
    30  	        	C->vertex6
    31  	        	"c"->vertex7
    32  	        	"d"->vertex8
    33  	        vertex3:
    34  	        	[{0,C->["c" C]},["c","d"]]
    35  	        	[{1,C->["c" C]},["c","d"]]
    36  	        	[{0,C->"d"},["c","d"]]
    37  	        	C->vertex5
    38  	        	"c"->vertex3
    39  	        	"d"->vertex4
    40  	        vertex4:
    41  	        	[{1,C->"d"},["c","d"]]
    42  	        vertex5:
    43  	        	[{2,C->["c" C]},["c","d"]]
    44  	        vertex6:
    45  	        	[{2,^S->[C C]},[$]]
    46  	        vertex7:
    47  	        	[{0,C->["c" C]},[$]]
    48  	        	[{1,C->["c" C]},[$]]
    49  	        	[{0,C->"d"},[$]]
    50  	        	C->vertex9
    51  	        	"c"->vertex7
    52  	        	"d"->vertex8
    53  	        vertex8:
    54  	        	[{1,C->"d"},[$]]
    55  	        vertex9:
    56  	        	[{2,C->["c" C]},[$]]
    57  	`
    58  	testRulesToVerticesMode1(t, grammar, expect)
    59  }
    60  func TestVerticesData2(t *testing.T) {
    61  	grammar := `
    62  		^E = E "+" T | T;
    63  		T = T "*" F | F;
    64  		F = "(" E ")" | "a";
    65  	`
    66  	expect := `
    67  		vertex0:
    68  	        	[{0,^^^->^E},[$]]
    69  	        	[{0,^E->T},["+",$]]
    70  	        	[{0,^E->[^E "+" T]},["+",$]]
    71  	        	[{0,F->["(" ^E ")"]},["*","+",$]]
    72  	        	[{0,F->"a"},["*","+",$]]
    73  	        	[{0,T->F},["*","+",$]]
    74  	        	[{0,T->[T "*" F]},["*","+",$]]
    75  	        	^E->vertex1
    76  	        	F->vertex2
    77  	        	T->vertex3
    78  	        	"("->vertex4
    79  	        	"a"->vertex5
    80  	        vertex1:
    81  	        	[{1,^^^->^E},[$]]
    82  	        	[{1,^E->[^E "+" T]},["+",$]]
    83  	        	"+"->vertex20
    84  	        vertex2:
    85  	        	[{1,T->F},["*","+",$]]
    86  	        vertex3:
    87  	        	[{1,^E->T},["+",$]]
    88  	        	[{1,T->[T "*" F]},["*","+",$]]
    89  	        	"*"->vertex18
    90  	        vertex4:
    91  	        	[{0,^E->T},[")","+"]]
    92  	        	[{0,^E->[^E "+" T]},[")","+"]]
    93  	        	[{0,F->["(" ^E ")"]},[")","*","+"]]
    94  	        	[{1,F->["(" ^E ")"]},["*","+",$]]
    95  	        	[{0,F->"a"},[")","*","+"]]
    96  	        	[{0,T->F},[")","*","+"]]
    97  	        	[{0,T->[T "*" F]},[")","*","+"]]
    98  	        	^E->vertex6
    99  	        	F->vertex7
   100  	        	T->vertex8
   101  	        	"("->vertex9
   102  	        	"a"->vertex10
   103  	        vertex5:
   104  	        	[{1,F->"a"},["*","+",$]]
   105  	        vertex6:
   106  	        	[{1,^E->[^E "+" T]},[")","+"]]
   107  	        	[{2,F->["(" ^E ")"]},["*","+",$]]
   108  	        	")"->vertex17
   109  	        	"+"->vertex13
   110  	        vertex7:
   111  	        	[{1,T->F},[")","*","+"]]
   112  	        vertex8:
   113  	        	[{1,^E->T},[")","+"]]
   114  	        	[{1,T->[T "*" F]},[")","*","+"]]
   115  	        	"*"->vertex15
   116  	        vertex9:
   117  	        	[{0,^E->T},[")","+"]]
   118  	        	[{0,^E->[^E "+" T]},[")","+"]]
   119  	        	[{0,F->["(" ^E ")"]},[")","*","+"]]
   120  	        	[{1,F->["(" ^E ")"]},[")","*","+"]]
   121  	        	[{0,F->"a"},[")","*","+"]]
   122  	        	[{0,T->F},[")","*","+"]]
   123  	        	[{0,T->[T "*" F]},[")","*","+"]]
   124  	        	^E->vertex11
   125  	        	F->vertex7
   126  	        	T->vertex8
   127  	        	"("->vertex9
   128  	        	"a"->vertex10
   129  	        vertex10:
   130  	        	[{1,F->"a"},[")","*","+"]]
   131  	        vertex11:
   132  	        	[{1,^E->[^E "+" T]},[")","+"]]
   133  	        	[{2,F->["(" ^E ")"]},[")","*","+"]]
   134  	        	")"->vertex12
   135  	        	"+"->vertex13
   136  	        vertex12:
   137  	        	[{3,F->["(" ^E ")"]},[")","*","+"]]
   138  	        vertex13:
   139  	        	[{2,^E->[^E "+" T]},[")","+"]]
   140  	        	[{0,F->["(" ^E ")"]},[")","*","+"]]
   141  	        	[{0,F->"a"},[")","*","+"]]
   142  	        	[{0,T->F},[")","*","+"]]
   143  	        	[{0,T->[T "*" F]},[")","*","+"]]
   144  	        	F->vertex7
   145  	        	T->vertex14
   146  	        	"("->vertex9
   147  	        	"a"->vertex10
   148  	        vertex14:
   149  	        	[{3,^E->[^E "+" T]},[")","+"]]
   150  	        	[{1,T->[T "*" F]},[")","*","+"]]
   151  	        	"*"->vertex15
   152  	        vertex15:
   153  	        	[{0,F->["(" ^E ")"]},[")","*","+"]]
   154  	        	[{0,F->"a"},[")","*","+"]]
   155  	        	[{2,T->[T "*" F]},[")","*","+"]]
   156  	        	F->vertex16
   157  	        	"("->vertex9
   158  	        	"a"->vertex10
   159  	        vertex16:
   160  	        	[{3,T->[T "*" F]},[")","*","+"]]
   161  	        vertex17:
   162  	        	[{3,F->["(" ^E ")"]},["*","+",$]]
   163  	        vertex18:
   164  	        	[{0,F->["(" ^E ")"]},["*","+",$]]
   165  	        	[{0,F->"a"},["*","+",$]]
   166  	        	[{2,T->[T "*" F]},["*","+",$]]
   167  	        	F->vertex19
   168  	        	"("->vertex4
   169  	        	"a"->vertex5
   170  	        vertex19:
   171  	        	[{3,T->[T "*" F]},["*","+",$]]
   172  	        vertex20:
   173  	        	[{2,^E->[^E "+" T]},["+",$]]
   174  	        	[{0,F->["(" ^E ")"]},["*","+",$]]
   175  	        	[{0,F->"a"},["*","+",$]]
   176  	        	[{0,T->F},["*","+",$]]
   177  	        	[{0,T->[T "*" F]},["*","+",$]]
   178  	        	F->vertex2
   179  	        	T->vertex21
   180  	        	"("->vertex4
   181  	        	"a"->vertex5
   182  	        vertex21:
   183  	        	[{3,^E->[^E "+" T]},["+",$]]
   184  	        	[{1,T->[T "*" F]},["*","+",$]]
   185  	        	"*"->vertex18
   186  	`
   187  	testRulesToVerticesMode1(t, grammar, expect)
   188  }
   189  func TestVerticesData3(t *testing.T) {
   190  	grammar := `		
   191  		^id = id "a" | "a";
   192  	`
   193  	expect := `
   194  		vertex0:
   195  	        	[{0,^^^->^id},[$]]
   196  	        	[{0,^id->[^id "a"]},["a",$]]
   197  	        	[{0,^id->"a"},["a",$]]
   198  	        	^id->vertex1
   199  	        	"a"->vertex2
   200  	        vertex1:
   201  	        	[{1,^^^->^id},[$]]
   202  	        	[{1,^id->[^id "a"]},["a",$]]
   203  	        	"a"->vertex3
   204  	        vertex2:
   205  	        	[{1,^id->"a"},["a",$]]
   206  	        vertex3:
   207  	        	[{2,^id->[^id "a"]},["a",$]]
   208  	`
   209  	testRulesToVerticesMode1(t, grammar, expect)
   210  }
   211  func TestVerticesData4(t *testing.T) {
   212  	grammar := `		
   213  		^id = id "b" "a" | "a";
   214  	`
   215  	expect := `
   216  		vertex0:
   217  	        	[{0,^^^->^id},[$]]
   218  	        	[{0,^id->[^id "b" "a"]},["b",$]]
   219  	        	[{0,^id->"a"},["b",$]]
   220  	        	^id->vertex1
   221  	        	"a"->vertex2
   222  	        vertex1:
   223  	        	[{1,^^^->^id},[$]]
   224  	        	[{1,^id->[^id "b" "a"]},["b",$]]
   225  	        	"b"->vertex3
   226  	        vertex2:
   227  	        	[{1,^id->"a"},["b",$]]
   228  	        vertex3:
   229  	        	[{2,^id->[^id "b" "a"]},["b",$]]
   230  	        	"a"->vertex4
   231  	        vertex4:
   232  	        	[{3,^id->[^id "b" "a"]},["b",$]]
   233  	`
   234  	testRulesToVerticesMode1(t, grammar, expect)
   235  }
   236  func TestVerticesData5(t *testing.T) {
   237  	grammar := `		
   238  		^id = "a" id | "a";		
   239  	`
   240  	expect := `
   241  		vertex0:
   242  	        	[{0,^^^->^id},[$]]
   243  	        	[{0,^id->["a" ^id]},[$]]
   244  	        	[{0,^id->"a"},[$]]
   245  	        	^id->vertex1
   246  	        	"a"->vertex2
   247  	        vertex1:
   248  	        	[{1,^^^->^id},[$]]
   249  	        vertex2:
   250  	        	[{0,^id->["a" ^id]},[$]]
   251  	        	[{1,^id->["a" ^id]},[$]]
   252  	        	[{0,^id->"a"},[$]]
   253  	        	[{1,^id->"a"},[$]]
   254  	        	^id->vertex3
   255  	        	"a"->vertex2
   256  	        vertex3:
   257  	        	[{2,^id->["a" ^id]},[$]]
   258  	`
   259  	testRulesToVerticesMode1(t, grammar, expect)
   260  }
   261  func TestVerticesData6(t *testing.T) {
   262  	grammar := `
   263  		^id = "a" ("b")? "a";
   264  	`
   265  	expect := `
   266  		vertex0:
   267  	        	[{0,^^^->^id},[$]]
   268  	        	[{0,^id->["a" ("b")? "a"]},[$]]
   269  	        	^id->vertex1
   270  	        	"a"->vertex2
   271  	        vertex1:
   272  	        	[{1,^^^->^id},[$]]
   273  	        vertex2:
   274  	        	[{1,^id->["a" ("b")? "a"]},[$]]
   275  	        	[{0,("b")?->"b"},["a"]]
   276  	        	[{1,("b")?->nil},["a"]]
   277  	        	("b")?->vertex3
   278  	        	"b"->vertex4
   279  	        vertex3:
   280  	        	[{2,^id->["a" ("b")? "a"]},[$]]
   281  	        	"a"->vertex5
   282  	        vertex4:
   283  	        	[{1,("b")?->"b"},["a"]]
   284  	        vertex5:
   285  	        	[{3,^id->["a" ("b")? "a"]},[$]]
   286  	`
   287  	testRulesToVerticesMode1(t, grammar, expect)
   288  }
   289  func TestVerticesData7(t *testing.T) {
   290  	grammar := `
   291  		^id = "a" id | nil;
   292  	`
   293  	expect := `
   294  		vertex0:
   295  	        	[{0,^^^->^id},[$]]
   296  	        	[{0,^id->["a" ^id]},[$]]
   297  	        	[{1,^id->nil},[$]]
   298  	        	^id->vertex1
   299  	        	"a"->vertex2
   300  	        vertex1:
   301  	        	[{1,^^^->^id},[$]]
   302  	        vertex2:
   303  	        	[{0,^id->["a" ^id]},[$]]
   304  	        	[{1,^id->["a" ^id]},[$]]
   305  	        	[{1,^id->nil},[$]]
   306  	        	^id->vertex3
   307  	        	"a"->vertex2
   308  	        vertex3:
   309  	        	[{2,^id->["a" ^id]},[$]]
   310  	`
   311  	testRulesToVerticesMode1(t, grammar, expect)
   312  }
   313  func TestVerticesData8(t *testing.T) {
   314  	grammar := `
   315  		^S = "a" A "d" | "b" B "d" | "a" B "e" | "b" A "e";
   316  		A = "c";
   317  		B = "c";
   318  	`
   319  	expect := `
   320  		vertex0:
   321  	        	[{0,^^^->^S},[$]]
   322  	        	[{0,^S->["a" A "d"]},[$]]
   323  	        	[{0,^S->["a" B "e"]},[$]]
   324  	        	[{0,^S->["b" A "e"]},[$]]
   325  	        	[{0,^S->["b" B "d"]},[$]]
   326  	        	^S->vertex1
   327  	        	"a"->vertex2
   328  	        	"b"->vertex3
   329  	        vertex1:
   330  	        	[{1,^^^->^S},[$]]
   331  	        vertex2:
   332  	        	[{1,^S->["a" A "d"]},[$]]
   333  	        	[{1,^S->["a" B "e"]},[$]]
   334  	        	[{0,A->"c"},["d"]]
   335  	        	[{0,B->"c"},["e"]]
   336  	        	A->vertex9
   337  	        	B->vertex10
   338  	        	"c"->vertex11
   339  	        vertex3:
   340  	        	[{1,^S->["b" A "e"]},[$]]
   341  	        	[{1,^S->["b" B "d"]},[$]]
   342  	        	[{0,A->"c"},["e"]]
   343  	        	[{0,B->"c"},["d"]]
   344  	        	A->vertex4
   345  	        	B->vertex5
   346  	        	"c"->vertex6
   347  	        vertex4:
   348  	        	[{2,^S->["b" A "e"]},[$]]
   349  	        	"e"->vertex8
   350  	        vertex5:
   351  	        	[{2,^S->["b" B "d"]},[$]]
   352  	        	"d"->vertex7
   353  	        vertex6:
   354  	        	[{1,A->"c"},["e"]]
   355  	        	[{1,B->"c"},["d"]]
   356  	        vertex7:
   357  	        	[{3,^S->["b" B "d"]},[$]]
   358  	        vertex8:
   359  	        	[{3,^S->["b" A "e"]},[$]]
   360  	        vertex9:
   361  	        	[{2,^S->["a" A "d"]},[$]]
   362  	        	"d"->vertex13
   363  	        vertex10:
   364  	        	[{2,^S->["a" B "e"]},[$]]
   365  	        	"e"->vertex12
   366  	        vertex11:
   367  	        	[{1,A->"c"},["d"]]
   368  	        	[{1,B->"c"},["e"]]
   369  	        vertex12:
   370  	        	[{3,^S->["a" B "e"]},[$]]
   371  	        vertex13:
   372  	        	[{3,^S->["a" A "d"]},[$]]
   373  	`
   374  	testRulesToVerticesMode1(t, grammar, expect)
   375  }
   376  
   377  //----------
   378  
   379  //func TestVerticesData9(t *testing.T) {
   380  //	grammar := `
   381  //		^S = (s1)%
   382  //		s1 = (letter digit)+
   383  //	`
   384  //	expect := ``
   385  //	testRulesToVerticesMode1(t, grammar, expect)
   386  //}
   387  //func TestVerticesData9(t *testing.T) {
   388  //	grammar := `
   389  //		^S = "a" ("a"|"1")*
   390  
   391  //		#^S = "a" s2
   392  //		#s2 = "a" s2 | "1" s2 | nil
   393  //	`
   394  //	expect := `
   395  //	`
   396  //	testRulesToVerticesMode1(t, grammar, expect)
   397  //}
   398  
   399  //func TestVerticesData10(t *testing.T) {
   400  //	// TODO: crash, should give loop error
   401  //	// ^S = S
   402  //	grammar := `
   403  //		^S = S
   404  //		#^S = S | "a"
   405  //	`
   406  //	expect := `
   407  //	`
   408  //	testRulesToVerticesMode1(t, grammar, expect)
   409  //}
   410  
   411  //----------
   412  //----------
   413  //----------
   414  
   415  func testRulesToVerticesMode1(t *testing.T, grammar, expect string) {
   416  	t.Helper()
   417  
   418  	fset := &FileSet{Src: []byte(grammar), Filename: "_.grammar"}
   419  	ri := newRuleIndex()
   420  	if err := setupPredefineds(ri); err != nil {
   421  		t.Fatal(err)
   422  	}
   423  	gp := newGrammarParser(ri)
   424  	if err := gp.parse(fset); err != nil {
   425  		t.Fatal(err)
   426  	}
   427  
   428  	vd, err := newVerticesData(ri, "", false)
   429  	if err != nil {
   430  		t.Fatal(err)
   431  	}
   432  	//t.Log(ri) // index deref'd
   433  
   434  	res := vd.String()
   435  
   436  	res2 := testutil.TrimLineSpaces(res)
   437  	expect2 := testutil.TrimLineSpaces(expect)
   438  	if res2 != expect2 {
   439  		t.Fatal(res)
   440  	}
   441  }