2013-11-12 2 views
4

Я строю анализатор поверх TDArithmeticParser.m тестов ParseKit. Я продлил TDArithmeticParserTest.m с тестом failing:Arithmetic Parser

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

Thx за подсказку, что результат отсутствует, Мартин. Результат 0.0, что является результатом нильского броска в двойное. Я обновил код выше. – Muscovado

ответ

3

Разработчик ParseKit здесь.

Во-первых, примечание: TDArithmeticParser - это просто некорректный образец кода, включенный в тестовый комплект для ParseKit. Это не часть самого ParseKit.

Похоже, это ошибка/дефицит в TDArithmeticParser классе, где -15 признан отрицательных пятнадцати, не вычесть пятнадцать.

Если добавить пробелы, этот вопрос решен:

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

Противоположное поведение также возможно с небольшим изменением, но автономный -15 не будет признан действительным вход (который может или не может быть проблемой для вас).

Оба могут поддерживаться одновременно с некоторыми изменениями в обратных вызовах грамматики и ассемблера.

+0

Но действительно ли это проблема TDArithmeticParser? К сожалению, для меня изменение текста, который я хочу разобрать, не очень хороший вариант. Я ищу лучшее решение, чтобы выполнить какой-то «предварительный синтаксический анализ», чтобы предотвратить эту проблему. BNF-грамматика выглядит хорошо для меня, и код соответствует грамматике ... Нужен ли парсер для дальнейшей настройки? Я просто использую то, что выходит из парсера PKParser, как TDArithmeticParser делает ... – Muscovado

 Смежные вопросы

  • Нет связанных вопросов^_^