我是使用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();
}
}
答案 0 :(得分:2)
如果(整个)输入与语法匹配,则bison生成的yyparse
函数返回0,如果存在语法错误,则返回1。 (它也可以返回2表示内存试图解析语法,但除非你使用yacc兼容模式,否则这种情况很少见。)
因此,如果您只想检查正确性,请删除您的野牛制作中的所有操作;然后你可以解析输入并检查yyparse中的返回码。