我已經查看了python類,發現他們沒有用於添加和刪除錯誤偵聽器的java方法,這可能是ANTLR中的一個錯誤,然而python被python允許修改成員無需設置器作爲這樣像在下面的例子:antlr4 -Dlanguage = Python2 AlmostEmpty.g4,然後通過在main.py鍵入
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
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)
parser._listeners = [ MyErrorListener() ]
tree = parser.animals()
來源
2015-08-26 13:52:39
Har
Emiel嗨,這些都不例外正因爲如此,他們的消息來自解析器directlty這是說,你給的輸入是無效的,由於1新行\ r \ n不被接受,並且2.關鍵字Tafel不存在。如果您發現它們不友好,但它們不是由異常生成的,而是由ErrorListener生成的,則可以編寫自己的消息。 – Har
Hi Har。我知道這些都不是例外。我說*「這些錯誤只是印刷聲明和**不是**例外」*。我需要解析器從打印錯誤改爲實際拋出異常,這樣我才能抓住它們。 –