2016-10-01 2 views
0

Я пытаюсь написать грамматику для оценки уравнения, которое может быть или не быть окружено скобками. экс -Антлr4 грамматика дополнительные скобки вокруг строки

  1. (НЕ 'привет' str1 спички)
  2. NOT ('привет' str1 спички)
  3. (NOT (str1 совпадает с 'привет')) 'привет'
  4. не str1 Совпадает

В моих правилах, я

clause 
: expression EOF 
; 

expression 
: 
    LPAREN expression RPAREN       #parenExpression 
| isNumeric          #isNumericExpression 
| leftSide IS NOT? NULL        #nullExpression 
| compare           #comparatorExpression 
| NOT             #notExpression 

; 


compare : NOT? LPAREN? NOT? leftSide op=comparator rightSide RPAREN? ; 

Теперь, есть несколько проблем остроумия h это.

  1. Я не проверю, совпадают ли левые и правые скобки.
  2. Существует не более ONE NOT в статье.

Любая помощь по написанию грамматики для этих правил была бы очень полезна.

Заранее благодарен!

ответ

2

Концептуально, выражение являются (как правило) либо комплекс, т.е. , рекурсивным или просто:

expression 
    : LPAREN expression RPAREN     #parenExpression 
    | NOT expression       #notExpression 
    | simpleExpression       
    ; 

simpleExpression 
    : isNumeric        #isNumericExpression 
    | leftSide IS NOT? NULL     #nullExpression 
    | leftSide op rightSide     #comparatorExpression 
    ; 

Первый комплекс альт позволяет любой уровень сбалансированной скобки вокруг выражения. Второй позволяет одному или нескольким NOT s предшествовать любому выражению.

Простые альты представляют собой самые основные формы выражения.

Так, (NOT (str1 matches 'hello')) будет подкреплен

parenExpression ->notExpression ->parenExpression ->comparatorExpression.

Конечно, два правила могут быть объединены в один.

+0

Спасибо, @GRosenberg. Я попробую этот подход. – user100001

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