2012-03-02 25 views
4

私が理解しているように、以下のケースでは、トップダウンパーサーを構築するために左寄りが必要です。 これを行う方法を理解することは難しいですか?誰かがここで私を助けることができる?ありがとう。文脈自由文法を残す方法を教えてください。

s = a | b 
b = c d 
c = (e | f) g 
e = a | h 
+0

「a」、「d」、「f」、「g」、「h」というプロダクションがどのようなものであるかによって異なります。彼らが「シンプルな」端末であれば、左のファクタリングは必要ありません、AFAIK。 –

+0

@BartKiers:私の例では、bはb-> c-> e-> aを通過すれば、左にもbが入っています。つまり、 's = a | +何か '。あなたはまだ左の因数分解は必要ないと言っていますか?ありがとう。 – Bee

+0

@Bhathiya:左のファクタリングは文法を変換するために適用され、コントロールはトークンを消費せずにループできないため、解析する際に無限ループにつながります。ここではそうではありません。ここでの問題は、この文法をLL(1)(単一シンボル先読み)パーサーで解析できないことです。 –

答えて

6

すべての非ターミナルはここでしか一度参照されているので、我々は単一の式で一緒に全体の文法を引くことができます。

s = a | ((a | h | f) g d) 

だから我々は、2つの基本的なバリエーションを持っていると、端末は、オプションに続きますg、dのいずれか、またはhまたはfのいずれかが常にgとdの後に続く。

だから我々は、我々はその後、Eを導入することにより、B」における共通の開始記号としてプルアップすることができます

s = b' | c' 
b' = a | a g d 
c' = (h | f) g d 

や、独自の生産に共通GDシーケンスを引っ張っ

s = b' | c' 
b' = a | a e' 
c' = (h | f) e' 
e' = g d 

を持っています(空)オプション:

s = b'' | c' 
b'' = a (e' | E) 
c' = (h | f) e' 
e' = g d 

文法は今や明確です。

関連する問題