Калкулатор с множество променливи Flex/Bison

Пиша калкулатор във Flex/Bison, който позволява променливи. В момента имам само една променлива (x), която можете да използвате. Искам да мога да използвам повече от просто x. (По-скоро като a-z). Може ли някой да помогне? Ето какво имам досега:

Калкулатор.г

%{
    #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 */
%{
    #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] (например) и където се посочва VARIABLE, използвайте $$ = variables[$1]; (например). Проверете дали n в $n е правилната стойност.

person Jonathan Leffler    schedule 01.02.2014