2014-03-03 4 views
0

Я пытаюсь написать программу для вычисления булевского выражения NAND с использованием Lex/Yacc.Lex/Yacc для логического вычисления

Например, если вход «истинно NAND (ложь правда NAND),» моя программа должна печатать «ложь»

Это то, что я до сих пор ,, но я действительно застрял

Что я пропадаю или делаю неправильно?

boolean.l

%{ 
#include "y.tab.h" 
%} 


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

%% 

boolean.y

%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(); 
} 
+0

'strcmp' возвращает 0, если сравниваемые значения равны. Ваше тернарное заявление обратное. – Josh

ответ

1

Вы бы намного легче, если вы сделали 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;} 
; 
Смежные вопросы