使用flex和bison显示成功的语法分析器

时间:2015-11-08 12:31:56

标签: compiler-construction bison flex-lexer

我正在尝试创建一个能够识别有效语句的语法分析器,并在此过程中打印成功。但是,在制作了lex和yacc文件后,我的yacc文件中出现了错误:

  

在函数'yyparse'fofo.y中:在函数'yyparse'中:
  fofo.y:13:5:错误:程序中流浪'\'223'   fofo.y:13:5:错误:在程序中流浪'\'   fofo.y:13:16:错误:'n'未声明(首次使用此功能)
  fofo.y:13:16:注意:每个未声明的标识符仅针对它出现的每个函数报告一次   fofo.y:13:18:错误:预期')'在'无效'之前   fofo.y:13:18:错误:在程序中流浪'\'   fofo.y:13:18:错误:程序中错误的'\ 224'

这是我的yacc文件内容:

%{
#include <stdio.h>
%}

%start Stmt_list
%token Id Num Relop Addop Mulop Assignop Not

%%
Stmt_list   : Stmt ';' '\n' {printf ("\n Success. \n"); exit(0);}
        | Stmt_list Stmt ';' '\n'   {printf ("\n Success. \n"); exit(0);}
        | error '\n'    {printf (“\n Invalid. \n”); exit(1);}
        ;

Stmt    : Variable Assignop Expression
    ;

Variable    : Id 
        | Id '['Expression']'
        ;

Expression  : Simple_expression 
        | Simple_expression Relop Simple_expression
        ;

Simple_expression   : Term 
            | Simple_expression Addop Term
            ;

Term    : Factor 
    | Term Mulop Factor
    ;

Factor  : Id 
    | Num 
    | '('Expression')' 
    | Id '['Expression']' 
    | Not Factor
    ;

%%

#include"lex.yy.c"

int main()  
{   
    yyparse();  
    yylex();

}  

yyerror(char *s)  
{  
 printf("\nError\n");  
}  

1 个答案:

答案 0 :(得分:0)

错误来自文本中的一些非ASCII字符(可能来自Word文件中的粘贴文本),在第13行,如错误消息所示:

        | error '\n'    {printf (“\n Invalid. \n”); exit(1);}
                                 ^              ^
                                 |              |
                                 `--------------`------------   The error is here!

请注意,引号字符与上面的行不同,应编辑为:

        | error '\n'    {printf ("\n Invalid. \n"); exit(1);}

我还在你的代币周围添加了一些空白区域。例如,在这些行上:

        | Id '['Expression']'
    | '('Expression')' 
    | Id '['Expression']'

我改为:

        | Id '[' Expression ']'
    | '(' Expression ')' 
    | Id '[' Expression ']'

我还注意到你正在呼叫C function 'exit' but have not declared it properly。标题中需要以下行:

#include <stdlib.h>

然后它似乎对我来说很好。