解析器过早减少

  • 本文关键字: lemon
  • 更新时间 :
  • 英文 :


我有一个语法,基本上看起来像:

start ::= groups.
groups ::= groups group.
groups ::= group.
group(A) ::= IDENTIFIER identparams CURLY_OPEN assignments CURLY_CLOSE SEMICOLON.
group(A) ::= IDENTIFIER CURLY_OPEN assignments CURLY_CLOSE SEMICOLON.
assignments ::= assignments assignment.
assignment ::= IDENTIFIER ASSIGNMENT bool_expr SEMICOLON.

解析如下:

name {
     name = "value";
     name2 = "value";
};

这确实是一个名为like的配置。结果是:

name = "value"导致赋值::=赋值。得到减少。我希望赋值是一个常量,但事实并非如此:

P assignment(0x807e778) ::= IDENTIFIER(0x807e728) ASSIGNMENT mvalue SEMICOLON.
P assignments((nil)) ::= assignments((nil)) assignment(0x807e778).
P append 0x807e778 to 0x807e838
P mvalue ::= string.
P assignment(0x807e750) ::= IDENTIFIER(0x807e7c8) ASSIGNMENT mvalue SEMICOLON.
P assignments((nil)) ::= assignments(0x807e838) assignment(0x807e750).
P append 0x807e750 to 0x807e910
P mvalue ::= string.
P assignment(0x807e7f0) ::= IDENTIFIER(0x807e7a0) ASSIGNMENT mvalue SEMICOLON.
P assignments((nil)) ::= assignments(0x807e910) assignment(0x807e7f0).
P append 0x807e7f0 to 0x807e9e8
P group(0x807e7a0) assignments(0x807e9e8) : bind
P groups ::= group(0x807e7a0).

柠檬调试输出为http://pastebin.com/yHNkNRpf

导致name2只被添加到列表中。我对此感到困惑。我理解减少,但不是为什么赋值一直被设置为空。有很多方法可以解决这个问题,但我更喜欢一个适当的解决方案。

柠檬调试输出为http://pastebin.com/yHNkNRpf

有线索吗?

Lemon解析器在pastebin上的调试输出显示它可以很好地解析您的输入令牌。它允许得出完整的语法是正确的结论。从问题中不清楚的是如何处理reduce操作中的解析值。

考虑以下实现。引入了两级列表来存储解析过的数据——它是分组的列表,分组依次进行分配。在减少每个赋值规则时,解析器调用一个操作,将该条目添加到临时赋值列表中。在减少组规则时,此临时列表作为新的组条目包含在组列表中。如果出现语法错误,整个列表将被删除。当解析成功完成时,它包含所有已解析的值。

根据你的程序输出,似乎你使用了新的列表或每个新的赋值:

P append 0x807e778 to 0x807e838
P append 0x807e750 to 0x807e910
P append 0x807e7f0 to 0x807e9e8

它解释了为什么在解析结束时只有最后一个值。新的赋值列表应该在解析第一个组的开始时初始化,在下一个组的组规则的操作处理程序中初始化。

迟做总比不做好:使用的re2c词法分析器没有覆盖所有令牌路径。换句话说:一些令牌与规则不匹配,并且没有设置默认值。在这种情况下,行为是未定义的。在本例中,它返回了错误的标记。

相关内容

  • 没有找到相关文章

最新更新