解析器,以验证C语言中int和float类型的声明

时间:2018-11-03 17:15:07

标签: parsing bison flex-lexer yacc lex

我正在尝试编写一个解析器,以验证以下int类型和以C语言浮点型的声明。 变量声明,指针变量声明,任何尺寸的数组

  1. float a,b,r = 5,面积= 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;”作为输入,我得到“无效声明”。我无法弄清楚我在做什么错。

0 个答案:

没有答案