开发商ParseKit这里。
ParseKit中有两个功能可用于帮助提供描述输入中遇到的分析错误的用户可读提示。
-[PKParser bestMatchFor:]
- 的
PKTrack
类
这听起来像你知道的-bestMatchFor:
方法,即使它没有做,你在这种情况下会发生什么。
我认为PKTrack
这个班在这里会更有帮助。如Metsker's book中所述,PKTrack
与PKSequence
完全相同,区别仅在于其子分析器是必需的,并且在其所有子分析器不匹配时都会引发错误(并附带有用的错误消息)。
因此,这里是为您的示例输入语法:
@start = '(' expr ')' | expr;
expr = ('+' | '-') term term;
term = '(' expr ')' | Word;
连续列出的任何产品有一个序列 - 而是可以曲目。
将这些序列更改为曲目的好处是,如果输入不匹配,将会抛出一个NSException
带有人类可读的分析错误消息。缺点是你现在必须将工厂生成的解析器的所有用法都包含在try/catch块中以捕获这些跟踪异常。
目前(或现在,至少)的问题是PKParserFactory
从来没有使用轨道生成分析器。相反,它总是使用序列。
所以我只是增加了一个新的选项在主干头Google Code(你需要udpate)。
#define USE_TRACK 0
在
PKParserFactory.m
这是0
默认。如果您将此定义更改为1
,则将使用曲目而不是序列。所以上面给出的语法和无效的输入是这样的:
(+ a - b c))
与此客户端代码:
NSString *g = // fetch grammar above
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
NSString *s = @"(+ a - b c))";
@try {
PKAssembly *res = [p parse:s];
NSLog(@"res %@", res);
}
@catch (NSException *exception) {
NSLog(@"Parse Error:%@", exception);
}
,你会得到一个不错的十岁上下的人可读的错误:
Parse Error:
After : (+ a
Expected : Alternation (term)
Found : -
希望这有助于。