Mul on üsna vana C ettevõtte parseri / kompilaatori kood, mis loodi iidsest Yaccist ja algne grammatikaallikas on kadunud (vahefailidena), ainus tulemus, mille ytab.c
parser tekitas faili. See pärandkood vajab uuendamist, kuid ma ei saa seda lubada, et seda nullist ümber kodeerida.
"Ancient Yacc" all mõtlen, et parser kasutab tabeleid nimega yyact
, yypact
, yypgo
, yyr1
, yyr2
, yytoks
, yyexca
, yychk
, yydef
.
Kas parsimistabelite lahutamise abil oleks võimalik parsimisreegleid mehaaniliselt hankida / taastada, et parsida tabelid grammatika?
Näide avaldise parseri väikese prooviga, mida saan töödelda sama iidse Yacciga:
yytabelem yyexca [] = {- 1, 1, 0 , -1, -2, 0, -1, 21, 261, 0, -2, 8,}; yytabelem yyact [] = {13, 9, 10, 11, 12, 23, 8, 22, 13, 9 10, 11, 12, 9, 10, 11, 12, 1, 2, 11, 12, 6, 7, 4, 3, 0, 16, 5, 0, 14, 15, 0, 0, 0, 17 , 18, 19, 20, 21, 0, 0 Yytabelem yypact [] = {-248, -1000, -236, -261, -236, -236, -1000, -1000, -248, -236, -236, -236, -236, - 236, -253, -1000, -263, -245, -245, -1000, -1000, -249, -1000, -248, -1000}; yytabelem yypgo [] = {0, 17, 24}; yytabelem yyr1 [] = {0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2}; yytabelem yyr2 [] = {0, 8, 12, 0, 6, 6, 6, 6, 6, 6, 4, 2, 2}; yytabelem yychk [] = {-1000, -1, 266, -2, 259, 263, 257, 258, 267, 262, 263, 264, 265, 261, -2, -2, -1, -2, -2, -2, -2, -2, 260, 268, -1}; yytabelem yydef [] = {3, -2, 0, 0, 0 0, 11, 12, 3, 0,
0, 0, 0, 0, 0, 10, 1, 4, 5, 6, 7, -2, 9, 3, 2}; yytoktype yytoks [] = {"NIMI", 257, "NUMBER", 258, "LPAREN", 259, "RPAREN", 260, "EQUAL", 261, "PLUS", 262, "MINUS", 263, "TIMES", 264, "JAGA", 265, "IF", 266, "SIIS" ", 267," ELSE ", 268," MADAL ", 269," UMINUS ", 270," -teadmata- ", -1 / * lõpetab otsingu * /};
I otsin alla
stmt: KUI exp THEN stmt | KUI EXP THEN stmt MUUD stmt | / * teised * /; exp: exp PLUS exp | exp MINUS exp | exp KORRAD exp | exp JAGA exp | exp EQUAL exp | LPAREN exp RPAREN | Miinus aeg | NIMI | NUMBER;
Selle näite täielik parser on saadaval kokkuvõttena, see näitab reeglit tabelit yyreds
silumisinfo, mis pole parseris ja mida üritan tagasi pöörata.
Märkus: ma küsisin seda varem SO-st ja tehti mulle ettepanek seda RE-s küsida. Kas on abi?
PS: Ma ei ole RE-küsimuste siltidega tuttav, parandage seda julgelt.