开发者

ANTLR Grammar gives me upsidedown-tree

I have a grammar which parses dot notion expressions like this:

a.b.c

memberExpression returns [Expression value]
  : i=ID                                     { $value = ParameterExpression($i.value); }
    ('.' m=memberExpression                  { $value = MemberExpression($m.value, $i.value); }
    )*     
  ;

This parses expressions fine and gives me a tree structure like this:

Mem开发者_开发百科berExpression(
   MemberExpression(
     ParameterExpression("c"),
     "b"
   )
   , "a"
)

But my problem is that I want a tree that looks like this:

MemberExpression(
   MemberExpression(
     ParameterExpression("a"),
     "b"
   )
   , "c"
)

for the same expression "a.b.c"

How can I achieve this?


You could do this by collecting all tokens in a java.util.List using ANTLR's convenience += operator and create the desired tree using a custom method in your @parser::members section:

// grammar def ...

// options ...

@parser::members {
  private Expression customTree(List tks) {
    // `tks` is a java.util.List containing `CommonToken` objects
  }
}

// parser ...

memberExpression returns [Expression value]
  :  ids+=ID ('.' ids+=ID)* { $value = customTree($ids); }
  ;


I think what you are asking for is mutually left recursive, and therefore ANTLR is not a good choice to parse it.

To elaborate, you need C at the root of the tree and therefore your rule would be:

rule: rule ID;

This rule will be uncertain whether it should match

a.b

or

a.b.c
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜