質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

2446閲覧

LL(k)構文解析について

Yoshinari

総合スコア13

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2017/08/05 04:18

編集2017/08/05 04:22

構文解析に関する質問です。
ある文法で、
P={S→B,
B→E | if(E)B | if(E)B else B,
E→E+T | T,
T→n | -T | (E)}
というのがあったのですが、
この場合、if(E)B というのはどう扱えばい
いのですか?
一応、自分が考えたのは、S→B→EB→EEB→...です。ご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご質問の文法には4つの規則があります。終端記号をこのように表してみました (nは実際は非終端記号なのではないかと思いますが、簡単のため終端記号とみなします)。

  1. S → B
  2. B → E | if ( E ) B | if ( E ) B else B
  3. E → E + T | T
  4. T → n | - T | ( E )

規則 2. は、「B」から「E」、「if ( E )」、「if ( E ) B else B」のいずれかを得ることができる、という意味です。ですからたとえば

  • 規則1. により、S → B
  • 規則2. により、B → if ( E ) B
  • ……

などとすることができます。さらに続ければ、たとえば

  • 規則2. により、if ( E ) B → if ( E ) if ( E ) B else B
  • 規則2. により、if ( E ) if ( E ) B else B → if ( E ) if ( E ) E else B
  • ……

などとすることもできます (同じ規則は可能な限り何回でも適用できますし、同じ規則でいつも同じものが得られるとも限りません)。最終的に終端記号のみを含むものができれば、それは文法Pに適合する文であるということになります。たとえば次のようなものです (適宜改行しています)。

c

1if(-n+n) 2 if(n) 3 n+n 4 else 5 if(--n) 6 n 7 else 8 n+-(n+n)

これはひとつの例でしかありません。文法Pが生成できる文は無限にあるということが分かりますね。


一方、冒頭の規則には B から E B を得ることができるものは含まれていませんから、ご質問のように

  • S → B
  • B → E B
  • E B → E E B
  • ……

などとすることはできません。


LL構文解析では、上の例とは逆に、実際の文から規則に合った構文木を作成し、最終的に最初の非終端記号Sを導出することで文法Pに適合していることを確認します。

【おまけ】上の生成された文の例には、構文解析をしようとすると問題が起きる箇所があります。どういう問題が起きるのか、考えてみて下さい。

投稿2017/08/24 03:16

ikedas

総合スコア4352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問