TreeParser is a validating tree walker that walk an AST according to the tree parser grammar rules. Each rule
defines all the possible children that the node can has. Each rule method take a node as input and match its
children against the rule definition. Rule definition is consist of the following elements:
There are of course other element like, lookahead(), action(), ... etc. just as for normal parser. Each rule or
element can also be tagged with a node descriptor and construct an output AST just like the normal parsers.
- A tokenRef() match the referenced node type. Children of the referenced node is not verified
(nor visited). It can be used to bypass the transversal of children that can be ignored.
- RuleRef() reference a rule that is not a defined input token type, the rule method is called
to verify against the current input token (not its children) and its siblings. If the referenced rule
declared a node type, an output node would be created just as in normal parser. On return, the next sibling
of the last token matched in the referenced rule would be matched.
- TreeRef() match a tree of nodes. The root node must match the input token (LT1), and children
of the treeRef() must match the children of the input token (LT1) exactly, no more or no less. After the
children are matched, the next sibling of the treeRef() would be matched.
- Before trying to match the children of a node, LLK push the node onto a node stack.
llkGetParent() return the node on top of the node stack and provide convenient access to the parent node of
the node being matched. llkGetParent() can also be used for error reporting when LT1()==null (eg. when end
of children list is reached unexpectedly).