4

ParseKit Tests のTDArithmeticParser.mの上にパーサーを構築しています。テストでTDArithmeticParserTest.mを拡張しました。failing

- (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の開発者はこちら。

最初に、注意: TDArithmeticParserParseKit のテスト バンドルに含まれている (それほど堅牢ではない) サンプル コードです。ParseKit 自体の一部ではありません。

TDArithmeticParserこれは、クラスのバグ/欠陥のように見えます。これは、減算 15ではなく、負の 15-15として認識されます。

空白を追加すると、この問題は解決されます。

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

小さな変更で逆の動作も可能ですが、スタンドアロン-15は有効な入力として認識されません (問題になる場合とそうでない場合があります)。

Grammar と Assembler のコールバックにいくつかの変更を加えることで、両方を同時にサポートできます。

于 2013-11-12T22:00:00.803 に答える