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.