у меня есть довольно старый код C корпоративный синтаксический анализатор, который был создан из древнего Yacc и использует yyact
, yypact
, yypgo
, yyr1
, yyr2
, yytoks
, yyexca
, yychk
, yydef
столы (но нет yyreds
) и исходный источник грамматики теряется. Эта устаревшая часть кода нуждается в обновлении, но я не могу позволить себе перекодировать ее с нуля.извлекать правила грамматики из сгенерированных синтаксического анализа таблиц
Невозможно механически получить/регенерировать правила синтаксического анализа путем вычитания таблиц синтаксического анализа, чтобы восстановить грамматику?
Пример с небольшим количеством выражения синтаксический анализатор, который я могу обработать с той же древней 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 */
};
/* am getting this table in my example,
but it is not present in the studied parser :^(*/
char * yyreds[] =
{
"-no such reduction-",
"stmt : IF exp THEN stmt",
"stmt : IF exp THEN stmt ELSE stmt",
"stmt : /* empty */",
"exp : exp PLUS exp",
"exp : exp MINUS exp",
"exp : exp TIMES exp",
"exp : exp DIVIDE exp",
"exp : exp EQUAL exp",
"exp : LPAREN exp RPAREN",
"exp : MINUS exp",
"exp : NAME",
"exp : NUMBER",
};
Я ищу, чтобы получить
stmt : IF exp THEN stmt
| IF exp THEN stmt ELSE stmt
| /*others*/
;
exp : exp PLUS exp
| exp MINUS exp
| exp TIMES exp
| exp DIVIDE exp
| exp EQUAL exp
| LPAREN exp RPAREN
| MINUS exp
| NAME
| NUMBER
;
Edit: Я урезанная сгенерированный анализатор моего примера для ясности, но чтобы помочь в анализе, я опубликовал весь сгенерированный код as a gist. Пожалуйста, не то, что по какой-то неизвестной причине нет таблицы yyreds
в синтаксическом анализаторе. Я пытаюсь изучить/изменить. Я полагаю, это было бы не весело:^S
Вы спрашиваете об декомпиляции: молотый говяжий назад к корове. Этот вопрос может добавить некоторый разновидности на сайт SE с обратным проектированием. – Kaz
Нет ли файла 'y.output', если это возможно? – Kaz
@ Kaz: если вы чувствуете, что это хороший кандидат, я могу спросить его и в RE. Если такая перекрестная реклама принимается. И нет, у меня есть только «ytab.c». – Seki