2014-10-25 3 views
0

Я пытаюсь разобрать эту строку с peg.js:разбор логического выражения цепи с pegjs

filter a > 2 or b < 3 or b > 10 or c = 12 

Соответствующий экстракт грамматики выглядит следующим образом:

bool "bool" 
    = left:expr space+ logicOp:logicOp space+ right:bool { return new options.BooleanExpr(left, logicOp, right); } 
/expr:expr { return expr; } 


bools "bools" 
    = left:bool morebools:(space+ logicOp space+ bool)+ { return options.makeBooleanChain(left, morebools); } 
/bool:bool { return bool; } 


filter "filter" 
    = "filter"i space+ _bool:bools { return new options.FilterCmd(_bool); } 

Проблема заключается в том, что boolean chain не будет распознаваться более чем для 2 выражений (expr1 или expr2), и я не знаю, как анализировать детали «или exprN». Я ввел правило «bools», но это тоже не работает. Любая идея о том, как я могу решить эту проблему и разобрать произвольно длинные булевские выражения?

+1

Посмотрите на pegJS онлайн, например, его анализирует арифметические выражения. – HBP

+0

+1 Спасибо, я попробовал это раньше, но имел еще одну ошибку, из-за которой правило ловить. На самом деле это очень просто ... – orange

ответ

0

Возвращаясь к онлайн, например, как предложено @HBP, мне удалось создать рабочее правило:

bool "bool" 
    = left:expr space+ logicOp:logicOp space+ right:bool { return new options.BooleanExpr(left, logicOp, right); } 
/expr 

Это само по себе делает работу ...

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

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