LR法
Left-toright parse, Rightmost-derivation, k-token lookahead
左から読んでいき、最右導出で解析していく
LR(k)法はk個のTokenを先読みして、「生成規則の右辺全体」に一致する入力トークンを走査し終わるまで、決定を延期する
多くのプログラミング言語はLR法で解析できる
C++とPerlは無理らしい ref
なんで #??
嬉しいところ
効率が良い
左から右へ読んでいくものの中では構文エラーを素早く検出できる
欠点
LL法に比べエラーメッセージを適切に出しにくい
以下の3つより構成される
入力
parserの入力にあたるToken列のこと
ex. [a,+,b,*,c,$]
LR法の構文解析表
スタック
つまりなに #??
状態と記号を交互に積む
$ s_0,X_1,s_1,X_2,s_2,\cdots,X_m,s_m
$ sは状態に対応した終端記号
普通に入力の一文字のこと?
ちがう
終端記号と非終端記号
これは微妙に流派があり、状態は積まないものもある
Wikiとか
積んだもののほうがわかりやすいと思うmrsekut.icon
以下の2つの動作で構文解析を実行する
Shift (LR法)
Reduce (LR法)
LR法の構文解析の手順
参考
タイガーブック p.50~
https://ja.wikipedia.org/wiki/LR法
https://www.jstage.jst.go.jp/article/jssst/31/1/31_1_30/_pdf
https://lss.osakafu-u.ac.jp/pluginfile.php/651761/mod_resource/content/1/08.pdf
https://www.slideshare.net/ichikaz3/lr-parsing