2017-04-15 3 views
0

Aktion zu geben, Ich versuche, einen kleinen Compiler Flex und Bison zu machen, aber ich war nicht zu bekommen, wie Maßnahmen geben für jede Regelwie für jede Regel Bison

meine Grammatik ist wie:

 %union{ 
      std::string *s; 
    }; 

%start program 
%type <s> expr 

%token <s> KEYWORD 
%token <s> VARIABLE 

%% 

program : KEYWORD {std::cout << "A"; } 
| KEYWORD VARIABLE {std::cout << "B"; } 

Variable regex ist [a-zA-Z0-9]

"Caps" ist mein Stichwort

wenn i Eingang geben als "Caps Lock" (Caps = STICHWORT und lock = VARIABLE) ich war immer outpu t wie "B"

Wenn ich Eingabe als Caps gebe, dann wartet es, bis ich das nächste Wort eintrage und nach Eingabe eines nächsten Wortes drucke es "Asyntax-Fehler", wenn der nächste Input Caps ist.

Ausgabe ist es wartet, bis neben Eingang gegeben A zu drucken und druckt es noch ein, wenn ein Fehler mit Syntaxfehler vorliegt

ich nicht bekommen, was mit ihm falsch ist, kann jemand den Fehler darin finden.

+1

Also, Sie bekommen A gedruckt, aber nicht B? Das heißt, Sie identifizieren Dinge als Schlüsselwörter, aber anscheinend nicht als Variablen. Das Problem liegt nicht in der Grammatik - es ist in dem lexikalischen Analysator, den du nicht gezeigt hast. Sie sollten überlegen, Ihrem Ausdruck eine neue Zeile hinzuzufügen. (Es ist auch ungewöhnlich - COBOL-ähnlich -, '-' als Zeichen in Variablennamen zu verwenden. Meinten Sie' _ 'zwischen 'Z' und' 0'?) Haben Sie sichergestellt, dass Sie den Diagnosedruck im Lexikon aktivieren können Analysator, damit Sie sehen können, dass der Token-Stream zur Grammatik zurückkehrt? Es würde das Leben auf lange Sicht erleichtern, wenn du kannst. –

+0

Wie man den Diagnosedruck im Flex einschaltet und ich drucke nichts im Lexical Analyzer Wie füge ich einen Zeilenumbruch hinzu –

+0

Sie müssen das Steuerelement im Flex-Code angeben. Es ist standardmäßig nicht verfügbar. Wenn Sie jedoch sehen können, was der lexikalische Analysator zurückgibt, kann das oft beim Debuggen von Grammatiken helfen. –

Antwort

1

Bison benötigt ein "end of input" -Token, um das Ende der Eingabe zu markieren und eine erfolgreiche Analyse zurückzugeben. Normalerweise geben Sie dieses Token beim Lesen von EOF (das ist, was lex/flex tut). Wenn Sie also ein EOF eingeben (in der Regel durch Schlagen ctrlD oder ctrlZ) nach der Eingabe, sollte es funktionieren.

+0

Wie halte ich Bison aus dem Echo der nicht übereinstimmenden Eingabe wie Raum und neue Zeile und warum es nur Echos für Leerzeichen und neue Zeile und gibt Syntaxfehler für andere nicht übereinstimmende ASCII-Zeichenfolgen. –

+0

@JeevansaiJinne: Bison nicht das Echo von unübertroffener Eingabe; das ist die "Arbeit" von Flex. Es hat eine Standardregel, die übereinstimmenden Text widerspiegelt, der nicht von einer anderen Regel (etwa '. + {ECHO;}') erfasst wird. –

+0

Wie drucke ich Raum in Bison druckt Adresse –