2017-02-19 6 views
0

フレックスとバイソンを使い慣れていない簡単な電卓を実装しました。私は入力が文法の文であるかどうかを判断しようとしています。フレックスとバイソン文が文法の一部であるかどうかを判断する方法

たとえば、次のように入力します。a = 2; b = 3; a + bを印刷します。

それは返します:「A = 2; B = 3;プリントA + Bは、文である」

今のところは、実際に計算を行いますが、私は実際の計算ちょうど私を気にしません入力が文法の文であるかどうかを知りたい

私はこれをやってどうやって行くのかは分かりません。どんな助けやヒントも感謝します。

マイフレックスコード:

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

(全体の)入力が文法と一致した場合バイソン戻り0によって生成yyparse機能、及び1の場合が構文エラーでした。 (また、文法を解析しようとしてメモリが不足していることを示すために2を返すこともできますが、yacc互換モードを使用している場合を除き、まれです。)

したがって、あなたのバイソンプロダクションからの行動。入力を解析して、yyparseからの戻りコードをチェックすることができます。

関連する問題