我有一个基本上看起来像这样的语法:
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" 导致 assignments ::= assignments 分配。减少。我希望 assignments 是一个常量值,但事实并非如此:
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
有什么线索吗?