2017-02-19 3 views
0

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

Например, если я ввожу: a = 2; b = 3; напечатать a + b;

Он вернется: «а = 2; б = 3; печать а + б, это предложение»

Прямо сейчас это будет на самом деле сделать калькулятор, но я не забочусь о фактическом расчете я просто хотите знать, является ли ввод предложением в грамматике.

Я не уверен, как это сделать. Любая помощь или подсказки будут оценены.

Мой гибкий код:

%{ 
     #include "y.tab.h" 
     #include <stdlib.h> 
     void yyerror(char *); 
    %} 

    %% 

    [a-z]  { 
        yylval = *yytext - 'a'; 
        return VARIABLE; 
       } 

    [0-9]+  { 
        yylval = atoi(yytext); 
        return INTEGER; 
       } 

    [-()+=/^*;]  { return *yytext; } 

    "print"   return PRINT; 

    [ \t] ;  /* skip whitespace */ 

    .    yyerror("invalid characters."); 

    %% 

    int yywrap(void) { 
     return 1; 
    } 

Мой бизон код:

%{ 
     #include <stdio.h> 
     #include <math.h> 
     void yyerror(char *); 
     int yylex(void); 
     char *in; 
     int sym[26]; 
    %} 

    %token INTEGER VARIABLE PRINT 
    %left '+' '-' 
    %left '*' '/' 
    %right '^' 

    %% 

    program: 
      program statement    { }  
      | /* NULL */     { } 
      ; 

    statement: 
      ';'       { $$ = ';'; } 
      | expression ';'    { $$ = $1; } 
      | VARIABLE '=' expression ';' { sym[$1] = $3; } 
      | PRINT expression ';'   { printf("%d\n", $2); } 
      ; 

    expression: 
      INTEGER 
      | VARIABLE      { $$ = sym[$1]; } 
      | expression '+' expression  { $$ = $1 + $3; } 
      | expression '-' expression  { $$ = $1 - $3; } 
      | expression '*' expression  { $$ = $1 * $3; } 
      | expression '/' expression  { $$ = $1/$3; } 
      | expression '^' expression  { $$ = pow($1,$3); } 
      | '(' expression ')'   { $$ = $2; } 
      | '-' expression    { $$ = -$2; } 
      ; 

    %% 

    void yyerror(char *s) { 
     fprintf(stderr, "%s\n", s); 
    } 

    int main(void) { 
     while (1) { 
      yyparse(); 
     } 
    } 

ответ

2

yyparse функция генерируется бизонов возвращает 0, если (весь) вход соответствовал грамматику, и 1, если существует была синтаксическая ошибка. (Он также может возвращать 2, чтобы указать, что у него закончилась память, пытаясь разобрать грамматику, но это редко, если вы не используете режим, совместимый с yacc.)

Так что если вы просто хотите проверить правильность, удалите все действия ваших бизонов; то вы можете проанализировать ввод и проверить код возврата с yyparse.

Смежные вопросы