- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道是否有一种方法可以返回 PKParser 在遇到语法错误之前已解析到程序集中的程度。
我使用的语法基本上描述了前缀表示法表达式语言。
例如:
给定你的标准前缀表示法表达式语法和一个字符串“(+ a - b c))”我想检索 [(,+,a] 匹配的地方,这样我就可以让用户知道在哪里可以修复他们的错误,但是 completeMatchFor 和 bestMatchFor 不会返回任何我可以用来找到它的东西信息。
理想情况下,我想说 '(' 是预期的,但对于像我正在使用的语法一样简单的语法,它不是必需的。
从作为用户手册提到的书中,似乎我需要为此创建一个自定义解析器,但我希望我可能只是错过了框架中的一些东西。
想法?
最佳答案
ParseKit 的开发者|在这里。
ParseKit 中有两个功能可用于帮助提供描述输入中遇到的解析错误的用户可读提示。
-[PKParser bestMatchFor:]
PKTrack
类听起来您知道 -bestMatchFor:
方法,即使在这种情况下它没有按照您的预期进行。
我认为 PKTrack
类在这里会更有帮助。如 Metsker's book 中所述, PKTrack
与 PKSequence
完全一样,除了它的子解析器是必需的,并且当它的所有子解析器都不匹配时会抛出错误(带有有用的错误消息)。
下面是您的示例输入的语法:
@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/
问题: 不知道如何翻译 Antlr4“.g4”语法文件的内容以匹配 ParseKit 的语法. 具体来说: 如何翻译-> Channel(HIDDEN);从 Antlr4 语法到 ParseKit 语
当使用 iPhone 的解析器 Parsekit 时。是否可以包含双引号?哪些东西是特殊 BNF 的一部分?(是否可以在定义的语法中转义序列?) @start = doublequote+; doub
我正在使用与 ParseKit 捆绑在一起的 DemoApp,我遇到了一个奇怪的问题。我创建了这个语法: @start = tag; tag = '{' Word ';' Word '}'; 它会解
给定一个简单的 Parsekit 语法。 @start = sentence+; sentence = 'beer' container; container = 'bottle' | 'cup';
我正在尝试为 Parsekit 编写语法以用于我的 iphone 应用程序。我这样做正确吗? @start = wff; wff = disjunction ('IMPLIES' | disjunct
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我为 ParseKit 编写了一个 C 语法,它工作得很好,但让我发疯的是预处理器语句。预处理器语句的正确符号定义是什么? 这是我尝试过的简短示例...... @reportsCommentToken
我正在编写一个需要解析 Wine 菜单的应用程序。据我目前所见,它们都遵循某种结构,关键在于定义所有这些结构。 我现在正在探索使用 Parsekit 和创建语法,但学习曲线非常陡峭。与其花接下来的几周
我正在尝试为 ParseKit 编写语法,以便它与 iphone 应用程序中的基本命题逻辑句子相匹配。有人可以告诉我我哪里出错了。 @start = wff; wff = disjunction (i
对于我的应用程序,我正在尝试构建一个 SQLite解析器。由于我的应用程序使用的是 Objective-C,ParseKit似乎是一个不错的选择。我读过 SQLite 的 syntax diagram
我正在尝试让 ParseKit 的 Tokenizer 识别换行符并且不识别其他空白字符。 此外,示例还展示了如何使其识别以哈希开头的注释,但创建的函数似乎仅适用于单个字符。我想让 PK 识别以两个破
我刚刚发现了 ParseKit,但似乎无法让它在一个简单的例子中工作。 NSString *test = @"FOO:BAR"; NSString *grammar = ...//get gr
我正在使用 PK 尝试标记化 .gift 文件格式。我正在尝试执行以下操作: 给定一个类似这样的字符串:@"= 2 + 2" 我试图返回“2 + 2”,而无需确定经过该字符串的标记是否等于一个符号,然
在掌握了一些 ParseKit 语法语法(在演示应用程序中试玩)之后,我现在正在尝试让我自己的迷你演示正常运行,但到目前为止还没有取得太大的成功。汇编程序回调未被调用。 以下是相关代码的精简版。当 t
我想知道是否有一种方法可以返回 PKParser 在遇到语法错误之前已解析到程序集中的程度。 引用:http://parsekit.com/ 我使用的语法基本上描述了前缀表示法表达式语言。 例如: 给
我应该如何在 parekit 中使用回调函数?假设我有以下规则: expr_s = expr_p '+' expr_s | expr_p ; 我应该从生成的 PKAssembly 中弹出 3 个符号并
我正在尝试使用 ParseKit's Tokenization使用 SQL Server 语法。如果您看一下以下示例: CREATE PROCEDURE [dbo].[test] @MyId UN
我正在尝试归档使用 ParseKit 的 iPad 应用程序。对于使用调试配置的任何构建(即在设备/模拟器上运行并进行分析),我能够利用 ParseKit 正常运行该应用程序。但是,当我使用发布配置时
对于 iOS 应用程序,我想解析一个 HTML 文件,该文件可能包含用于替换的 UNIX 样式变量。例如,HTML 可能如下所示: ${title} ${paragrap
我正在为我正在从事的项目构建一个语法来使用 ParseKit 解析 Newick 树,我已经走到这一步了。它基于此处的语法:http://en.wikipedia.org/wiki/Newick_fo
我是一名优秀的程序员,十分优秀!