这可能是我对解析器如何减少的误解,而不是 SQLite 的柠檬解析器中的潜在错误。我一直在试验数据库输入文件的简单语法。该数据库由至少一个条目集的列表组成,例如“命令”或“地图”或...
这是一个不起作用的语法 - 我已经开始创建条目集,到目前为止我只有一个“命令”:
database ::= entrylist.
entrylist ::= entrylist entryset.
entrylist ::= entryset.
entryset ::= command.
/* Commands are in the form %command [arguments] \n */
command ::= CMDNAME cmdargs EOL.
cmdargs ::= cmdargs cmdarg.
cmdargs ::= .
cmdarg ::= INTEGER.
cmdarg ::= TEXT.
如果我使用只输入令牌的测试程序运行它,我会得到:
$ test
Debug: Input 'CMDNAME'
Debug: Shift 'CMDNAME', go to state 3
Debug: Return. Stack=[CMDNAME]
Debug: Input 'INTEGER'
Assertion failed: stateno <= YY_SHIFT_COUNT, file testpar.c, line 513
如果我给入口集一个额外的选择:
entryset ::= command.
entryset ::= map.
...
map ::= MAPNAME EOL.
然后整个事情按预期工作。我认为也许您不允许创建 a::=b 和 b::=c 的情况。你必须有 b ::= c | d 至少。我想了解这是否是我的理解错误。