2013-03-04 1 views
1

간단한 antlr3 문법 MicroXpath을 얻고 Python 용 lexer 및 parser를 빌드합니다.Python에서 ANTLR로 구문 분석 할 때 목록 대신 AST- 트리를 가져 오는 방법은 무엇입니까?

import antlr3 
from XPathLexer import XPathLexer 
from XPathParser import XPathParser 

def print_level_order(tree, indent): 
    print('{0}{1}'.format(' '*indent, tree.text, tree.getType())) 
    for child in tree.getChildren(): 
     print_level_order(child, indent+1) 

input = 'descendant::name[class/name[test="x"]="File"]' 
char_stream = antlr3.ANTLRStringStream(input) 
lexer = XPathLexer(char_stream) 
tokens = antlr3.CommonTokenStream(lexer) 
parser = XPathParser(tokens) 
tree = parser.xPath().tree 

print_level_order(tree, 0) 

결과 :

None 
    descendant 
    : 
    name 
    [ 
    class 
/
    name 
    [ 
    test 
    = 
    "x" 
    ] 
    = 
    "File" 
    ] 

트리

은 그 때 나는 간단한 테스트 코드를 작성? 선형 목록입니다! 내가 도대체 ​​뭘 잘못하고있는 겁니까? 또는 ANTLR을 사용하여 트리를 만들 수 없습니까?

답변

3

options{...}output=AST;을 추가하는 것만으로는 충분하지 않습니다. AST (있는 경우)와 제외 할 노드/토큰을 ANTLR에게 알려야하고 (어떤 노드/토큰을)) 트리. 그렇게하지 않으면 이미 관찰 된 것처럼 평평한 나무가됩니다.

체크 아웃 귀하의 트리 계층 구조를 만드는 방법을 찾아이 Q & A : How to output the AST built using ANTLR?

+0

감사합니다 많이! 그게 내가 찾고 있던거야! – Cosmologist

+0

당신은 @ Cosmologist를 환영합니다. –

관련 문제