简体   繁体   English

Python 2.7和ANTLR4:使ANTLR在无效输入上抛出异常

[英]Python 2.7 & ANTLR4 : Make ANTLR throw exceptions on invalid input

I want to catch errors like 我想抓住像这样的错误

line 1:1 extraneous input '\r\n' expecting {':', '/',}

line 1:1 mismatched input 'Vaasje' expecting 'Tafel'

I tried wrapping my functions in try-catch but, as expected, these errors are just print statement and not exceptions. 我尝试在try-catch中包装我的函数但是,正如预期的那样,这些错误只是print语句而不是异常。 I've seen some examples of switching on errors in the .g4 file, but all the examples are for Java, and I can't seem to get it working. 我已经看到了一些在.g4文件中切换错误的例子,但所有的例子都是针对Java的,我似乎无法让它工作。

Is it possible for ANTLR4 in Python to throw exceptions which I can catch? Python中的ANTLR4是否可以抛出我可以捕获的异常?

I have looked through the python classes and noticed that they dont have the methods that the java one has for adding and removing a error listener, this maybe a bug in ANTLR, however python being python you are allowed to modify the members without requiring a setter as such like in the following example: 我查看了python类并注意到他们没有java添加和删除错误监听器的方法,这可能是ANTLR中的一个错误,但python是python你可以修改成员而不需要setter就像在下面的例子中一样:

I run the example by performing a : antlr4 -Dlanguage=Python2 AlmostEmpty.g4 and then by typing in main.py 我通过执行:antlr4 -Dlanguage = Python2 AlmostEmpty.g4然后输入main.py来运行该示例


AlmostEmpty.g4 AlmostEmpty.g4

grammar AlmostEmpty;

animals: (CAT | DOG | SHEEP ) EOF;

WS: [ \n\r]+ -> skip;
CAT: [cC] [aA] [tT];
DOG: [dD] [oO] [gG];
SHEEP: [sS] [hH] [eE] [pP];

main.py main.py

from antlr4 import *
import sys
from AlmostEmptyLexer import AlmostEmptyLexer
from AlmostEmptyParser import AlmostEmptyParser
from antlr4.error.ErrorListener import ErrorListener

class MyErrorListener( ErrorListener ):

    def __init__(self):
        super(MyErrorListener, self).__init__()

    def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
        raise Exception("Oh no!!")

    def reportAmbiguity(self, recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs):
        raise Exception("Oh no!!")

    def reportAttemptingFullContext(self, recognizer, dfa, startIndex, stopIndex, conflictingAlts, configs):
        raise Exception("Oh no!!")

    def reportContextSensitivity(self, recognizer, dfa, startIndex, stopIndex, prediction, configs):
        raise Exception("Oh no!!")

if __name__ == "__main__":
    inputStream = StdinStream( )
    lexer = AlmostEmptyLexer(inputStream)
    # Add your error listener to the lexer if required
    #lexer.removeErrorListeners()
    #lexer._listeners = [ MyErrorListener() ]
    stream = CommonTokenStream(lexer)
    parser = AlmostEmptyParser(stream)
    # As mentioned in the comments by @Tim Stewart instead of doing this:
    # parser._listeners = [ MyErrorListener() ]
    # you can do this:
    parser.addErrorListener( MyErrorListener() )
    tree = parser.animals()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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