Also meine Grammatik unten 'funktioniert'. Allerdings hat es eine kleine Einschränkung jetzt kann ich Sachen machen wieBison Grammatik für grundlegende Rechner Ausgabe
1.0-----------------2.0
und es wird Flop Flip zwischen 2 und -2 bis sie dann auswerten wird auf 1 op 2 bekommen. Bison noch neu und unklar, wie es am besten ist, eine Lösung dafür zu implementieren. Ich habe eine Idee im Sinn, einen Fehler mit jeder Kombination von '+' '- in Schritten von 3 zu erzeugen, aber das sind 8 Grammatikregeln und ich bin mir nicht einmal sicher, wie man einen Fehler in Bison wirft. Ich kann mir vorstellen, dass es einen saubereren, verständlicheren Weg gibt, dies zu tun.
Flex Lexer
%option nounistd
%option noyywrap
%{
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include "parser.tab.h"
#define isatty _isatty
#define fileno _fileno
%}
%%
[ \t]+
\n {return '\n';}
[0-9]+(\.[0-9]+)? {yylval.number=atof(yytext); return NUMBER;}
. {return yytext[0];}
%%
Bison Grammar
%{
#include <stdio.h>
#include <math.h>
extern int yylex(void);
int yyerror(const char* c) { printf("%s\n",c); return 0;}
%}
%union
{
double number;
}
%type <number> exp
%token <number> NUMBER
%left '+' '-'
%left '*' '/'
%right '^'
%start commands
%%
commands
: /*empty*/
| commands line
;
line
: '\n'
| exp '\n' {printf("=%f\n",$1);}
| error '\n' {printf("encountered an error!\n");}
;
exp
: NUMBER { $$ = $1;}
| exp '+' exp {$$ = $1 + $3;}
| exp '-' exp {$$ = $1 - $3;}
| exp '*' exp {$$ = $1 * $3;}
| exp '/' exp {$$ = $1/$3;}
| exp '^' exp {$$ = pow($1,$3);}
| '-' exp {$$ = -$2;}
| '+' exp {$$ = $2;}
| '(' exp ')' {$$ = $2;}
;
%%
Scheint, dass dies das richtige Verhalten für mich ist. Sind Sie sicher, dass dies ein Problem ist? Ich habe gerade Ihren Ausdruck in Python 2.7 ausprobiert und verhält sich genauso. –
Es ist "richtiges Verhalten" gemäß der Grammatik, wenn es nicht für die Operatoren ++ oder - war. Ich würde es gerne "nicht das richtige Verhalten" machen, nur als Test, um zu sehen, wie man etwas komplexere Grammatikregeln implementiert. Leider machte meine Neuheit selbst diese einfache Aufgabe schwierig. Ich würde gerne eine Angemessenheit für die Grammatik durchsetzen. Ich fange tatsächlich an zu glauben, dass der Lexer darin einfacher sein könnte. Etwas wie [+ -] {3} {return ERROR;}. – user2927848
Wie erhälst du tatsächlich einen Fehler in Bison? – user2927848