我在Flex / Bison中编写一个允许变量的计算器。现在我只有一个你可以使用的变量(x)。我希望能够使用的不仅仅是x。 (而非a-z)。有人可以帮忙吗?这就是我到目前为止所拥有的:
Calculator.y
%{
#include <stdio.h>
#include <math.h>
void yyerror(char *);
int yylex(void);
int symbol;
%}
%token INTEGER VARIABLE
%left '+' '-' '*' '/' '^'
%%
program:
program statement '\n'
| /* NULL */
;
statement:
expression { printf("%d\n", $1); }
| VARIABLE '=' expression { symbol = $3; }
;
expression:
INTEGER
| VARIABLE { $$ = symbol; }
| '-' expression { $$ = -$2; }
| expression '+' expression { $$ = $1 + $3; }
| expression '-' expression { $$ = $1 - $3; }
| expression '*' expression { $$ = $1 * $3; }
| expression '/' expression { $$ = $1 / $3; }
| expression '^' expression { $$ = pow($1, $3); }
| '(' expression ')' { $$ = $2; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int main(void) {
yyparse();
}
calculator.l
/* calculator */
%{
#include "y.tab.h"
#include <math.h>
#include <stdlib.h>
void yyerror(char *);
%}
%%
[x] {
yylval = *yytext - 'a';
return VARIABLE;
}
[0-9]+ {
yylval = atoi(yytext);
return INTEGER;
}
[-+*/^()=\n] { return *yytext; }
[ \t] ; /* skip whitespace */
. yyerror("Unknown Character");
%%
int yywrap(void) {
return 1;
}
答案 0 :(得分:1)
您的词霸需要识别[a-z]
,而不仅仅是[x]
。
在语法中,您需要定义一个数组int variables[26];
在分配了VARIABLE
的规则中,分配给variables[$1]
(例如)并引用VARIABLE,使用$$ = variables[$1];
(例如)。检查n
中的$n
是否为正确值。