Parsing lex/yacc中表达式的解析器

Parsing lex/yacc中表达式的解析器,parsing,expression,yacc,lex,Parsing,Expression,Yacc,Lex,我试图根据以下规则分析语句,以查看它们是否有效: 任务: id=exp 表达方式: id op id{op id} id是数字和字符的组合,第一个位置包含字符 当我的in.txt文件中出现类似这样的内容时,就会出现语法错误:hellow=three3 但这不应该是一个语法错误,然后当我放入如下内容:hellow== 这不会显示语法错误,但应该显示。我做错了什么 法律: %{ #包括“y.tab.h” #包括 %} %% [\t\n]+; [a-zA-Z][a-zA-Z0-9]*{ 回声; 返回I

我试图根据以下规则分析语句,以查看它们是否有效:

任务: id=exp

表达方式: id op id{op id}

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

当我的in.txt文件中出现类似这样的内容时,就会出现语法错误:hellow=three3

但这不应该是一个语法错误,然后当我放入如下内容:hellow==

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

法律:

%{
#包括“y.tab.h”
#包括
%}
%%
[\t\n]+;
[a-zA-Z][a-zA-Z0-9]*{
回声;
返回ID;
}
%%
雅克:

%{
#包括
外部文件*yyin;
%}
%令牌ID
%左'+''-'
%左'*''/''%
%对‘;’
%%
赋值:表达式
|
ID“=”表达式
;
表达式:ID
|
表达式“*”表达式
|
表达式“/”表达式
|
表达式“%”表达式
|
表达式“+”表达式
|
表达式'-'表达式
|
“(“表达式”)”
;
%%
内部主(空){
yyin=fopen(“in.txt”,“r”);
yyparse();
fclose(yyin);
返回0;
}

我不能仅从这一点来判断,但一个很好的方法是在环境变量YYDEBUG为1时运行解析器,如(unix):


您应该获得解析器所采取的步骤的详细列表,以及它从lexer接收到的标记(在大多数情况下,错误都在这里,就像在您的示例中:解析器如何获得“=”符号和运算符?)。将此文件与运行
yacc-v

时得到的y.output文件进行比较,我已经定义了运算符,现在似乎可以工作了,谢谢!
%{
#include "y.tab.h"
#include <stdio.h>
%}
%%
[ \t\n]+                ;
[a-zA-Z][a-zA-Z0-9]*    {
                        ECHO;
                        return ID;
                    }
%%
%{
#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;
}
YYDEBUG=1 ./a.out