【发布时间】:2014-12-05 23:22:15
【问题描述】:
我的语法如下:
grammar Test;
options {
lang = Python;
}
declaration returns [value]
: 'enum' ID { statement* }
{ $value = {'id': $ID.text,
'fields': $statement.value}
}
;
statement returns [value]
: ID ':' INT ';' { $value = {'id': $ID.text, 'value': int($INT.text)} }
;
解析类型的语法:
enum Test {
Foo: 3;
Bar: 5;
}
但是,我正在努力将 statement* 规则放入语句列表中。我希望我的最终解析对象看起来像:
declaration = {
'id': 'Test',
'fields': [
{'id': 'Foo', 'value': 3},
{'id': 'Bar', 'value': 5},
}
我可以正确解析每个statement 结果,因此每个$statement.value 都是正确的。
但是,鉴于规则declaration 中statement* 上的星号,有没有办法可以轻松地将其压缩为字段列表?我希望有某种语法可以让我免费获得这个选项。
现在这只是最后一条语句,所以它返回:
declaration = {
'id': 'Test',
'fields': [
{'id': 'Bar', 'value': 5},
}
我想要一个通用的解决方案,因为我的语法有很多形式的规则:
some_declaration
: keyword ID '{' declaration_statement* '}'
;
注意:我是用 Python 编写的。 我尝试将其编码为解析器,然后是树语法,但即使这样,最后一个元素也是我得到的唯一元素,其余元素都被丢弃了。
【问题讨论】:
标签: python parsing antlr grammar antlr3