Калькулятор с несколькими переменными Flex/Bison

Я пишу калькулятор на Flex/Bison, который позволяет использовать переменные. Прямо сейчас у меня есть только одна переменная (x), которую вы можете использовать. Я хочу иметь возможность использовать больше, чем просто x. (скорее как аз). Кто-нибудь может помочь? Вот что у меня есть до сих пор:

Калькулятор.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();
}

калькулятор.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;
}

person Nelson.b.austin    schedule 31.01.2014    source источник


Ответы (1)


Ваш лексер должен распознавать [a-z], а не только [x].

В грамматике вам нужно определить массив int variables[26];

В правилах, где назначено VARIABLE, назначьте variables[$1] (например), а там, где есть ссылка на ПЕРЕМЕННУЮ, используйте $$ = variables[$1]; (например). Убедитесь, что n в $n является правильным значением.

person Jonathan Leffler    schedule 01.02.2014