简体   繁体   中英

ANTLR4 Terminate on Lexer/Parser error Python

I want to know how can I keep the lexer or parser from running when it finds a mismatch. For Example if the lexer expected a '.' I want it not to continue with recovery mode.

This is what worked for me:

import sys
from antlr4 import *
from bin.LEDSGrammarLexer import LEDSGrammarLexer
from bin.LEDSGrammarParser import LEDSGrammarParser
from bin.LEDSGrammarListener import LEDSGrammarListener
from src.Gramatica import Gramatica
from src.Traductor import Translator
#Add This Library
from antlr4.error.ErrorListener import ErrorListener

import src.CuboSemantico

class MyErrorListener( ErrorListener ):
    def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
        print str(line) + ":" + str(column) + ": sintax ERROR, " + str(msg)
        print "Terminating Translation"
        sys.exit()

    def reportAmbiguity(self, recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs):
        print "Ambiguity ERROR, " + str(configs)
        sys.exit()

    def reportAttemptingFullContext(self, recognizer, dfa, startIndex, stopIndex, conflictingAlts, configs):
        print "Attempting full context ERROR, " + str(configs)
        sys.exit()

    def reportContextSensitivity(self, recognizer, dfa, startIndex, stopIndex, prediction, configs):
        print "Context ERROR, " + str(configs)
        sys.exit()

def main(argv):
    print "Parsing: " + argv[1] + "\n"
    input = FileStream(argv[1])
    lexer = LEDSGrammarLexer(input)

    #This was the key!
    stream = CommonTokenStream(lexer)
    parser = LEDSGrammarParser(stream)
    parser._listeners = [ MyErrorListener() ]

    tree = parser.programa()
    printer = Gramatica()
    walker = ParseTreeWalker()
    result = walker.walk(printer,tree)
    print "Resultado del parseo" + str(result)
    for idx,x in enumerate(printer.Cuadruplos):
        print str(idx) +" - "+str(x)
    translator = Translator()
    translator.translate(printer)
    #print(tree.toStringTree(recog=parser))

if __name__ == '__main__':
    main(sys.argv)

Thanks to: HAR

Reference Answer

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM