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

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

Я загрузил грамматики 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-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.

1 ответов


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

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

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

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

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

Смотрите также: простые грамматики yacc дают ошибку