1

I get simple antlr3 grammar MicroXpath and build lexer and parser for Python.

Then I wrote a simple test code:

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) 

Result:

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

Where the tree? This is a linear list! What am I doing wrong? Or using ANTLR can not build a tree?

1 Answer 1

3

Only adding output=AST; to the options{...} is not enough: you'll have to tell ANTLR which nodes/tokens to exclude from the AST (if any), and which nodes/tokens you want to make the root of a (sub) tree. Not doing so results in a flat tree, as you already observed.

Checkout this Q&A to find out how to create a hierarchy in your tree: How to output the AST built using ANTLR?

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.