c - LEX & YACC - 表达式中的空格

标签 c regex yacc lex

我正在读取一个文件,由于某种原因,当我尝试一个表达式时出现语法错误 像 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/

相关文章:

makefile - make file : yacc command not found and [y. tab.c] 安装 Bison 后出现错误 127

java - 使用 yacc 文件检测 Java 文本区域中的语法错误

php - 如何将组与 preg_match 一起使用?

c - 在 C 中将不同的输入分配给不同的结构变量

c - 如何将被调用函数的值返回给 main?

c - 为什么微软将他们的函数调用写在多行上?

c# - 在c#中通过正则表达式提取多个字符串

c# - 从逗号分隔的数字列表中删除数字

python - 如何从单独的文件运行解析器?

C - ncurses 和两个并发线程