我正在读取一个文件,由于某种原因,当我尝试一个表达式时出现语法错误
像 5+5
但是,如果我这样做 5 + 5
它效果很好。我很困惑为什么它会这样做?
这是我的 lex 文件(我将省略读入文件的 main):
%{
#include "y.tab.h"
#include "stdio.h"
#include <stdlib.h>
%}
%%
(\/\*([^*]|(\*+([^*/]|[\r\n])))*\*+\/)+ {}
\/\/[^\n]*\n {}
fd { return FD; }
[\r\t\n]+ {}
[ ]* {}
bk { return BK;}
setc {return SETC;}
[-+]?[0-9]+ { yylval = atoi(yytext); return NUMBER;}
fd[0-9]+ { }
rt {return RT;}
pink {return COLOR_TYPE;}
magenta {return COLOR_TYPE; }
if {return IF; }
ifelse {return IFELSE; }
\[ {return LBRACKET; }
\] {return RBRACKET; }
\< {return LESS_THAN; }
\> {return GREATER_THAN; }
\+ {return PLUS; }
\- {return MINUS; }
\/ {return DIVIDE; }
\* {return MULT; }
\( {return LPAREN;}
\) {return RPAREN;}
\= {return EQ;}
%%
这是处理表达式的部分 yacc 文件:
expr : NUMBER { printf("EXPR-->NUMBER: %d\n", $1);}
|expr PLUS expr {$$ = $1 + $3; printf("EXPR-->expression PLUS expression: %d\n", $$);}
|expr DIVIDE expr {$$ = $1 / $3; printf("EXPR-->expression DIVIDE expression %d\n", $$);}
|expr MULT expr {$$ = $1 * $3; printf("EXPR-->expression MULTIPLY expression %d\n", $$);}
|expr MINUS expr {$$ = $1 - $3; printf("EXPR-->expression MINUS expression %d\n", $$);}
|COLOR_TYPE {printf("EXPR-->COLOR\n");}
;
问题会在 lex 文件中吗?
最佳答案
分词器(词法分析器)将这两个返回给解析器:5
和 +5
。根据你的语法(逻辑上)这是无效的。
我认为,您最好更改词法分析器并将运算符规则向上移动。 (这意味着至少高于返回 NUMBER
的规则)。
编辑:经过一些思考(编辑 #2: 以及 Jerry Coffin 的非常有用的评论),我建议更改 NUMBER< 的词法规则
到 [0-9]+
。为了让解析器仍然接受像“+123”或“-123”这样的输入,你应该把它添加到你的语法中:
%left PLUS MINUS ...
%right UNARY
%%
expr : number
| expr PLUS expr
...
;
number : PLUS NUMBER %prec UNARY {$$ = $2}
| MINUS NUMBER %prec UNARY {$$ = -$2}
| NUMBER
;
这将允许在任何数字之前使用一元 +
或 -
,同时仍然提供运算符 +
和 -
更高的优先级。
关于c - LEX & YACC - 表达式中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9317175/