Theodore Norvell(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 --> "-"
しかし、私は彼がどのようにしてこの結果を得たのか理解できません。左側の再帰を自分で削除しようとすると、次のようになります。
まず、私は1つのグループに再帰を残していないプロダクションをグループ化し、別のグループに他の(左再帰)をグループ化します。
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 --> "-"
これで、最初の2つのプロダクションのみを処理する必要があり、処理が簡単になりました。
最初の2つのプロダクションを、非L再帰プロダクション(単純
P
に、一次式)から開始し、その後にオプションのTail を書き直しT
ます。 (つまり、B E
)に続いてTailT
、または空の場合があります:E --> P T T --> B E T |
(テールの空の代替に注意してください)。
これらの2つのプロダクションは、EBNFで次のように書き直すことができます。
E --> P {B E}
これは著者が得るものとほぼ同じですが、
E
代わりにP
ゼロ以上の繰り返しパターン(テール)の中にあります。他の作品は、彼が手に入れたものとまったく同じです。P --> v | "(" E ")" | U E B -> "+" | "-" | "*" | "/" | "^" U -> "-"
しかしここでも、私は持っている
E
代わりのP
ための最初の生産にP
。
だから、私の質問です:私は何が欠けていますか?オートが取得するのと同じ正確な形式を取得するために、次に進む必要がある構文の代数的変換は何ですか?私はの置換を試みましたE
が、それは私をループに導くだけです。私は代用する何とか必要があると思われるP
ためにE
、私はそれを正当化する法的変換を知りません。たぶん、最後の足りないステップは何か知っていますか?