我试图从输入文件中执行一个简单的if条件。
我会有这样的东西
if(color = black)不管我做什么,我总是得到1班/减少,我对lex和yacc非常陌生,YACC语法经常有移位-减少冲突吗?我不应该担心他们吗?
我的lex文件将正确地返回文件中的每个字符,所以我不会向您显示lex文件。
但是,这里是我的yacc文件:
%{
#include <ctype.h>
#include <stdio.h>
%}
|IF LPAREN COLOR EQ BLACK RPAREN {$$ = $1; printf("WONT COMPILE\n");}
;在yacc文件中,我尝试了这样的方法,但这就是我要转换/减少的地方。
IF LPAREN COLOR EQ BLACK RPAREN {$$ = $1; printf("If statement\n");} 解出
发布于 2012-02-09 23:34:06
我最初写了一个关于“悬空的其他”歧义的长篇大论,但后来我仔细研究了一下你的语法。让我们将其缩小到适当的大小,并演示问题所在:
%token IF COLOR BLACK
%%
statement
: statement command
| /*nothing*/
;
command
: IF {$$ = $1; printf ("IF\n");}
| ELSE {$$ = $1; printf("ELSE\n");}
| EQ {$$ = $1; printf("EQ\n");}
| THEN {$$ = $1; printf("THEN\n");}
| LPAREN {$$ = $1; printf("LPAREN\n");}
| RPAREN {$$ = $1; printf("RPAREN\n");}
| COLOR EQ BLACK {$$ = $3; printf("color is black\n");}
| IF LPAREN COLOR EQ BLACK RPAREN {$$ = $1; printf("WONT COMPILE\n");}
;您期望如何解析if(color = black)语句?请注意,“color = black”可以通过COLOR EQ BLACK还原为command,也可以“移动”到堆栈上,从而成为更长的解析IF LPAREN COLOR EQ BLACK RPAREN的一部分。
这就解释了你收到的具体警告。现在,讲到你的语法的其余部分:
你不想写你的语法,所以不完整的陈述是有意义的。注意,单个符号“=”是一个完全有效的command,因此是一个真正想要的完全有效的statement-is?
你会想从头开始重写这个。一开始很简单:
%token NUMBER COMMAND IF THEN ELSE COLOR BLACK
%%
statement
: COMMAND NUMBER
| IF cond THEN statement
| /* nothing */
;
cond
: '(' COLOR '=' BLACK ')'
;没有经过测试,但这应该足以让您开始工作。如果遇到令牌时需要做一些事情,可以(例如)用if cond then command替换if cond then command并添加如下规则
if : IF { printf("%s\n", "IF"); }
;
then: THEN { printf("%s\n", "THEN"); }
;开始简单,慢慢地添加,当规则变得太多毛或重复时重构。在进入一个大型项目之前,先阅读一篇教程。GNU野牛手册有一个很好的教程,Kernighan &Pike的http://en.wikipedia.org/wiki/The_Unix_Programming_Environment也是如此。
https://stackoverflow.com/questions/9218999
复制相似问题