假设我有一个 ANTLR 语法:
program = word (' ' word)*
;
word = 'dog' | 'cat' | 'bird'
;
据我了解,它将匹配上述任何单词序列,例如“dog dog cat”、“dog cat bird cat”等。但如果我只想匹配相同值的重复,例如“dog dog”、“cat cat cat cat”、“bird bird bird”等,该如何修改上述语法来做到这一点?
换句话说,我希望“program”规则中重复出现的非终端符号“word”始终匹配相同的生成规则,而不是为“word”指定的任何规则,但不必在“program”规则中明确列出它们中的每一个(例如,如果“word”有大量的替代方案),这意味着我想避免这样的事情:
program:
'dog' (' ' 'dog')*
| 'cat' (' ' 'cat')*
| 'bird' (' ' 'bird')*
...
;
我认为在正则表达式中,这是使用反向引用(例如“\1”)实现的,在 ANTLR 语法中是否有等效的实现,或者有其他方法可以实现?
正如 kaby76 所述:在解析器规则中处理此问题意味着引入谓词,这意味着在语法中添加特定于目标的代码(通常不建议这样做)。这可能看起来像这样(使用 Java 目标):
请注意,上例中的词法分析器会丢弃空格。解析
bird dog dog dog cat cat
将产生以下解析树:另一种可能性是从这些重复的单词中创建一个单独的标记:
或者仅匹配您在问题中提到的一个或多个单词:
然后在解析之后,检查监听器是否相同,
word
如果不相同,则可能引发错误。