古いYaccから生成された非常に古いC企業パーサー/コンパイラコードがあり、元の文法ソースが(中間ファイルとして)失われ、 ytab.c
パーサーが生成した唯一の結果ファイル。そのレガシーコードは修正が必要ですが、最初から再コーディングする余裕はありません。
「古代Yacc」とは、パーサーが yyact
、 yypact
、 yypgo
、 yyr1
、 yyr2
、 yytoks
、 yyexca
、 yychk
、 yydef
。
解析テーブルを差し引くことにより、解析ルールを機械的に取得/再生成して、文法?
同じ古代のYaccで処理できる式パーサーの小さなサンプルの例:
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 、24}; 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 [] = {"NAME"、257、 "NUMBER"、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 / *検索を終了します* /};
I取得しようとしています
stmt:IF exp THEN stmt | IF exp THEN stmt ELSE stmt | / *その他* /; exp:exp PLUS exp | expマイナスexp | exp TIMES exp | exp DIVIDE exp | exp EQUAL exp | LPAREN exp RPAREN |マイナス経験|名前| NUMBER;
この例の完全なパーサーは要点として利用可能であり、ルールを含む yyreds
テーブルを取り消そうとしているパーサーにないデバッグ情報。
注:これは以前はSOで尋ねたので、REで尋ねるように提案されました。何か助けがありますか?
PS:REの質問タグに慣れていないので、遠慮なく修正してください。