Арифметическое выражение грамматика - PullRequest
2 голосов
/ 07 июня 2011

Я пытаюсь создать подходящий грамматик для некоторых арифметических выражений.Действительные токены для моих выражений следующие:

'+', '-', '/', '*' и '**' для полномочий.Выражения также могут содержать символы и функции.Функции могут принимать несколько аргументов, некоторые из которых могут быть необязательными.Из того, что я помню из разбора выражения, я должен придумать грамматику, которая не является леворекурсивной и также сохраняет ассоциативность операторов.

Итак, вот что я придумал после небольшого поиска (хотя и не уверен насчет ассоциативности):

E = T Eopt
Eopt = '+' T Eopt | '-' T Eopt | ε 
T = F Topt
Topt = '*' F Topt | '/' F Topt | ε
F = Number | '(' E ')' 

, который можно найти во многих учебниках.Какие изменения необходимы в приведенной выше грамматике, чтобы она могла сочетать токен питания ('**'), а также символы и функции?

Пожалуйста, не указывайте мне на flex / yacc и т. Д. Спасибо.

1 Ответ

1 голос
/ 07 июня 2011

Ты почти у цели.Изменения начинаются с F:

E = T Eopt
Eopt = '+' T Eopt | '-' T Eopt | ε 
T = F Topt
Topt = '*' F Topt | '/' F Topt | ε
F = P Fopt
Fopt = '**' P Fopt | ε
P = Number | '(' E ')'

Это предполагает, что ваш токенизатор различает * и **.

...