Реализация инфикса в CFG - PullRequest
0 голосов
/ 19 октября 2018

У меня есть вопрос, касающийся построения базовой контекстно-свободной грамматики.Моя грамматика предназначена для разбора математических утверждений.У меня есть это до сих пор:

E --> P
E --> E + P
P --> A
P --> P * A
A --> (E)
A --> n

Мне нужно реализовать еще один нетерминальный X, который представляет инфиксный оператор (^), означающий возведение в степень.Я не знаю, как реализовать X таким образом, чтобы он был правоассоциативным и имел более высокий приоритет, чем оба * и +.Я не понимаю, как вышеупомянутый CFG заставляет * иметь более высокий приоритет, чем +.Будем весьма благодарны за любые пояснения к этим двум вопросам (как * имеет более высокий приоритет, чем + в приведенном выше CFG и как правильно реализовать ^).

1 Ответ

0 голосов
/ 19 октября 2018

Ни P, ни A не могут произвести x+y.Следовательно, * должен связываться более плотно, чем + в x+y*z или z*x+y.

Аналогично, P может производить x*y, а A - нет.Таким образом, учитывая, что соответствующая продукция равна P*A, единственный действительный синтаксический анализ для x*y*z это P => x*y; A => z.Это делает * левоассоциативным.

Если вы нарисуете несколько синтаксических деревьев, это может стать еще яснее.

...