Antlr-Ausnahmebedingungen

Ich habe eine komplexe Grammatik mit Antlr 3 unter Verwendung des AST-Baums entwickelt. ANTLR generiert den Lexer und Parser. Das Problem ist, dass die Grammatik ein ';' erwartet, wenn der Benutzer eine Syntax eingibt, die beispielsweise ungültig ist. Der Benutzer gibt dies nicht ein, dann erhalte ich in meiner Eclipse-IDE die folgende Ausnahme:

 line 1:24 mismatched input '<EOF>' expecting ';'

Wie kann diese Ausnahme behandelt werden, weil ich versuche, diese Ausnahme abzufangen, aber die Ausnahme wird nicht abgefangen. Ist das überhaupt eine Ausnahme? Ich scheine nicht zu verstehen, warum diese Ausnahme nicht abgefangen wird. Ich habe versucht, es herauszufinden, aber die Antlr-Website scheint seit einiger Zeit nicht erreichbar zu sein.

Ich habe mir folgendes angesehen:ANTLR-Ausnahmebehandlung mit "$3$quot;, Java und folgte diesem Beispiel, aber wenn der Lexer den Code durch Hinzufügen der RuntimeException () generiert, erhalte ich nicht erreichbaren Code.

Ich bin mir nicht sicher, was ich tun soll.

Wenn ich versuche, die Anzahl der Syntaxfehler vom Parser abzurufen, wird 0 angezeigt.

BEARBEITEN:

Ich habe eine Lösung gefunden, die funktioniert, wenn ich mir anschaue:ANTLR löst bei ungültiger Eingabe keine Fehler aus

Wenn ich jedoch versuche, die Ausnahmebedingungsnachricht zurückzugewinnen, ist sie null. Habe ich alles richtig eingestellt? Siehe Beispielgrammatik:

grammar i;

options {
output=AST;
}

@header {
package com.data;
}

@rulecatch {
    catch(RecognitionException e) {
        throw e;
   }
}

// by having these below it makes no difference
/**@parser::members {
    @Override
    public void reportError(RecognitionException e) {
        throw new RuntimeException("Exception : " + " " + e.getMessage());
    }
}

@lexer::members {
    @Override
    public void reportError(RecognitionException e) {
       throw new RuntimeException("Exception : " + " " + e.getMessage());
    }
}*/

BEARBEITEN:

Bitte sehen Sie, was ich bisher habe:

grammar i;

options {
output=AST;
}

@header {
package com.data;
}

@rulecatch {
    // ANTLR does not generate its normal rule try/catch
    catch(RecognitionException e) {
        throw e;
    }
}

@parser::members {
    @Override
    public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
        String hdr = getErrorHeader(e);
        String msg = getErrorMessage(e, tokenNames);
        throw new RuntimeException(hdr + ":" + msg);
    }
}

@lexer::members {
    @Override
    public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
        String hdr = getErrorHeader(e);
        String msg = getErrorMessage(e, tokenNames);
        throw new RuntimeException(hdr + ":" + msg);
    }
}

operatorLogic   : 'AND' | 'OR';
value       : STRING;
query       : (select)*;
select      : 'SELECT'^ functions 'FROM table' filters?';';
operator    : '=' | '!=' | '<' | '>' | '<=' | '>=';
filters : 'WHERE'^ conditions;
members : STRING operator value;
conditions  : (members (operatorLogic members)*);
functions   : '*';
STRING  : ('a'..'z'|'A'..'Z')+;
WS      : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords

public class Processor {

public Processor() {

}

/**
 * This method builds the MQL Parser.
 * @param args the args.
 * @return the built IParser.
 */
private IParser buildMQLParser(String query) {
    CharStream cs = new ANTLRStringStream(query);
    // the input needs to be lexed
    ILexer lexer = new ILexer(cs);
          CommonTokenStream tokens = new CommonTokenStream();
    IParser parser = new IParser(tokens);
    tokens.setTokenSource(lexer);
    // use the ASTTreeAdaptor so that the grammar is aware to build tree in AST format
    parser.setTreeAdaptor((TreeAdaptor) new ASTTreeAdaptor().getASTTreeAdaptor());
return parser;
}

/**
 * This method parses the MQL query.
 * @param query the query.
 */
public void parseMQL(String query) {
    IParser parser = buildMQLParser(query);
    CommonTree commonTree = null;
    try {
                     commonTree = (CommonTree) parser.query().getTree();
                    }
    catch(Exception e) {
        System.out.println("Exception :" + " " + e.getMessage());
    }
}
}

public class ASTTreeAdaptor {

public ASTTreeAdaptor() {

}

/**
 * This method is used to create a TreeAdaptor.
 * @return a treeAdaptor.
 */
public Object getASTTreeAdaptor() {
    TreeAdaptor treeAdaptor = new CommonTreeAdaptor() {
        public Object create(Token payload) {
        return new CommonTree(payload);
        }
    };
    return treeAdaptor; 
}
}

Also wenn ich folgendes eingebe: SELECT * FROM Tabelle

ohne ein ';' Ich erhalte die MismatchedTokenException:

catch(Exception e) {
     System.out.println("Exception : " + " " e);
}

Wenn ich versuche:

e.getMessage();

es gibt null zurück.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage