2017-02-19 76 views
0

的一部分,我是新來使用Flex和野牛我實現了一個簡單的計算器。我試圖確定輸入是否是語法中的一個句子。flex和野牛如何確定句子語法是

例如,如果我輸入:A = 2; b = 3;打印a + b;

這將返回:「A = 2; B = 3;打印A + B;是一句」

現在它會怎麼做的計算器,但我不關心實際計算我只是想知道輸入是否是語法中的一個句子。

我真的不知道如何去這樣做。任何幫助或提示將不勝感激。

我的Flex代碼是:

%{ 
     #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的返回碼。