4

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

- (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;

我将非常感谢任何有助于我识别问题的想法。

4

1 回答 1

3

ParseKit的开发者在这里。

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

看起来这是TDArithmeticParser班级中的一个错误/缺陷,-15被认为是负十五,而不是减去十五

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

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

稍作更改也可能出现相反的行为,但是独立的-15输入不会被识别为有效输入(这对您来说可能是也可能不是问题)。

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

于 2013-11-12T22:00:00.803 回答