ytab.c
解析器生成文件的唯一结果。那段旧代码需要修改,但是我无法从头开始对其进行重新编码。 yyact
,yypact
,yypgo
,yyr1
。是否可以通过推导解析表来机械地检索/重新生成解析规则以重构语法?我可以使用相同的古老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 /* ends search */
};
我正在寻找
br />
本示例的完整解析器可以作为一个要点使用,它显示了一个
yyr2
表,其中包含规则作为调试信息,而这些信息不在我尝试反转的解析器中。 br />注意:我以前曾在SO上询问过此问题,建议在RE中进行询问。有帮助吗?#1 楼
我没有实际答案。我听说过一些工具可以做到这一点的传闻,但还没有看到任何具体的东西。但是,我发现了一个页面,该页面应该非常有用:了解由GNU Bison生成的C解析器
本文试图描述实现Bison 2.3生成的C中的
LALR(1)解析器。我使用了一个简单的语法
来演示解析器的工作以及解析
表的本质。您还可以将这些表与Aho,Sethi和Ullman的热门书籍“ Compilers-
Principles,技巧和工具”中的
未压缩表格格式进行比较,也称为《龙书》和其他许多有关编译器设计的书。
在此处查看。 />
http://nah6.com/~itsme/cvs-xdadevtools/perlutils/yydecode.pl
但是似乎打算与另一组表一起使用。尽管如此,它可能还是有用的开始。
评论
请查看编辑:)