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.
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. –
Wie man den Diagnosedruck im Flex einschaltet und ich drucke nichts im Lexical Analyzer Wie füge ich einen Zeilenumbruch hinzu –
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. –