Генерация компилятора из грамматики lex и yacc

Я пытаюсь создать компилятор, чтобы потом передать ему файл .c.

Я загрузил грамматики YACC и LEX с http://www.quut.com/c/ANSI-C-grammar-y.html и назвали их clexyacc.l и clexyacc.y

При генерации на терминале я сделал:

yacc -d clexyacc.y
lex clexyacc.l

Все прошло нормально. Когда я перехожу к последней части, я получаю несколько ошибок.

Последняя часть: cc lex.yy.c y.tab.c -oclexyacc.exe

Но я получаю такие ошибки:

y.tab.c:2261:16: warning: implicit declaration of function 'yylex' is invalid in
      C99 [-Wimplicit-function-declaration]
      yychar = YYLEX;
               ^
y.tab.c:1617:16: note: expanded from macro 'YYLEX'
# define YYLEX yylex ()
               ^
y.tab.c:2379:7: warning: implicit declaration of function 'yyerror' is invalid
      in C99 [-Wimplicit-function-declaration]
      yyerror (YY_("syntax error"));
      ^
clexyacc.y:530:6: error: conflicting types for 'yyerror'
void yyerror(const char *s)
     ^
y.tab.c:2379:7: note: previous implicit declaration is here
      yyerror (YY_("syntax error"));
      ^
2 warnings and 1 error generated.

person ChasingCars    schedule 17.05.2014    source источник
comment
Как вы определяете yyerror в вашем файле лексера? См .: stackoverflow.com/questions/15641256/   -  person Joe    schedule 18.05.2014
comment
В моем файле clex.l у меня есть только две ссылки на yyerror: extern void yyerror (const char *); yyerror (незавершенный комментарий);   -  person ChasingCars    schedule 18.05.2014


Ответы (1)


Версия yacc, которую вы используете, создает код C, который недопустим для C99.

Создаваемый им код не включает объявления функций yylex или yyerror до их вызова. Это вызывает предупреждения. В случае yyerror это также приводит к неявному объявлению, которое не соответствует более позднему фактическому определению.

Вы можете обойти это, добавив следующее в начало файла .y:

%{
int yylex();
void yyerror(const char *s);
%}

Или вы можете переключиться на более современный компилятор yacc.

См. Также следующее: Простые грамматики yacc выдают ошибку

person harmic    schedule 17.05.2014
comment
Я должен добавить их в начало моего файла yacc, правильно? - person ChasingCars; 18.05.2014
comment
Я добавил% {int yylex (); void yyerror (const char * s); %} в верхней части моего файла yacc. При компиляции последней части я теперь получаю: Неопределенные символы для архитектуры x86_64: _main, на которые есть ссылка: неявный ввод / запуск для основного исполняемого файла ld: символ (символы) не найдены для архитектуры x86_64 clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 ( используйте -v, чтобы увидеть вызов) - person ChasingCars; 18.05.2014
comment
Вы пытаетесь скомпилировать его в исполняемый файл, а в вашей программе нет основной функции. Сам по себе парсер / лексер ничего не делает, вам нужно написать основную функцию, которая будет передавать ей файл и что-то делать с результатом синтаксического анализа. Или просто скомпилируйте его в объектный файл без связывания и свяжите его с объектом, содержащим main, позже (опция -c для этого). - person harmic; 18.05.2014
comment
Ох, хорошо. Итак, вы говорите мне, что я должен просто придерживаться части: yacc -d clexyacc.y lex clexyacc.l, а затем скомпилировать его в файл .c? - person ChasingCars; 18.05.2014
comment
Я бы все равно скомпилировал его в файл .o, иначе вы не знаете, содержит ли он правильный синтаксис. сделайте это с помощью: cc -c lex.yy.c y.tab.c. Параметр -c указывает ему создавать файлы .o (объектные), которые позже можно связать с файлом .c. - person harmic; 18.05.2014
comment
Хорошо. Большое спасибо, я уже сделал это, и были созданы оба файла .o (lex.yy.o и y.tab.o). Только один последний вопрос, так как я сейчас немного бездельник. Как теперь я могу использовать все это для анализа файла .c? - person ChasingCars; 18.05.2014
comment
Нет. Согласно моему предыдущему комментарию, вам нужна основная функция. Извините, что объяснение по этому поводу выходит за рамки комментария, но профессор Google должен быть в состоянии помочь - person harmic; 18.05.2014