2

我正在尝试为 ParseKit 编写语法,以便它匹配 iphone 应用程序中的基本命题逻辑句子。有人可以告诉我我哪里出错了。

@start = wff;
wff = disjunction (implies disjunction)?;
disjunction = conjuction (or conjuction)*;
conjunction = notExpression (and notExpression)*;
notExpression = (not | not primaryExpression);
primaryExpression = variable | lbracket wff rbracket;
variable = p | q | r;

p = 'P';
q = 'Q';
r = 'R';

implies = '→';
and = '∧';
or = '∨';
not = '¬';
lbracket = '(';
rbracket = ')';

另外,我将如何添加一些额外的回调,以便我可以从语法中创建解析树。

4

1 回答 1

3

ParseKit的开发者在这里。

我看到一个明显的问题:conjunction在您的语法中的几个地方拼写错误。


ParseKit 的 Grammar Parser 的错误信息并不是最大的。理想情况下,您会收到一条很好的错误消息,引导您解决问题(但是,嘿,它是开源的,所以欢迎任何人贡献这种性质的修复程序)。

但是,我可以告诉你我是如何发现这些问题的:

  1. 将您的 ParseKit 工作副本更新为google 代码主干的头部。
  2. 在 Xcode 中,打开断点并为所有异常添加断点
  3. 将 ParseKit 语法放在此文件中:~/Desktop/grammar.txt
  4. (可选)在此文件中放置任何示例输入:~/Desktop/input.txt
  5. DebugApp在调试配置中运行 ParseKit目标。
  6. Run单击应用程序运行时出现的窗口中的大按钮。
  7. 等待抛出异常。断点被击中。

如果您的语法中有错误,您会发现异常很可能发生在 ParseKit 汇编程序回调中,例如:

- (void)parser:(PKParser *)p didMatchExpression:(PKAssembly *)a

打印a到调试控制台。你会看到类似的东西:

(lldb) po a
(PKAssembly *) $1 = 0x00000001075a9010 [] /conjuction/ ^(/or/ /conjuction/)/*

这是PKAssembly传递给回调的对象的打印输出。在这里你可以看到 ParseKit 的语法解析器在哪里无法解析你的语法。ParseKit Grammar Parser 在解析这个表达式时似乎失败了:

conjuction (or conjuction)*;

^(caret) 的位置,你可以告诉解析器在看到第一个conjuction.

此表达式仅位于语法中的一行:

disjunction = conjuction (or conjuction)*;

这就是我注意到这一行中有一个拼写错误的原因。

这种方法总是会引导你找到语法中有问题的行。希望有帮助。

于 2012-11-30T03:02:56.250 回答