2017-02-19 2 views
0

Je suis nouveau à l'utilisation de flex et bison J'ai mis en place une calculatrice simple. J'essaie de déterminer si une entrée est une phrase dans la grammaire.flex et bison comment déterminer si la phrase fait partie de la grammaire

Par exemple si j'entre: a = 2; b = 3; imprimer a + b;

Il retourne: « a = 2; b = 3, l'impression a + b, est une phrase »

En ce moment, il le fera en fait la calculatrice mais je ne se soucient pas du calcul réel que je viens vouloir savoir si l'entrée est une phrase dans la grammaire.

Je ne sais pas trop comment faire. Toute aide ou conseil serait apprécié.

mon code flex est:

%{ 
     #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; 
    } 

Mon code Bison est:

%{ 
     #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(); 
     } 
    } 

Répondre

2

La fonction yyparse généré par les rendements de bison 0 si l'entrée (entier) correspondait à la grammaire, et 1 si était une erreur de syntaxe. (Il peut aussi retourner 2 pour indiquer qu'il manque de mémoire pour essayer d'analyser la grammaire, mais c'est rare sauf si vous utilisez le mode compatible yacc.)

Donc, si vous voulez juste vérifier l'exactitude, les actions de vos productions de bisons; alors vous pouvez analyser l'entrée et vérifier le code de retour de yyparse.