2015-09-29

はてブBNF手法が上がっておりますがここでBNF記法手法をご覧下さ

  • 株の方のBNF

http://tradenote.info/blog-entry-3.html


一般に、バッカスナウア記法正規表現では処理できないネスト階層記憶できるなどの根本的な差があります

これは正規表現が有限決定性オートマトンDFA)ないしε遷移と不特定の同種記号の遷移を用いる非決定性オートマトン(NFA)に基づいているのに対し、BNF記法での解析は必然的スタックを内部状態に持つからです。


代表的ものに以下の種類の構文解析処理方法が挙げられます


https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E4%B8%8B%E9%99%8D%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90

https://ja.wikipedia.org/wiki/LL%E6%B3%95

これは左からトークンを走査して、導出する非終端記号を左から決定していくアルゴリズムです。

例えばA→A Bという構文規則があった場合に、Aの還元内でAを還元できるかどうか判定し続けて無限ループに陥ってしまい、いつまで経ってもBの判定に辿り着けません。これを左再帰といい、LLでは左再帰を直接扱う事ができません。

非終端記号の間接的還元考慮したはじめに現れる終端記号の集合(FIRST集合)を構築して上手く左再帰回避しなければなりません。

マッチングに用いる規則ベタ関数内部に再帰させながら順番に書いていくだけなので実装は容易です。


  • LR法

https://ja.wikipedia.org/wiki/LR%E6%B3%95

  • LALR法

https://ja.wikipedia.org/wiki/LALR%E6%B3%95

こちらは左からトークンを走査して、導出する非終端記号を右から構築するアルゴリズムです。

BNF構文規則から走査に相応するDFAを構築し、DFAの遷移を記憶しながらスタック状態push/pop構文解析を行います

なのでLL法にあるような左再帰を直接扱えないという欠点がなく、むしろスタックが簡潔になるため積極的に左再帰BNF記述を行った方が効率よく処理を進められます

LR法はDFAの大きさが巨大になるため、実用的ではないようです。

LALR法はLR法を改良したアルゴリズムで、扱える構文クラス範囲はLRよりも少し小さくなります現実的計算資源構文解析を行う事ができます

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん