我正在用PackCC开发一个小型解析器,当一个规则被匹配了 n 次时,我不知道该怎么做,这里的 n 在编译时是未知的。本质上,我使用C操作为给定的规则创建一个抽象语法树,然后添加它的子规则(如果存在的话)。当子规则的数量在编译时确定时,这是有效的。
请考虑以下规则:
application <- '(' e:expr* ')' { $$ = ??? }
/ '{' e:expr* '}' {}
/ '[' e:expr* ']' {}
这应该与函数应用程序相匹配,例如(+ 5 4 3 2)
。问题是我不知道如何检索第 i 个表达式。使用$n
前缀再次受限于在编译时知道有多少匹配项。解决方案是什么?
1条答案
按热度按时间kkbh8khc1#
如果在规则中使用
e:expr*
,则规则将匹配任意数量的连续expr
,并将e
设置为最后一个的值。(或者使用尖括号并与PackCC的捕获编号的奇怪概念作斗争),但这只是给您一个字符串,这几乎取消了整个解析(除了知道它是成功的)。据我所知,PackCC中
*
和+
重复操作符的唯一真实的用途是构建令牌匹配器,如果只需要整个匹配字符串,EBNF操作符就很好,在其他情况下用处不大。由于PackCC没有提供创建列表的内置机制,因此您必须自己创建列表,这基本上意味着您最终将得到如下内容: