解析器过早减少

时间:2013-05-15 10:54:32

标签: c 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";
};

这确实是命名配置。会发生什么:

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仅添加到列表中。我很困惑。我理解reduce,但不是为什么assignents被设置为null。有很多方法,但我更喜欢正确的解决方案。

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

任何线索?

2 个答案:

答案 0 :(得分:0)

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

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

根据您的程序输出,您似乎使用新列表或每个新的分配值:

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

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

答案 1 :(得分:0)

最好迟到然后:使用的re2c词法分析器并没有涵盖所有令牌路径。换句话说:某些令牌与规则不匹配,并且未设置默认值。 在这种情况下,行为是未定义的。在这种情况下,它返回了错误的令牌。