我正在尝试为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 = ')';
另外,我将如何添加一些额外的回调,以便我可以从语法中创建一个解析树。
答案 0 :(得分:3)
ParseKit的开发人员。
我看到一个明显的问题:conjunction
在你的语法的几个地方拼错了。
ParseKit的语法分析器的错误消息不是最好的。理想情况下,您会收到一条很好的错误消息,引导您解决问题(但是,嘿,它是开源的,所以欢迎任何人提供这种性质的修复)。
但是,我可以告诉你我是如何找到这些问题的:
~/Desktop/grammar.txt
~/Desktop/input.txt
DebugApp
目标。 Run
按钮。如果您的语法中存在错误,您会发现异常最有可能发生在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)*;
这就是我注意到这一行中有拼写错误的方式。
这种方法总会引导你进入语法中存在问题的路线。希望有所帮助。