我在python中使用ANTLR構建了Java決議器。下面是我用來決議JAVA代碼的主要代碼。
def ASTconversion(file_path)。
code = open(file_path, 'r').read()
lexer = JavaLexer(antlr4.InputStream(code))
stream = antlr4.CommonTokenStream(lexer)
parser = JavaParser(stream)
tree = parser.compilationUnit()
is_syntax_errors = tree.parser._syntaxErrors #Binary[/span
return tree.toStringTree(recog=parser),is_syntax_errors
ast, is_syntax_errors = ASTconversion(code_path)
print(ast)
下面包含了上述代碼片段的輸出。
(compilationUnit (typeDeclaration (classOrInterfaceModifier public) (classDeclaration class Number (classBody { (classBodyDeclaration (block { (blockStatement (statement (expression (primary System)) . out) . (methodCall println ( (expressionList (expression (primary (literal "Printing Numbers")))) ))) ;) (blockStatement (statement for ( (forControl (forInit (localVariableDeclaration (typeType (primitiveType int)) (variableDeclarators (variableDeclaratorId i) = (variableInitializer (expression (primary (integerLiteral 1))))))))) 。(expression (expression (primary i)) <= (expression (primary (integerLiteral 10))))) ; (expressionList (expression (primary i)) )) ) (statement (block { (blockStatement (statement (expression (expression (primary System)) . out) . (methodCall println ( (expressionList (expression (primary i)) ) )) ;) })))) })) }))) )
基于這個輸出,我有兩個問題要問。
1.我如何將這個分析器的輸出看作一個圖形化的AST?
2.如果代碼包含任何語法錯誤,我可以找到作為在代碼。但我怎樣才能追蹤到這個語法錯誤呢?
uj5u.com熱心網友回復:
看來Python目標沒有能力讓你從Python代碼中產生槍支決議樹視圖。 這是有道理的,因為那是Java運行時中的一個Java應用程式。
如果您按照ANTLR 快速啟動,您應該已經安裝了grun命令,并且(假設您的語法中沒有Python特定的語意謂詞、標題等),您將能夠使用gui選項與grun來查看決議樹的圖形顯示。
此外,Visual Studio Code 和 IntelliJ ANTLR 插件使您能夠根據語法測驗輸入,并在 IDE 中看到決議樹的可視化(VS Code 插件) (IntelliJ插件)。
為了從決議中獲取錯誤資訊,您可能應該看看 Python 運行時的 ctest.py 測驗。 它將告訴你如何實作你自己的 errorListener:
一個摘錄:
class ErrorListener(antlr4.error.ErrorListener.ErrorListener)。
def __init__(self)。
super(ErrorListener, self).__init__()
self.errored_out = False[/span]。
def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e)。
self.errored_out = True。
def sub()。
# 決議輸入檔案 sub().
input_stream = antlr4.FileStream("c.c")
lexer = CLexer(input_stream)
token_stream = antlr4.CommonTokenStream(lexer)
parser = CParser(token_stream)
errors = ErrorListener()
parser.addErrorListener(errors)
當然,你可以在你的ErrorListener類的擴展中替換你自己的代碼來收集和保留錯誤。 關鍵是你需要實作你自己的錯誤監聽器,然后使用addErrorlistener()來使用它(你可能還想呼叫removeErrorListner()來洗掉默認的監聽器,它可能只是寫出到sysout)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/314847.html
標籤:
