如何从PackCC中检索所有符合条件的规则?

iugsix8n  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(82)

我正在用PackCC开发一个小型解析器,当一个规则被匹配了 n 次时,我不知道该怎么做,这里的 n 在编译时是未知的。本质上,我使用C操作为给定的规则创建一个抽象语法树,然后添加它的子规则(如果存在的话)。当子规则的数量在编译时确定时,这是有效的。
请考虑以下规则:

application <- '(' e:expr* ')' { $$ = ??? }
             / '{' e:expr* '}' {}
             / '[' e:expr* ']' {}

这应该与函数应用程序相匹配,例如(+ 5 4 3 2)。问题是我不知道如何检索第 i 个表达式。使用$n前缀再次受限于在编译时知道有多少匹配项。解决方案是什么?

kkbh8khc

kkbh8khc1#

如果在规则中使用e:expr*,则规则将匹配任意数量的连续expr,并将e设置为最后一个的值。(或者使用尖括号并与PackCC的捕获编号的奇怪概念作斗争),但这只是给您一个字符串,这几乎取消了整个解析(除了知道它是成功的)。
据我所知,PackCC中*+重复操作符的唯一真实的用途是构建令牌匹配器,如果只需要整个匹配字符串,EBNF操作符就很好,在其他情况下用处不大。
由于PackCC没有提供创建列表的内置机制,因此您必须自己创建列表,这基本上意味着您最终将得到如下内容:

expr     -> '(' _ el:exprlist ')'  { $$ = el; }
          / a:atom                 { $$ = a; } 
exprlist -> e:expr _ el:exprlist   { $$ = cons(e, el); }
          /                        { $$ = &nullobj; }
_        -> [ \t\n]*

相关问题