If statement yacc-如何执行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条件

我要一份类似的

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"); }
    ;