[英]LEX & YACC - spaces in expressions
我正在阅读一个文件,由于某种原因,当我尝试像5+5
这样的表达式时,我得到语法错误但是,如果我这样做5 + 5
它运作良好。 我很困惑为什么会这样做?
这是我的lex文件(我将遗漏读取文件的主文件):
%{
#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文件中吗?
tokenizer(lexer)将这两个返回给解析器: 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
;
这将允许在任何数字之前使用一元+
或-
同时仍然给予运算符+
和-
更高的优先级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.