Microsoft PowerPoint - 08LR-conflicts.ppt [互換モード]

Similar documents
文法と言語 ー文脈自由文法とLR構文解析2ー

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

nlp1-04a.key

Microsoft PowerPoint - 13Kadai.pptx

数理言語

Microsoft PowerPoint - 04SyntaxAnalysis.ppt [互換モード]

18/12/06 情報工学実験 C コンパイラ (2018 年度 ) 担当 : 笹倉 佐藤 その 3 yacc の構造 定義部 %% 定義部の終了 規則部 %% 規則部の終了 ユーザ定義サブルーチン部 :C のプログラムを書く 形は lex と同じ 1

Microsoft PowerPoint - 3.ppt [互換モード]

Microsoft PowerPoint - アルデIII 02回目10月15日

Microsoft PowerPoint - 11Syntax.ppt

Microsoft PowerPoint - アルデIII 02回目10月14日

自然言語は曖昧性だらけ! I saw a girl with a telescope 構文解析 ( パージング ) は構造的な曖昧性を解消 2

PowerPoint プレゼンテーション

プログラミング言語処理系論 (4) Design and Implementation of Programming Language Processors

Microsoft PowerPoint - 02LanguageTheory.ppt [互換モード]

C8

Microsoft PowerPoint - Compiler06note.pptx

第12回 モナドパーサ

Microsoft PowerPoint - Compiler06.pptx

情報工学実験 C コンパイラ第 2 回説明資料 (2018 年度 ) 担当 : 笹倉 佐藤

Microsoft PowerPoint - 03BNFScanner.ppt [互換モード]

オートマトンと言語

Microsoft Word - problem3.doc

構文解析表の作成講義でも少し触れましたが 各選言で先頭に出現する可能性がある終端記号の集合 のことを DIRECTOR 集合とよびます DIRECTOR は direction( 方向 ) を決定するという意味を持っており LL(k) 構文解析器が非終端記号を解析する際に そのうちどの選言を利用する

parser.y 3. node.rb 4. CD-ROM

Microsoft PowerPoint - Compiler05note.pptx

Microsoft PowerPoint - 03BNFScanner-print.ppt

Microsoft PowerPoint - Compiler05.pptx

Functional Programming

Microsoft PowerPoint - 05DecisionTree-print.ppt

Microsoft Word - Javacc.docx

Microsoft PowerPoint - 05.pptx

CプログラミングI

JavaプログラミングⅠ

Microsoft PowerPoint L03-Syntex and Semantics-1-students ( )

nlp1-05.key

Microsoft PowerPoint - C_Programming(3).pptx

数理言語

今月の呼びかけ 添付資料 ファイル名に細工を施されたウイルスに注意! ~ 見た目でパソコン利用者をだます手口 ~ 2011 年 9 月 IPA に RLTrap というウイルスの大量の検出報告 ( 約 5 万件 ) が寄せられました このウイルスには パソコン利用者がファイルの見た目 ( 主に拡張子

1.

Microsoft PowerPoint ppt

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

JavaプログラミングⅠ

Microsoft Word - no206.docx

プログラミングD - Java

040402.ユニットテスト

変数を使えるようにする arithr.y を拡張して変数を使えるようにする 変数はアルファベット小文字一文字だけからなるものとする 変数の数はたかだか 26 なので,26 個の要素をもつ配列 vbltable に格納する 一行だけで計算が終わるのではなく数式を連続で計算できるようにし,$ が入力され

今回の予定 文法から パーサを作る BNF をそのまま解釈する BISON,YACC を動かしてみます 電卓 ( もどき ) を離れ本格的なプログラミング言語を記述するのに必要な構成要素を考えます 正常系だけを相手にするなら ( エラー処理を考えないなら ) 言語の実装はとても簡単 ( 課題ではない

PowerPoint プレゼンテーション

Microsoft Word - CompA-Ex doc

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110,

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

コンパイラとは プログラミング言語 ( 高級言語 ) で書かれたプログラムを入力し, コンピュータが実行できる言語 ( 機械語など ) に変換するプログラムのこと例 : gcc コンパイラは対応する言語によって複雑である場合もあるし単純である場合もある 本実験では簡単な言語のコンパイラを作成する

オブジェクト指向プログラミング・同演習 5月21日演習課題

Microsoft Word - Chap17

PowerPoint Template

Microsoft PowerPoint _2b-DOM.pptx

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Microsoft PowerPoint ppt

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

Microsoft PowerPoint - kougi10.ppt

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){


02: 変数と標準入出力

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - prog03.ppt

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力とな

/27 (13 8/24) (9/27) (9/27) / / / /16 12

スライド 1

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

プレポスト【解説】

GEC-Java

言語プロセッサ2005 -No.6-

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

図形言語処理システムにおける図形エディタと空間解析器の統合

構造化プログラミングと データ抽象

JavaScriptで プログラミング

untitled

オートマトン 形式言語及び演習 3. 正規表現 酒井正彦 正規表現とは 正規表現 ( 正則表現, Regular Expression) オートマトン : 言語を定義する機械正規表現 : 言語

メソッドのまとめ

Javaによるアルゴリズムとデータ構造

02: 変数と標準入出力

Microsoft PowerPoint - ruby_instruction.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - 集積回路工学_ ppt[読み取り専用]

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

情報処理Ⅰ

PowerPoint Presentation

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - sakurada3.pptx

untitled

3. 標準入出力

第2回

生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ

形式手法入門VDM++チュートリアル.key

Transcription:

属性文法 コンパイラ理論 8 LR 構文解析補足 : 属性文法と conflicts 櫻井彰人 Racc (Yacc 系のcc) は属性文法的 非終端記号は 値 (semantic value) を持つ パーザーは パーザースタックをreduceするとき ( 使う規則を X ::= s とする ) s に付随する semantic value (Racc では配列 valueにある ) を用いて action ( 意味動作 ) を実行する 結果は終端記号 X の値となる (Raccではresultに入れた値) パーザーが成功で終了すると 開始記号に付随する値を返す 属性文法 属性文法 ( ぞくせいぶんぽう Attribute Grammar) とは 形式文法の生成に関する属性を定義する形式的手法 属性には値を関連付けられる その言語を構文解析やコンパイラで処理する際に 属性の評価 ( 属性から値を得ること ) が抽象構文木上のノードで行われる 属性は 2 種類に分類される 合成 (sythesized) 属性と継承 (inherited) 属性である 合成属性とは 属性評価の結果として生成されるものであり 継承属性の値を使用することもある 継承属性とは 親ノードから継承される属性である いくつかの手法では 合成属性は意味情報を構文解析木の上に渡すのに使われ 継承属性は逆に下に渡すのに使われる 例えば 言語変換ツールを作成する場合 属性文法は構文要素に意味 ( 値 ) を設定するのに使われる また 文法 ( 構文規則だけでは明示的に示されない言語の規則 ) に従って意味論的検証を行うことも可能である Wikipedia より S 属性文法 S 属性文法と LR 属性文法 継承属性を持たない属性文法 トップダウン構文解析でもボトムアップ構文解析でも使用可能 yacc は S 属性文法に基づいている LR 属性文法 LR 法を使った構文解析での属性文法 ボトムアップ構文解析で使用 L 属性文法のサブセットであり S 属性文法のスーパーセットである yacc は部分的に LR 属性文法に基づいている In yacc, a common hack is to use global variables to simulate some kind of inherited attributes and thus LR-attribution. Wikipedia より 構文木と抽象構文木 Operator Node T ' T ' F T 2 T ' λ F Operand Node 2 λ 3 4 T ' F 3 4 λ # $Id: calc.y,v 1.4 2005/11/20 13:29:32 aamine xp $ # # Very simple calculater. 同位はエラー class Calcp 演算子順位の定義 同位は左結合 開始記号 ( 非終端記号 ) この規則適用後に返す値 右辺 2 番目 (0 番目が先頭 ) に帰って来た値 '-' BR =UMINUS { result = -val[1] } BR このマイナスは UMINUSと同じ強さ 1

再びですが 再び '-' BR =UMINUS { result = -val[1] } BR 曖昧な文法 '-' BR =UMINUS { result = -val[1] } BR 曖昧ではあるが 分かりやすいし 複数の構文木が得られたとき どちらが正しいかは ( 我々には ) すぐ分かる 試してみよう class Calcf '-' BR { result = -val[1] } BR $ racc -o calcf.rb calcf.y 16 shift/reduce conflicts $ ruby calcf.rb type "Q" to quit.? 23 = 5? 234 = 14? 234 = 14 BR 正しく構文解析するにはどうしたらよいか? こちらが欲しい :? こちらが欲しい : BR こちらが欲しい : BR 正しく構文解析するにはどうしたらよいか? SHIFT SHIFT SHIFT 2

こちらが欲しい : BR こちらが欲しい : BR RDUC RDUC 別の構文解析 こちらが欲しい : BR BR RDUC 先に RDUC したらどうなるか 別の構文解析 別の構文解析 BR BR RDUC 今度は : SHIFT SHIFT RDUC 3

別の構文解析 ここまでのまとめ BR BR こちらが欲しい : RDUC スタック上に あり, そして. Shift したい. こんなときいつでも shift したいというのも の優先度 precedence は より上. BR - BR - - - - - - スタック上に - あり, 次にあるのは -. 何をすべきか? スタック上に - あり, 次にあるのは -. 何をすべきか? RDUC BR - - BR - - - - - - - SHIFT SHIFT RDUC RDUC 4

BR 第 2 例 : まとめ - -. スタック上に - あり, 次にあるのは -. 何をすべきか? いつでも reduce をしたい. というのも は left-associative. - - を扱う 3 つの方法がある : 1) Racc に文句を言わせたままにする. Racc は (Yacc は ) shift-reduce conflict があると shift する ただし そうすると プログラマの意図が分かりにくくなる ; 他の部分をデバッグするのに支障がでるかも ; 一般的にはエレガントではない 2) あいまい性がない文法に書き換える 複雑かつ分かりにくくなるおそれあり 3) Racc (Yacc) の優先度指定を用いる もっとも普通 left, right, nonassoc 優先度が指示されると, Racc は終端記号と規則に優先度を割り当てる 終端記号の優先度は 左右結合が書かれている順番 ( またはその逆 指示に従う ) 書換規則の優先度は 最右端終端記号の優先度である 例 : 規則 ::= の優先度 == prec('') shift-reduce conflict の解消方法 : prec(terminal) > prec() ==> shift prec(terminal) < prec() ==> reduce prec(terminal) = prec() ==> assoc(terminal) = left ==> reduce assoc(terminal) = right ==> shift assoc(terminal) = nonassoc ==> エラー 終端記号 T が次 :...T スタック上の 規則の右辺 :... % '-' BR =UMINUS { result = -val[1] } BR 終端記号 T が次 :... '' prec('') > prec('') 終端記号 T が次 :... '' prec('') > prec('') スタック上の 規則の右辺 :... '' スタック上の 規則の右辺 :... '' SHIFT 5

終端記号 T が次 :... '-' prec( ') = prec('-') 終端記号 T が次 :... '-' prec( ') = prec('-') スタック上の 規則の右辺 :... '' スタック上の 規則の右辺 :... '' RDUC もう一例 もう一例...''...'-'...''...'-' '-' BR { result = -val[1] } BR '-' BR { result = -val[1] } BR prec( '' ) > prec( '-' ) ==> SHIFT 修正 修正...''...'-'...''...'-' '-' BR =UMINUS { result = -val[1] } BR '-' BR =UMINUS { result = -val[1] } BR prec( '-' ) > prec( '' ) ==> RDUC 6

宙ぶらりん else (dangling else) 文法 : S ::= if then S else S S ::= if then S S ::=... 例題 : if a then if b then S else S 解析 1: if a then (if b then S else S) 解析 2: if a then (if b then S) else S Racc は shift-reduce conflict を報告 デフォールト : shift ( 望みのもの ) 宙ぶらりん else (dangling else) 文法 : S ::= if then S else S S ::= if then S S ::=... 別解 : 文法の書き換え : S ::= M S ::= U M ::= if then M else M M ::=... U ::= if then S U ::= if then M else U Racc のデフォールト動作 Shift-Reduce conflict shift Reduce-Reduce conflict 最初の規則で reduce 一般的には 本当のバグ! 7