6

在 ANTLR 中解决此问题的正确方法是什么:

我有一个简单的语法规则,比如一个包含任意数量元素的列表。

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

如果我想为列表分配一个返回值,并且该值是生产中返回值的实际列表,那么正确的方法是什么?我正在娱乐的替代方案是:

  • 在全局范围内创建我自己的堆栈以跟踪这些列表
  • 尝试检查我下面的树节点并以这种方式提取信息
  • 以某种巧妙而酷炫的方式访问它,我希望能找到我可以从与规则相关联的操作中轻松访问此类列表的方法。

我想问题是:酷孩子是怎么做到的?

(仅供参考,我正在使用 ANTLR 的 python API,但如果你用另一种语言打我,我可以处理)

4

2 回答 2

5

在 C# 中,它可能看起来像这样:

list returns [ List<string> ValueList ]
    @init
    {
        $ValueList = new List<string>();
    }
    : '[]'
    | '[' value {$ValueList.Add(value);} (COMMA value {$ValueList.Add(value);})* ']'
    ;
于 2009-04-17T04:41:40.800 回答
1

我想一个更直接的方法可能是

list returns [ List values ]
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' {
        $values = $vs;
}
于 2009-05-24T17:38:37.150 回答