解析lex / yacc中的表达式

时间:2013-12-07 12:52:06

标签: parsing expression yacc lex

我正在尝试根据这些规则解析语句以查看它们是否有效:

赋值: id = exp;

表达式: id op id {op id}

id是数字和char的组合,第一个位置包含char。

我在in.txt文件中遇到类似的内容时出现语法错误:hellow = three3

但这不应该是语法错误,然后当我输入类似:hellow = =

不会显示语法错误但应该显示。我做错了什么?

莱克斯:

%{
#include "y.tab.h"
#include <stdio.h>
%}
%%
[ \t\n]+                ;
[a-zA-Z][a-zA-Z0-9]*    {
                        ECHO;
                        return ID;
                    }
%%

YACC:

%{
#include <stdio.h>
extern FILE * yyin;
%}
%token ID

%left '+' '-'
%left '*' '/' '%'
%right ';'

%%
assignment: expression
        |
        ID '=' expression
        ;

expression: ID
        |
        expression '*' expression
        |
        expression '/' expression
        |
        expression '%' expression
        |
        expression '+' expression
        |
        expression '-' expression
        |
        '(' expression ')'
        ;
%%
int main(void) {
yyin = fopen("in.txt", "r");
yyparse();
fclose(yyin);
return 0;
}

1 个答案:

答案 0 :(得分:2)

我不能只是看这个,但找到的好方法是在环境变量YYDEBUG为1时运行你的解析器,就像在(unix)中一样:

YYDEBUG=1 ./a.out 

你应该得到解析器所采取的步骤的详细列表以及它从词法分析器接收的标记(大多数情况下都是错误的,例如在你的例子中:解析器如何获得'='符号和运营商?)。将其与运行yacc -v

时获得的y.output文件进行比较