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 }