首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >yacc -如何执行if条件

yacc -如何执行if条件
EN

Stack Overflow用户
提问于 2012-02-09 21:22:30
回答 1查看 7.5K关注 0票数 1

我试图从输入文件中执行一个简单的if条件。

我会有这样的东西

代码语言:javascript
复制
if(color = black)

不管我做什么,我总是得到1班/减少,我对lex和yacc非常陌生,YACC语法经常有移位-减少冲突吗?我不应该担心他们吗?

我的lex文件将正确地返回文件中的每个字符,所以我不会向您显示lex文件。

但是,这里是我的yacc文件:

代码语言:javascript
复制
%{

#include <ctype.h>
#include <stdio.h>

%}
 |IF LPAREN COLOR EQ BLACK RPAREN  {$$ = $1;  printf("WONT COMPILE\n");} 
     ;

在yacc文件中,我尝试了这样的方法,但这就是我要转换/减少的地方。

代码语言:javascript
复制
IF LPAREN COLOR EQ BLACK RPAREN {$$ = $1;  printf("If statement\n");} 

解出

EN

回答 1

Stack Overflow用户

发布于 2012-02-09 23:34:06

我最初写了一个关于“悬空的其他”歧义的长篇大论,但后来我仔细研究了一下你的语法。让我们将其缩小到适当的大小,并演示问题所在:

代码语言:javascript
复制
%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?

你会想从头开始重写这个。一开始很简单:

代码语言:javascript
复制
%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并添加如下规则

代码语言:javascript
复制
if  : IF   { printf("%s\n", "IF"); }
    ;
then: THEN { printf("%s\n", "THEN"); }
    ;

开始简单,慢慢地添加,当规则变得太多毛或重复时重构。在进入一个大型项目之前,先阅读一篇教程。GNU野牛手册有一个很好的教程,Kernighan &Pike的http://en.wikipedia.org/wiki/The_Unix_Programming_Environment也是如此。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9218999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档