gpt4 book ai didi

objective-c - 如何使用 ParseKit 框架查找解析错误

转载 作者:太空狗 更新时间:2023-10-30 04:02:22 24 4
gpt4 key购买 nike

我想知道是否有一种方法可以返回 PKParser 在遇到语法错误之前已解析到程序集中的程度。

引用:http://parsekit.com/

我使用的语法基本上描述了前缀表示法表达式语言。

例如:

给定你的标准前缀表示法表达式语法和一个字符串“(+ a - b c))”我想检索 [(,+,a] 匹配的地方,这样我就可以让用户知道在哪里可以修复他们的错误,但是 completeMatchFor 和 bestMatchFor 不会返回任何我可以用来找到它的东西信息。

理想情况下,我想说 '(' 是预期的,但对于像我正在使用的语法一样简单的语法,它不是必需的。

从作为用户手册提到的书中,似乎我需要为此创建一个自定义解析器,但我希望我可能只是错过了框架中的一些东西。

想法?

最佳答案

ParseKit 的开发者|在这里。

ParseKit 中有两个功能可用于帮助提供描述输入中遇到的解析错误的用户可读提示。

  1. -[PKParser bestMatchFor:]
  2. PKTrack

听起来您知道 -bestMatchFor: 方法,即使在这种情况下它没有按照您的预期进行。

我认为 PKTrack 类在这里会更有帮助。如 Metsker's book 中所述, PKTrackPKSequence 完全一样,除了它的子解析器是必需的,并且当它的所有子解析器都不匹配时会抛出错误(带有有用的错误消息)。

下面是您的示例输入的语法:

@start         = '(' expr ')' | expr;
expr = ('+' | '-') term term;
term = '(' expr ')' | Word;

任何连续列出的作品都是一个序列——但也可以是一个轨道。

将这些 Sequences 更改为 Tracks 的好处是,如果输入不匹配,将抛出 NSException 以及人类可读的解析错误消息。缺点是您现在必须将工厂生成的解析器的所有用法包装在 try/catch block 中以捕获这些 Track 异常。

当前(或至少之前)的问题是 PKParserFactory 从未使用 Tracks 生成解析器。相反,它将始终使用序列。

所以我只是Google Code 的主干中添加了一个新选项(你需要更新)。

#define USE_TRACK 0

PKParserFactory.m

默认为0。如果将此定义更改为 1,将使用 Tracks 而不是 Sequences。所以给定上面的语法和这样的无效输入:

(+ 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 : -

希望对您有所帮助。

关于objective-c - 如何使用 ParseKit 框架查找解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10002892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com