Парсер для проверки объявлений типа int и float на языке C - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь написать парсер, чтобы проверить следующие объявления типа int и float на языке Си. объявления переменных, объявления переменных-указателей, массив любых измерений

  1. float a, b, r = 5, area = r * r, * b;
  2. int a, b, c, ** p;
  3. 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;" в качестве входных данных я получаю «Неверная декларация». Я не могу понять, что я делаю неправильно.

...