我有一个很古老的C公司解析器/编译器代码,它是从一个古老的Yacc生成的,原始语法源丢失了(作为中间文件),这是ytab.c解析器生成文件的唯一结果。那段旧代码需要修改,但是我无法从头开始对其进行重新编码。 yyactyypactyypgoyyr1

是否可以通过推导解析表来机械地检索/重新生成解析规则以重构语法?我可以使用相同的古老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

但是似乎打算与另一组表一起使用。尽管如此,它可能还是有用的开始。