如何解决如何使ANTLR消耗所有可见元素?
这是我的语法:
grammar test;
text: foo EOF;
foo:
'X'
|
foo
'!'
|
foo
'?'
|
foo
tail
;
tail: (' ' foo)+;
我正在解析此文本:
X? X! X X
这是我得到的树:
语法上应该进行哪些更改,以使我只得到一个tail
元素,并在其中包含所有foo
元素的集合?
在现实世界中,任务要复杂得多,仅使用扫描仪是无法解决的。
解决方法
据我所知,您想要的是什么
item: 'X' ('!' | '?')*;
// Alternatively to get a tree per operator instead of a list of operators:
// item
// : 'X'
// | item '!'
// | item '?'
// ;
foo: item (' ' item)*;
也许是这样,如果您希望尾巴在树中仍具有自己的节点:
item: 'X' ('!' | '?')*;
foo: item tail;
tail: (' ' item)*;
您的版本仅提供1个项目列表的原因是foo
和tail
之间的相互递归消耗了所有项目,因此没有多余的内容可供重复使用。
通常,当您有可以重复的内容时,您要么希望使用*
/ +
(如果要在结果树中列出列表)来实现它,要么使用递归(如果您想要更多的树状树)-不能同时使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。