Я пытаюсь выяснить правила грамматики для любого математического выражения.
Я использую EBNF (статья вики, ссылка на которую приведена ниже) для получения правил синтаксиса.
Мне удалось придумать одно, которое какое-то время работало, но правило грамматики не работает с onScreenTime + (((count) - 1) * 0.9)
.
Правило следующее:
math ::= MINUS? LPAREN math RPAREN
| mathOperand (mathRhs)+
mathRhs ::= mathOperator mathRhsGroup
| mathOperator mathOperand mathRhs?
mathRhsGroup ::= MINUS? LPAREN mathOperand (mathRhs | (mathOperator mathOperand))+ RPAREN
Вы можете с уверенностью предположить, что mathOperand
являются положительными или отрицательными числами или переменными. Вы также можете предположить, что mathOperator
обозначает любой математический оператор, такой как + или -.
Кроме того, LPAREN
и RPAREN
— это '(' и ')' соответственно.
EBNF: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form
РЕДАКТИРОВАТЬ Забыл упомянуть, что это не удается (count) - 1
. Он говорит, что ожидается RPAREN
вместо - 1
.
РЕДАКТИРОВАТЬ 2 Мой пересмотренный EBNF теперь выглядит так:
number ::= NUMBER_LITERAL //positive integer
mathExp ::= term_ ((PLUS | MINUS) term_)* // * is zero-or-more.
private term_ ::= factor_ ((ASTERISK | FSLASH) factor_)*
private factor_ ::= PLUS factor_
| MINUS factor_
| primary_
private primary_ ::= number
| IDENTIFIER
| LPAREN mathExp RPAREN