2009-04-17 50 views
5

什么是解决ANTLR这个问题的正确方法:如何对付列表返回值在ANTLR

我有一个简单的语法规则,说与元素任意数量的列表。

list 
: '[]' 
| '[' value (COMMA value)* ']' 

如果我想为指定列表中的返回值,并有该值是返回的值从生产实际列表,是什么做的正确方法?我在娱乐的替代品:

  • 创造在全球范围内我自己的堆栈,以保持这些列表的轨道
  • 尝试检查我下面的树节点,并提取信息的方式
  • 访问它我希望能找到一些简洁而酷的方式,从中可以轻松访问与规则关联的动作中的这样一个列表。

我想的问题是:如何时尚的年轻人做呢?

(FYI我使用ANTLR Python API中,但如果你打我的另一种语言,我可以搞定)

回答

5

在C#中它可能是这样的:

list returns [ List<string> ValueList ] 
    @init 
    { 
     $ValueList = new List<string>(); 
    } 
    : '[]' 
    | '[' value {$ValueList.Add(value);} (COMMA value {$ValueList.Add(value);})* ']' 
    ; 
+1

而且这与它在Java中的外观非常接近。谢谢!然而,ANTLR的要求我的名字分配给每个 “值”:A = EXPR {$ valueList.add($ a.value中);}(B = EXPR {$ valueList.add($ b.value);})* – 2010-10-28 20:02:01

1

我猜测更直接的方法可能是

list returns [ List values ] 
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' { 
     $values = $vs; 
} 
+0

笔者的“权威ANTLR参考”表明,在几个地方这种模式 - 但我发现它给我的是AST的子树的列表,而不是它们的值的列表。 – 2010-10-28 20:06:14