算术解析器

时间:2013-11-12 17:17:13

标签: objective-c parsekit

我正在ParseKit测试的TDArithmeticParser.m之上构建一个解析器。我使用failing测试扩展了TDArithmeticParserTest.m

- (void)testMath {
    s = @"10+(2*3)-15";
    result = [p parse:s];
    TDEquals((double)1.0, result); // result == 0.0
}

问题在于我不明白为什么语法不能用于此测试。算术解析器的相应BNF语法是:

expr           = term (plusTerm | minusTerm)*;
term           = factor (timesFactor | divFactor)*;
plusTerm       = '+' term;
minusTerm      = '-' term;
factor         = phrase exponentFactor | phrase;
timesFactor    = '*' factor;
divFactor      = '/' factor;
exponentFactor = '^' factor;
phrase         = '(' expr ')' | Number;

我会非常感谢有助于我发现问题的任何想法。

1 个答案:

答案 0 :(得分:3)

ParseKit的开发人员。

首先,请注意:TDArithmeticParser只是ParseKit测试包中包含的一些(非常非常强大)示例代码。它不是ParseKit本身的一部分。

这似乎是TDArithmeticParser类中的错误/缺陷,其中-15被识别为负十五,而不是减去十五。< / p>

如果添加空格,则解决此问题:

s = @"10+(2*3)- 15";

相反的行为也可以通过一个小的改变,但是单独的-15不会被识别为有效的输入(这可能是也可能不是你的问题)。

对于语法和汇编程序回调的一些更改,可以同时支持两者。