如何调试无效的ParseKit语法?

时间:2012-11-30 01:10:48

标签: objective-c grammar parsekit

我正在尝试为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 = ')';

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

1 个答案:

答案 0 :(得分:3)

ParseKit的开发人员。

我看到一个明显的问题:conjunction在你的语法的几个地方拼错了。


ParseKit的语法分析器的错误消息不是最好的。理想情况下,您会收到一条很好的错误消息,引导您解决问题(但是,嘿,它是开源的,所以欢迎任何人提供这种性质的修复)。

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

  1. 将您的ParseKit工作副本更新为google code主干的头部。
  2. 在Xcode中,打开断点并为所有异常添加断点
  3. 将您的ParseKit语法放在此文件中:~/Desktop/grammar.txt
  4. (可选)将任何示例输入放在此文件中:~/Desktop/input.txt
  5. 在Debug配置中运行ParseKit DebugApp目标。
  6. 点击应用运行时显示的窗口中的大Run按钮。
  7. 等待抛出异常。断点被击中。
  8. 如果您的语法中存在错误,您会发现异常最有可能发生在ParseKit Assembler回调中:

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

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

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

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

    conjuction (or conjuction)*;
    

    ^(插入符号)的位置,您可以看到解析器在看到第一个conjuction后立即被阻塞。

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

    disjunction = conjuction (or conjuction)*;
    

    这就是我注意到这一行中有拼写错误的方式。

    这种方法总会引导你进入语法中存在问题的路线。希望有所帮助。