2017-02-19 97 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的返回码。