Compiler construction 用于布尔运算的Lex/Yacc
我正试图编写一个程序,用Lex/Yacc计算一个NAND布尔表达式 例如,如果输入为“真与非(假与非真)”,我的程序应该打印“假” 这就是我到目前为止所做的,但我真的被卡住了 我错过了什么或做错了什么 布尔型 布尔.yCompiler 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
%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;}
;