If statement yacc-如何执行if条件
我试图从输入文件中执行一个简单的if条件 我要一份类似的If statement yacc-如何执行if条件,if-statement,grammar,yacc,If Statement,Grammar,Yacc,我试图从输入文件中执行一个简单的if条件 我要一份类似的 if(color = black) 无论我做什么,我总是得到一班/减一班 我对莱克斯和亚克很陌生 YACC语法经常有移位减少冲突吗?我应该不担心他们吗 我的lex文件将正确返回文件中的每个字符,因此我不会向您显示lex文件 但是,以下是我的yacc文件: %{ #include <ctype.h> #include <stdio.h> %} |IF LPAREN COLOR EQ BLACK RPAREN
if(color = black)
无论我做什么,我总是得到一班/减一班
我对莱克斯和亚克很陌生
YACC语法经常有移位减少冲突吗?我应该不担心他们吗 我的lex文件将正确返回文件中的每个字符,因此我不会向您显示lex文件 但是,以下是我的yacc文件:
%{
#include <ctype.h>
#include <stdio.h>
%}
|IF LPAREN COLOR EQ BLACK RPAREN {$$ = $1; printf("WONT COMPILE\n");}
;
解决了我最初写了一个关于“悬而未决的其他”歧义的长答案,但后来我仔细研究了你的语法。让我们将其缩小一点,并演示问题所在:
%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
简化为命令,或者如果LPAREN color EQ black RPAREN
,可以“移动”到堆栈上,成为较长解析的一部分
这就解释了你得到的具体警告。现在,让我们来看看剩下的语法:
你不想写语法,所以不完整的语句是有意义的。请注意,单个符号“=
”是一个完全有效的命令
,因此是一个完全有效的语句
——这真的是您想要的吗
你会想从头重写这个。从简单开始:
%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"); }
;
从简单开始,慢慢添加,当规则变得过于复杂或重复时重构。在你开始一个大项目之前,先完成一个教程。和Kernighan&Pike的一样,YACC有一个很好的教程。YACC语法通常有shift-reduce冲突,但它选择了shift(这通常是正确的行为)。不要太担心它们。当我执行yacc-d programName.y时,就遇到了冲突:shift/reduce,然后我自然认为它不会编译。它仍在抱怨,但起作用。感谢you@icelated,请不要在标题中加“[已解决]”:要么接受答案,要么如果没有正确答案,你可以回答(并接受)你自己的问题。谢谢。我以后再看你的东西。就我所见,它看起来不错。
if : IF { printf("%s\n", "IF"); }
;
then: THEN { printf("%s\n", "THEN"); }
;