Я пытаюсь написать парсер, чтобы проверить следующие объявления типа int и float на языке Си.
объявления переменных, объявления переменных-указателей, массив любых измерений
- float a, b, r = 5, area = r * r, * b;
- int a, b, c, ** p;
- int x, mat [2] [3];
Это мой файл lex
%{
#include "y.tab.h"
extern int yylval;
%}
%%
"int" return INT;
"float" return FLOAT;
[0-9]+ return NUM;
[_|a-z|A-Z]([_|a-z|A-Z|0-9])*{1,255} return NAME;
[+\-*/] return op;
[ \t\n];
. return yytext[0];
%%
Это мой файл yacc
%{
#include<stdio.h>
int yylex() ;
int yyerror();
%}
%token NUM NAME op INT FLOAT
%%
stmt_list: stmt | stmt_list stmt;
stmt: type id_list ';' { printf("Valid Declaration\n"); };
type: INT | FLOAT;
id_list: id ',' id_list | id ;
id: NAME'='expr | expr;
expr: expr op expr | POINT expr | expr MATRIX | '(' expr')' | NAME;
MATRIX: '[' NUM ']' | '[' NUM ']' MATRIX ;
POINT: '*' | '*'POINT;
%%
int main(){
yyparse();
return 0;
}
int yyerror(){
printf("Invalid Declaration\n");
return -1;
}
Даже если я введу "int a;" в качестве входных данных я получаю «Неверная декларация». Я не могу понять, что я делаю неправильно.