Compiler construction 用于布尔运算的Lex/Yacc

Compiler construction 用于布尔运算的Lex/Yacc,compiler-construction,yacc,lex,Compiler Construction,Yacc,Lex,我正试图编写一个程序,用Lex/Yacc计算一个NAND布尔表达式 例如,如果输入为“真与非(假与非真)”,我的程序应该打印“假” 这就是我到目前为止所做的,但我真的被卡住了 我错过了什么或做错了什么 布尔型 布尔.y %token BOOL NAND %左与非门 %% boolexp:boolexp和boolterm{$$=!($1&&$3);} |boolterm{$$=$1;} ; boolterm:“('boolexp')” |BOOL{$$=(strcmp($1,“true”)?1:0

我正试图编写一个程序,用Lex/Yacc计算一个NAND布尔表达式

例如,如果输入为“真与非(假与非真)”,我的程序应该打印“假”

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

我错过了什么或做错了什么

布尔型 布尔.y
%token BOOL NAND
%左与非门
%%
boolexp:boolexp和boolterm{$$=!($1&&$3);}
|boolterm{$$=$1;}
;
boolterm:“('boolexp')”
|BOOL{$$=(strcmp($1,“true”)?1:0;}
;
%%
#包括
内部主(空){
yyparse();
}

如果您将
TRUE
FALSE
作为两个单独的标记,您将有更轻松的时间

%token TRUE FALSE NAND
%left NAND

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

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

bool: TRUE {$$ = 1;}
    | FALSE ($$ = 0;}
;

strcmp
如果所比较的值相等,则返回0。你的三元陈述是反向的。
%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();
}
%token TRUE FALSE NAND
%left NAND

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

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

bool: TRUE {$$ = 1;}
    | FALSE ($$ = 0;}
;