2015-08-26 38 views
3

我想趕上這樣的錯誤的Python 2.7 ANTLR4:請ANTLR扔在輸入無效

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

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

我想包裝我的函數的try-catch,但正如預期的例外,這些錯誤只是打印語句,而不是例外。我已經看到了一些在.g4文件中切換錯誤的例子,但所有的例子都是針對Java的,我似乎無法得到它的工作。

Python中的ANTLR4有可能拋出我能捕獲的異常嗎?

+0

Emiel嗨,這些都不例外正因爲如此,他們的消息來自解析器directlty這是說,你給的輸入是無效的,由於1新行\ r \ n不被接受,並且2.關鍵字Tafel不存在。如果您發現它們不友好,但它們不是由異常生成的,而是由ErrorListener生成的,則可以編寫自己的消息。 – Har

+1

Hi Har。我知道這些都不是例外。我說*「這些錯誤只是印刷聲明和**不是**例外」*。我需要解析器從打印錯誤改爲實際拋出異常,這樣我才能抓住它們。 –

回答

7

我已經查看了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() 
+0

Hi Har。感謝您的回答,這很好!我檢查了ErrorListener,不幸的是我找不到一種方法來捕捉「不匹配的輸入」和「無關輸入」。你也許有這個答案嗎?如果是這樣,我可以接受你的問題。 –

+1

我想我找到了一種方法。我嘗試了你的方法,並且我可以創建在ReportError()上引發異常的MyErrorStrategy(ErrorStrategy)。謝謝你的幫助! –