2016-12-19 9 views
-1

Sollten Lexer-Regeln in Antlr4 eindeutig sein?Ziffernbereiche in Antlr4? Sollten Lexer-Regeln in Antlr4 eindeutig sein?

Angenommen, ich möchte Daten analysieren und definiert

hour: DIGIT09 | (DIGIT1 DIGIT09) | (DIGIT2 DIGIT04); 

month: DIGIT19 | (DIGIT1 DIGIT02); 

DIGIT12: '1'..'2'; 

DIGIT1: '1'; 

DIGIT2: '2'; 

DIGIT19: '1'..'9'; 

DIGIT09: '0'..'9'; 

DIGIT04: '0'..'4'; 

DIGIT04: '0'..'2'; 

Hier I definiert einstelligen Bereich in Lexer. Aber es sieht so aus, als ob es nicht funktioniert, da sie nicht eindeutig sind.

Kann ich Bereiche in Parser anstelle von Lexer definieren?

Antwort

1

Diese Art der Validierung wird am besten in einem Listener oder Besucher ausgeführt, der ausgeführt wird, nachdem ein Parserbaum erstellt wurde. Beginnen Sie mit nur einer Zahl:

NUMBER : [0-9]+; 

Dann definieren hour und month auf dieser Basis:

hour : NUMBER; 
month : NUMBER; 

Nachdem Sie einen Parse-Baum haben, implementieren enterHour und enterMonth zu bestätigen, dass die NUMBER enthalten in jeder gültig ist .

Dieser Ansatz bietet die beste Kombination aus Fehlerkorrektur und Fehlerberichterstattung für den Fall, dass der Benutzer eine falsche Eingabe eingibt.

+0

Habe ich einen Wert für "Enter"? Sollte ich das nicht in 'exit' machen? Wie würde ich Testergebnisse melden? – Dims