flex和bison如何判断句子是否是语法的一部分

时间:2017-02-19 19:22:11

标签: bison flex-lexer yacc lex

我是使用flex和bison的新手我已经实现了一个简单的计算器。我试图确定输入是否是语法中的句子。

例如,如果我输入: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();
       }
   }

1 个答案:

答案 0 :(得分:2)

如果(整个)输入与语法匹配,则bison生成的yyparse函数返回0,如果存在语法错误,则返回1。 (它也可以返回2表示内存试图解析语法,但除非你使用yacc兼容模式,否则这种情况很少见。)

因此,如果您只想检查正确性,请删除您的野牛制作中的所有操作;然后你可以解析输入并检查yyparse中的返回码。