Я пытаюсь выучить этот язык на уроках в колледже, и наш учитель дал нам подсказку попробовать. По сути, мы должны взять логическое выражение и вывести его, если это выражение истинно или ложно. Входные данные будут иметь формат: true и (false или true) или false.
Я говорил со своим профессором о многих решениях, и он хочет, чтобы класс делал токены для AND ИЛИ TRUE FALSE. Он также хочет, чтобы мы использовали логические операторы в файле yacc вместо токенов, IE ||, &&,!.
test.l
%{
#include "y.tab.h"
%}
AND [Aa][Nn][Dd]
OR [Oo][Rr]
NOT [Nn][Oo][Tt]
op '&' | '|' | "!"
%%
[a-zA-Z] {return ALPHA;}
[\t]+ ;
[\n] {return '\n';}
{AND} { return (AND); }
{OR} { return (OR); }
{NOT} { return (NOT); }
[Tt][Rr][Uu][Ee] { yylval = 1;
return (boolean); }
[Ff][Aa][Ll][Ss][Ee] { yylval = 0;
return (boolean); }
. {();}
%%
test.y
%{
#include<stdio.h>
#include<stdlib.h>
int yylex();
%}
%token ALPHA AND OR NOT TRUE FALSE boolean
%left "&" "|"
%right '!'
%%
program: bexpr '\n' {if ($1 >= 1)
{
printf("TRUE\n");
exit(0);
}
else{
printf("FALSE\n");
exit(0);
}
|
;
bexpr: bexpr "|""|" bterm { $$ = $1 || $3; }
| bterm { $$ = $1; }
;
bterm: bterm "&""&" bfactor { $$ = $1 && $3; }
| bfactor { $$ = $1; }
;
bfactor: '!' bfactor { $$ = ! $2; }
| '(' bexpr ')' { $$ = $2; }
| TRUE { $$ = $1; }
| FALSE {$$ = $1; }
| boolean { $$ = $1; }
;
%%
int main()
{
printf("Enter your truth statement\n");
yyparse();
return 0;
}
Если бы я вставил в true и false, ожидал быложный. Однако я получаю синтаксическую ошибку. Если я введу только true, вывод верен, то же самое для false. В принципе, если я добавлю что-то, кроме одного термина, программа выдаст ошибку.