Parsing lex/yacc中表达式的解析器
我试图根据以下规则分析语句,以查看它们是否有效: 任务: id=exp 表达方式: id op id{op id} id是数字和字符的组合,第一个位置包含字符 当我的in.txt文件中出现类似这样的内容时,就会出现语法错误:hellow=three3 但这不应该是一个语法错误,然后当我放入如下内容:hellow== 这不会显示语法错误,但应该显示。我做错了什么 法律: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
%{
#包括“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