Lemon берет lempar.c и выводит мусор в конце файла
Я использую LEMON Parser Generator и по какой-то причине он выводит кучу мусора в конце выведенного файла, а не заменяет %%
s из lempar.c с сгенерированным кодом. Я скопировал lemon.c и lempar.c прямо из исходного кода sqlite. Вот мой файл грамматики:
%token_prefix TK_
%token_type {const char*}
%extra_argument { HiqupElem elem }
%syntax_error {
printf("Hit syntax error, not sure..\n");
}
%stack_overflow {
printf("Stackru.com\n");
}
%name hiqupParser
%include {
#include <stdio.h>
#include <assert.h>
#include "types.h"
}
%start_symbol start
start ::= in .
in(A) ::= in expression(B) SEMICOLON . { printf("Found expression %s, %s!\n", A, B); }
expression(A) ::= STRING(B) . { A = B }
expression(A) ::= NUMBER(B) . { A = B }
и вот мусор это просто добавление в конец копии файла лемпара
"$", "SEMICOLON", "STRING", "NUMBER",
"error", "start", "in", "expression",
/* 0 */ "in ::= in expression SEMICOLON",
/* 1 */ "expression ::= STRING",
/* 2 */ "expression ::= NUMBER",
/* 3 */ "start ::= in",
#line 9 "compiler.y"
printf("Stackru.com\n");
#line 1025 "compiler.c"
{ 6, 3 },
{ 7, 1 },
{ 7, 1 },
{ 5, 1 },
YYMINORTYPE yylhsminor;
case 0: /* in ::= in expression SEMICOLON */
#line 25 "compiler.y"
{ printf("Found expression %s, %s!\n", yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); }
#line 1034 "compiler.c"
break;
case 1: /* expression ::= STRING */
case 2: /* expression ::= NUMBER */ yytestcase(yyruleno==2);
#line 27 "compiler.y"
{ yylhsminor.yy0 = yymsp[0].minor.yy0 }
#line 1040 "compiler.c"
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
default:
/* (3) start ::= in */ yytestcase(yyruleno==3);
break;
#line 5 "compiler.y"
printf("Hit syntax error, not sure..\n");
#line 1049 "compiler.c"
1 ответ
Лимон ожидает файл шаблона lempar.c
иметь ровно 15 секций, разделенных началом строки %%
, (Число 15, вероятно, может быть изменено.) Между этими разделами он вклеивает код, сгенерированный из описания грамматики.
Функция, которая читает шаблон, не выполняет много ошибок. Он просто читает, пока не достигнет EOF или не найдет строку, начинающуюся с двух процентов:
while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){
// ...
}
Таким образом, если разделов меньше 15, то пустые из них будут пустыми.
Оказывается, в вашей среде IDE повторно загружены загруженные файлы, в том числе многие из %%
разделительные линии, попадающие в блоки в скобках. Таким образом, большая часть сгенерированного текста вставляется не в то место, а многие из %%
строки сохраняются, где они будут вызывать синтаксические ошибки.
Во всяком случае, я не вижу никакой практической ценности в использовании IDE для загрузки исходных файлов. На стартовой странице lemon есть ссылки на lemon.c и lempar.c; каждая из этих страниц имеет ссылку для скачивания (в светло-голубой полосе вверху). В большинстве браузеров вы можете скачать файл, просто щелкнув правой кнопкой мыши по ссылке и выбрав "Сохранить как...". Или вы можете скопировать адрес ссылки и скачать его с curl
(что я и сделал) или wget
, (Я не указывал здесь ссылку на загружаемый файл, потому что ссылка версионная, и вы, вероятно, захотите использовать последнюю версию.)
Тогда вам нужно только скомпилировать lemon.c
(c99 -Wall -O2 -o lemon lemon.c
) и поставить копию lempar.c
в каталоге, из которого вы запускаете лимон. (Или вы можете указать местоположение lempar.c
с использованием -T
опция).