Küsimus:
LALR-i sõelumine: tooge loodud grammatikatabelitest grammatikareeglid
Seki
2013-12-10 23:35:29 UTC
view on stackexchange narkive permalink

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.

Palun vaadake muudatust :)
üks vastus:
Igor Skochinsky
2013-12-11 04:46:19 UTC
view on stackexchange narkive permalink

Mul pole tegelikku vastust. Olen kuulnud mingeid kuulujutte tööriista tegemisest, kuid pole midagi konkreetset näinud. Olen siiski leidnud lehe, mis peaks olema üsna kasulik:

GNU Bisoni loodud C-parseritest aru saamine

See dokument on katse kirjeldada LALR-i rakendamist (1) parison C-s, mille on genereerinud Bison 2.3. Parseri töö ja tabelite sõelumise olemuse näitamiseks kasutasin lihtsat grammatikat. Samuti leiate nende tabelite võrdluse tihendamata tabeliskeemiga, mis on esitatud Aho, Sethi ja Ullmani populaarses raamatus "Koostajad - põhimõtted, tehnikad ja tööriistad", mida nimetatakse ka "Draakoniraamatuks" ja paljudeks muudeks kompilaatori kujunduse raamatuteks .

Vaadake seda siin.

MUUDA : leidis skripti, mis väidab, et teeb seda!

http://nah6.com/~itsme/cvs-xdadevtools/perlutils/yydecode.pl

Kuid tundub, et see on mõeldud kasutamiseks mõne muu komplektiga tabelitest. Siiski võib see alguseks kasulik olla.



See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...