多变量计算器Flex / Bison

时间:2014-01-31 21:18:12

标签: variables calculator bison flex-lexer lexical-analysis

我在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;
}

1 个答案:

答案 0 :(得分:1)

您的词霸需要识别[a-z],而不仅仅是[x]

在语法中,您需要定义一个数组int variables[26];

在分配了VARIABLE的规则中,分配给variables[$1](例如)并引用VARIABLE,使用$$ = variables[$1];(例如)。检查n中的$n是否为正确值。