Kérdés:
LALR elemzés: töltse le a nyelvtani szabályokat a létrehozott elemzési táblákból
Seki
2013-12-10 23:35:29 UTC
view on stackexchange narkive permalink

Van egy nagyon régi C vállalati elemző / fordító kódom, amelyet egy ősi Yacc-ból állítottak elő, és az eredeti nyelvtani forrás elveszett (köztes fájlokként), az egyetlen eredmény, amelyet a ytab.c elemző generált fájl. Ezt a régi kóddarabot meg kell újítani, de nem engedhetem meg magamnak, hogy a semmiből átkódoljam.

Az "ősi Yacc" kifejezésen azt értem, hogy az elemző yyact , yypact , yypgo , yyr1 , yyr2 , yytoks , yyexca , yychk , yydef.

Lehetséges-e az elemzési szabályok mechanikus visszakeresése / regenerálása az elemzési táblák levonásával a nyelvtan?

Példa egy kifejezéselemző kis mintájára, amelyet ugyanazzal az ősi Yacc-szal tudok feldolgozni:

  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}; 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 [] = {"Név", 257, "SZÁM", 258, "LPAREN", 259, "RPAREN", 260, "EQUAL", 261, "PLUS", 262, "MINUS", 263, "TIMES", 264, "DIVIDE", 265, "IF", 266, "THEN" ", 267," ELSE ", 268," LOW ", 269," UMINUS ", 270," -unknown- ", -1 / * befejezi a keresést * /};  

I keresni szeretném

  stmt: IF exp THEN stmt | HA exp. AKKOR stmt MÁS stmt | / * mások * /; exp: exp PLUS exp | exp MINUS exp | exp TIMES exp | exp DIVIDE exp | exp EQUAL exp | LPAREN exp RPAREN | MINUS exp | NÉV | SZÁM;  

A példa teljes elemzője összefoglalásként érhető el, és egy yyreds táblázatot mutat, amely a szabályokat tartalmazza. olyan hibakeresési információk, amelyek nincsenek az elemzőben, és amelyeket megpróbálok visszafordítani.

Megjegyzés: Ezt kértem korábban a SO-n, és azt javasolták, hogy kérdezzem meg a RE-ben. Van valamilyen segítség?

PS: Nem ismerem az RE kérdés címkéit, bátran javítsa ki ezt.

Kérjük, olvassa el a szerkesztést :)
Egy válasz:
Igor Skochinsky
2013-12-11 04:46:19 UTC
view on stackexchange narkive permalink

Nincs tényleges válaszom. Hallottam pletykákat egy eszközről, amely ezt csinálta, de nem láttam semmi konkrétat. Találtam azonban egy olyan oldalt, amely elég hasznos lehet:

A GNU Bison által létrehozott C elemzők megértése

Ez a dokumentum kísérlet egy LALR megvalósításának leírására (1) a Bison 2.3 által generált elemző C-ben. Egy egyszerű nyelvtan segítségével bemutattam az elemző működését és az elemző táblák jellegét. Ezeknek a táblázatoknak az összehasonlítását megtalálja Aho, Sethi és Ullman népszerű könyvében "Összeállítások - alapelvek, technikák és eszközök", amelyet "Sárkánykönyvként" is hívnak, és sok más, a fordító tervezésével foglalkozó könyv tömörítetlen táblázatos sémájához. .

Lásd itt.

SZERKESZTÉS : talált egy szkriptet, amely azt állítja, hogy megteszi!

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

Úgy tűnik azonban, hogy egy másik készlettel kívánják használni táblázatból. Ennek ellenére hasznos lehet kezdetként.



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...