Parser meldet nach zwei Zeichen Syntaxerror
-
Hallo,
ich muss für die Uni einen Compiler schreiben und versuche momentan mit Bison einen Parser zu erstellen. Da ich mit Bison noch nicht so vertraut bin habe ich versucht erst einmal nur Zahlen zu erkennen, was auch soweit funktioniert, allerdings meldet er immer nachdem er zwei Zahlen eingelesen hat einen Fehler. Hat einer eine Idee woran das liegen könnte?Hier ist die Bisondatei:
%{ /* * parser.y -- SPL parser specification */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "common.h" #include "utils.h" #include "scanner.h" #include "parser.h" %} %union { NoVal noVal; IntVal intVal; StringVal stringVal; } %token ARRAY %token ELSE %token IF %token OF %token PROC %token REF %token TYPE %token VAR %token WHILE %token LPAREN %token RPAREN %token LBRACK %token RBRACK %token LCURL %token RCURL %token EQ %token NE %token LT %token LE %token GT %token GE %token ASGN %token COLON %token COMMA %token SEMIC %token PLUS %token MINUS %token STAR %token SLASH %token IDENT %token INTLIT %token HASH /* %start program */ %start stmt %% exp: INTLIT ; stmt: exp //| if_stmt ; /*program : ARRAY ;*/ %% void yyerror(char *msg) { error("%s in line %d", msg, yylval.noVal.line); }
Und so sieht die Testdatei aus:
22 33 5565
2234Die 22 und 33 wird erkannt, danach Fehler.
Gruß
Pierre
-
Da ich mit Bison noch nicht so vertraut bin habe ich versucht
Arbeite doch erstmal das entsprechende Tutorial durch, falls noch nicht geschehen. (Auch wie lex mit eingebaut wird.) Ansonsten: Wie sieht der regulaere Ausdruck fuer das Token INTLIT aus?
-
Das ging ja schnell.
{number} { printf("NUMBER:%s\n",yytext); yylval.stringVal.line = lineNumber; yylval.stringVal.val = yytext; return (INTLIT); } digit [0-9] number {digit}+|(0x[0-9|a-f|A-F]*)|['][A-Z|a-z][']
Das Erkennen funktioniert problemlos.
-
Meinst du mit "erkannt", dass die Regel im Scanner ausgeführt, also "NUMBER: ..." ausgegeben wird? Der Parser kann nämlich nur eine Zahl erkennen, deine Grammatik sieht das so vor. Die einzige mögliche Ableitung ist stmt => exp => INTLIT.
-
Genau das wenn ich das Programm laufen lasse kommt folgende Ausgabe:
Number: 5333
Number: 2
Error: syntax error in line 4Die Datei hat folgenden Inhalt:
5333 2
56333
-
Gut, mich wundert es, dass er nicht schon nach der ersten Zahl abbricht. Du spezifizierst mit
stmt -> exp exp -> INTLIT
eine Grammatik fuer eine Sprache. Diese Grammatik dient dazu, Woerter der Sprache zu erkennen. Sie enthaelt in deinem speziellen Fall alle Strings, die die Form von Zahlen hat. Also ist z.B. '22' Element dieser Sprache. Aber nicht '22 22', weil diese nicht durch die Grammatik beschrieben wird.
stmt -> INTLIT INTLIT
Das wuerde eine Sprache beschreiben, die '22 22' erkennen wuerde (naja, k.A. wie das Leerzeichen interpretiert wird). Bison nimmt immer den ganzen String, bzw. alle geworfenen Token. Fuer z.B. beliebig viele Zahlen lohnt es, sich tiefer mit Grammatiken und Sprachen (Theoretische Informatik) zu beschaeftigen.
-
Jetzt habe ich den Fehler.
Ich werde mich wohl noch einmal genauer mit kontextfreien Grammatiken befassen müssen.
Danke für die schnelle Hilfe.