Как мне представить следующее в flex и bison? - PullRequest
0 голосов
/ 12 февраля 2020

Я использую следующую грамматику для представления сложения, умножения чисел

Stmts->epsilon|Stmt

E->Integer|Id|E*E|E+E

Integer -> digit+

Выражение может быть уменьшено до выражения или числа или числа * Число или число + число

Целое число может принимать одно или более цифр

Id может быть переменной, которая должна начинаться со строчной буквы, за которой следует любое количество строчных букв или цифр

Но я также хочу представить

Stmt -> Id = E | Id*=E | Id+=E |print E

Следующая грамматика

stmt: 
| stmt expr_stmt

;

expr_stmt:
   expr TOK_SEMICOLON
   | TOK_PRINTLN expr TOK_SEMICOLON 
    {
        fprintf(stdout, "the value is %d\n", $2);
    }
|expr 
;



expr:
    expr TOK_ADD expr
   {
    $$ = $1 + $3;
   }
 | expr TOK_SUB expr
  {
    $$ = $1 - $3;
  }
 | expr TOK_MUL expr
  {
    $$ = $1 * $3;
  }
 | expr TOK_DIV expr
  {
 if($3 == 0) 
   yyerror("divide by zero");
 else
      $$ = $1 / $3; 
  }
 | TOK_NUM
  {     
    $$ = $1;
  }
| TOK_ID
| TOK_MUL TOK_EQ expr
| TOK_ADD TOK_EQ expr

;

Показывает конфликты сдвига / уменьшения.

...