首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于布尔计算的Lex/Yacc

用于布尔计算的Lex/Yacc
EN

Stack Overflow用户
提问于 2014-03-04 02:24:31
回答 1查看 4.6K关注 0票数 0

我正在尝试编写一个使用Lex/Yacc计算NAND布尔表达式的程序。

例如,如果输入是"true nand (false nand true)“,我的程序应该打印"false”

这就是我到目前为止所拥有的,但我真的被卡住了

我遗漏了什么或做错了什么?

boolean.l

代码语言:javascript
运行
复制
%{
#include "y.tab.h"
%}


%%
"true"|"false" {return BOOL;}
"nand"         {return NAND;}
[()]           {return yytext[0];}

%%

boolean.y

代码语言:javascript
运行
复制
%token BOOL NAND
%left NAND

%%
boolexp: boolexp NAND boolterm    {$$ = !($1 && $3);}
        | boolterm    {$$=$1;}
;

boolterm: '(' boolexp ')'
        | BOOL  {$$ = (strcmp($1, "true")) ? 1 : 0;} 
;

%%
#include <lex.yy.c>

int main(void) {
        yyparse();
}
EN

回答 1

Stack Overflow用户

发布于 2014-03-04 03:33:33

如果您将TRUEFALSE作为两个不同的标记,您会轻松得多。

代码语言:javascript
运行
复制
%token TRUE FALSE NAND
%left NAND

%%
boolexp: boolexp NAND boolterm    {$$ = !($1 && $3);}
        | boolterm    {$$=$1;}
;

boolterm: '(' boolexp ')' {$$ = $2;}
        | bool  {$$ = $1;}
;

bool: TRUE {$$ = 1;}
    | FALSE ($$ = 0;}
;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22154353

复制
相关文章

相似问题

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