У статті Розбиття виразів за допомогою рекурсивного походження Теодора Норвелла (1999) автор починає з наступної граматики для арифметичних виразів:
E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v
що досить погано, тому що це неоднозначно і ліво-рекурсивно. Тож він починає з видалення лівої рекурсії від неї, і його результат такий:
E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"
Але я не можу зрозуміти, як він дійшов до цього результату. Коли я намагаюся видалити ліву рекурсію самостійно, я роблю це наступним чином:
Ялиці, я групую постановки, які не залишили рекурсії в одній групі, а інші (ліво-рекурсивні) в іншій групі:
E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E // L-recursive E --> v | "(" E ")" | "-" E
Далі я називаю їх і визначаю для легших маніпуляцій:
E --> E B E // L-recursive; B stands for "Binary operator" E --> P // not L-recursive; P stands for "Primary Expression" P --> v | "(" E ")" | U E // U stands for "Unary operator" B --> "+" | "-" | "*" | "/" | "^" P --> "-"
Тепер мені потрібно розібратися лише з першими двома постановками, з якими зараз легше розібратися.
Я переписую ці перші дві постановки, починаючи з не-L-рекурсивного виробництва (що просто
P
, первинний вираз) і слідуючи за ним за необов'язковим хвостомT
, який я визначаю як решту початкового виробництва за винятком першого ліво-рекурсивного нетерміналу (тобто простоB E
), за яким йде ХвістT
, або який може бути порожнім:E --> P T T --> B E T |
(зверніть увагу на порожню альтернативу для хвоста).
Ці дві постановки я зараз можу переписати у EBNF так:
E --> P {B E}
це майже те, що отримує автор, але я маю
E
замістьP
нуля або більше повторення (Хвіст). Інші постановки я отримую зовсім так само, як і у нього:P --> v | "(" E ")" | U E B -> "+" | "-" | "*" | "/" | "^" U -> "-"
але тут я маю
E
замість того, щобP
у першому виробництві дляP
.
Отже, моє запитання: Що я пропускаю? Яке алгебраїчне перетворення в синтаксисі мені потрібно продовжити зараз, щоб отримати таку ж точну форму, як отримує автор? Я спробував заміни E
, але це веде мене лише до циклів. Я підозрюю , що мені потрібно як - то замінити P
на E
, але я не знаю , який - або правової трансформації , щоб виправдати його. Можливо, ви знаєте, що останній пропущений крок?