2016-03-30 10 views
1

Ich habe eine Regel, die ein STRING vom Benutzer erwartet. Wenn der Benutzer derzeit ein Schlüsselwort angibt, das ich in meiner Grammatik definiert habe, gibt der Parser einen Segmentierungsfehler aus.ANTLR 2 Schlüsselwörter lösen Problem

Für Ex:

sampleClause: calc! strName {##->setType(SAMPLE_CLAUSE);}; 
strName : STRING; 
calc: "CALC" | "calc"; 

Wenn der Benutzer calc/CALC als strName betritt, wirft Parser Seg Fehler. Ich bin mir nicht sicher, wie ich das vermeiden kann.

EDIT: Ich möchte auch wissen, wie vermieden werden kann, dass der Parser einen Segmentierungsfehler gibt. Dies stürzt meine Anwendung ab, die ich nicht will. Ich möchte in diesen Situationen anstelle von seg fault sanft aussteigen.

P.S: Ich brauche die Lösung in ANTLR 2, da es eine Abhängigkeit gibt.

Antwort

0

Die hier übliche Lösung ist strName zu modifizieren alle

strName : STRING | calc ; 

Vorausgesetzt, dass Sie die Schlüsselwörter Askew eine Reihe von Schlüsselwörtern haben, möchten Sie jeder von ihnen als Lexer-Token und erstellen Sie eine keywords Regel definieren.

calc: CALC; 
CALC: "Calc" | "calc"; 
FOO: "foo"; 
BAR: "bar"; 

keywords: CALC| FOO | BAR; 

strName: STRING | keywords; 

Sie wollen wahrscheinlich auch auf Zeichenfolge Token-Typ ändern, wenn keywords Streichhölzer. Ich habe vergessen, wie man das in ANTLR 2 macht, aber es ist ziemlich einfach.