Использование yacc для вывода логических выражений - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь выучить этот язык на уроках в колледже, и наш учитель дал нам подсказку попробовать. По сути, мы должны взять логическое выражение и вывести его, если это выражение истинно или ложно. Входные данные будут иметь формат: 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. В принципе, если я добавлю что-то, кроме одного термина, программа выдаст ошибку.

...