我将为配置文件编写递归下降解析器。这些文件与ini文件大致相似。以下是类似EBNF格式的语言:
document ::= { category }
category ::= title {entry}
title ::= "[" <name> "]"
entry ::= <key> ":" <value>
这里是一个在结尾处应该会产生解析错误的文件示例:
[Category1]
key1:val1
key2 :val2
key3 : val3
[Category2]
key4: val4
this line right here should produce an error
我能找到的所有示例都会解析输入,直到遇到无效符号就退出而不打印有用的错误信息。我有一个遵循这种行为的工作解析器,但我不知道如何实现有用的错误报告。
例如,一个
document
由零个或多个类别组成。当前两个类别被解析而没有错误时,第三个包含语法错误怎么办?如果输入在第二个类别后结束,并且由于没有标记而无法解析第三个类别(这不应该产生错误消息),该怎么办?我该如何区分这些情况?无效行可以通过两种方式变得有效:成为条目或标题。这让我感到困惑。当程序到达上面输入的最后一行时,我希望我的程序打印类似于
line 9: expected entry or title
的内容。人们通常如何在递归下降解析器中实现错误消息?