2017-07-04 3 views
-1

Ich folgte den Anweisungen für die Fehlerbehandlung auf der Website Antlr http://www.antlr2.org/doc/err.html (es sagt Antlr2, aber ich konnte keine Alternative für Antlr4 finden) und schrieb die Ausnahmebehandlung für meine Regel wie folgt.Antlr4 Fehlerbehandlung kompiliert nicht

subStmt : 
(visibility WS)? (STATIC WS)? SUB WS? ambiguousIdentifier (WS? argList)? endOfStatement 
block? 
END_SUB 
; 
exception 
catch [RecognitionException ex] { 

} 

Aber wenn ich versuche, den Parser für die Grammatik zu erzeugen, scheitert es wie folgt: java -jar ../Downloads/antlr-4.7-complete.jar vba.g4 -package vba -o out Fehler (50): vba.g4: 500: 4: syntax error: 'catch' kam für mich völlig überraschend, während die Regelpräambel

Jede Hilfe wird sehr geschätzt.

Antwort

0

Antlr4 ist ziemlich anders als Antlr2. Beginnen Sie, indem Sie einen Blick auf diese Frage mit (und die Antwort):

How to implement error handling in ANTLR4

-Update mit einem einfachen Ansatz:

Für die Fehlerberichterstattung ist der grundlegende Ansatz, eine Klasse zu machen, die die ANTLRErrorListener Schnittstelle implementiert . BaseErrorListener hat leere Implementierungen für alle Methoden, so dass Sie nur diejenigen implementieren müssen, die Ihnen wichtig sind. Sie interessieren sich wahrscheinlich am meisten für syntaxError().

Rufen Sie in Ihrem Parser-Objekt removeErrorListeners() auf, um den internen Fehlerlistener zu löschen, und rufen Sie dann addErrorListener() mit einer Instanz der Klasse auf, die Sie mit Ihren Fehlern behandeln möchten.

Sie erhalten dann syntaxError() Aufrufe dieser Klasse, wenn Fehler während einer Analyse auftreten.

Die anderen Methoden können (oder können möglicherweise nicht) Sie tun lassen, was Sie tun möchten; Ich habe diese Schnittstelle nicht verwendet, um von Parse-Fehlern zu erholen.

Zur Wiederherstellung bestimmter Fehler können Sie eine Klasse mit der Schnittstelle ANTLRErrorStrategy implementieren. Das wird kompliziert; siehe DefaultErrorStrategy für die Standardimplementierung.

Ein sehr einfacher Ansatz ist, mit den möglichen Fehlern in Ihrer Grammatik umzugehen. Nicht sicher, wie weit Sie damit gehen können, aber dies ist wahrscheinlich der einfachste Ansatz.

+0

Dieses Beispiel scheint sehr kompliziert. Mein Fall könnte sein, Fehler in einer Regel einfach zu ignorieren (ich muss eine Eingabe mit Fehlern akzeptieren). Gibt es keine antlr4-Fehlerbehandlung? –

+0

@HughDarling Schön genug - ich habe meine Antwort ein wenig erweitert. – janm