:: の扱い 2019.03.28 長谷川啓.

Slides:



Advertisements
Similar presentations
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
Advertisements

プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
【事例演習5】  字句解析     解 説  “ハッシュを用いた字句解析の方法”.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
JavaScript プログラミング入門 2006/11/10 神津.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月17日
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
Ex7. Search for Vacuum Problem
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Ex8. Search for Vacuum Problem(2)
言語処理系(4) 金子敬一.
12.3,E,-15, 12.3,E5,+,=, >,<,…,
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
データ構造とアルゴリズム 第10回 mallocとfree
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
文法と言語 ー文脈自由文法とLR構文解析2ー
アルゴリズムとデータ構造 2011年6月13日
構造体.
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月24日
コンパイラ 第14回 上昇型構文解析(2) 38号館4階N-411 内線5459
プログラミング言語入門 手続き型言語としてのJava
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
FlexとBison+アルファ -実習編-
暗黙的に型付けされる構造体の Java言語への導入
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
アルゴリズムとプログラミング (Algorithms and Programming)
ソフトウェア制作論 平成30年10月3日.
コンパイラ 2012年11月15日
コンパイラ 第13回 上昇型構文解析(1) 38号館4階N-411 内線5459
第11回 プログラミングⅡ 第11回
Java8について 2014/03/07.
文法と言語 ー文脈自由文法とLR構文解析2ー
一時的な型 長谷川啓
文法と言語 ー文脈自由文法とLR構文解析3ー
Ex7. Search for Vacuum Problem
フロントエンドとバックエンドのインターフェース
型の compatibility とポインタ演算
記号表の検索と登録 長谷川啓
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
構造体と共用体.
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
アルゴリズムとプログラミング (Algorithms and Programming)
C++ 構文解析 構文解析器の状態保存と復元
参照されないリテラル 長谷川啓
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析ー
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造1 2009年6月15日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
ドキュメントジェネレータ 詳細仕様 長谷川啓
コンパイラ 2012年10月11日
プログラミング 4 文字列.
Inline 展開のアルゴリズム 長谷川啓
アルゴリズムとデータ構造 2010年6月17日
演算子のオーバーロード.
文法と言語 ー文脈自由文法とLR構文解析2ー
3.1 シューティングゲームの当たり判定 当たったら死亡.
ドキュメントジェネレータ doclink 設計メモ
C言語講座第5回 2017 構造体.
デフォルト引数 長谷川啓.
Presentation transcript:

:: の扱い 2019.03.28 長谷川啓

C コンパイラでもあった問題 正規表現 [_a-zA-Z][_a-zA-Z0-9]* (名前)にマッチした文字列 記号表を検索するべきかどうか ざっくりとした結論 型が要求されるポイントでは記号表を検索して typedef-name を拾う必要がある C コンパイラ (PDFのドキュメント) 2.2.1 字句解析ルーチンと記号表

C++ はさらに :: がある namespace N { } N::outer::inner noi; struct outer { // ... struct inner { static int si; }; struct S { /* ... */ }; extern double S; // ok : 変数名とタグ名は別空間 } N::outer::inner noi; int N::outer::inner::si; int N; // エラー: N の多重定義 double N::S; struct N::S ns;

C++ 文法抜粋 nested-name-specifier: class-or-namespace-name: type-name: class-or-namespace-name :: nested-name-specifier class-or-namespace-name :: ... class-or-namespace-name: class-name namespace-name type-name:

名前 ⇒ 字句 名前 X を見たら、直前と直後の字句が :: かどうか判定する 直前の字句が :: ならばX に対して記号表を検索する 検索して見つからなければその時点でエラー 直後の字句が :: ならば X に対して記号表を検索する 直後の字句がまた名前 Y なら、Y に対して記号表は検索しないで Y の字句の種類は後で決める X に対してはそれ以外の名前⇒字句の規則を適用する 場合によって記号表の検索を適宜行う

N::outer::inner noi; N の直後は :: なので N に対して記号表を検索する outer の直前は :: なので outer に対して記号表を検索する outer は class-name であると判定される outer :: は nested-name-specifier に還元される inner の直前は :: なので inner に対して記号表を検索する inner は class-name であると判定される inner は outer とは異なり type-name に還元される noi の直前も直後も :: ではないのでこれ以外の規則が適用される この場合は decl_spec のスタックに型があるので記号表は検索されない

スコープの移動 class-or-namespace-name が還元されるときにスコープの移動をする: /* yacc/bison */ : class_name { $1 の表すクラスにスコープを移動; } | namespace_name { $1 の表す名前空間にスコープを移動; }

スコープの移動(続き) 以下でも良さそうだが間違い: nested-name-specifier: class-or-namespace-name :: { ここでスコープの移動 } class-or-namespace-name :: { ここでスコープの移動 } nested-name-specifier ... 前ページよりスコープの移動のタイミングが遅れる outer や inner は検索できない :: の前にスコープの移動を行うのが正しい つまりそれは前ページと同じ

シフト/還元衝突の対応 yacc/bison のレポートファイル 以下のコードを yyparse の適切な場所に挿入する: State X1 R11 nested_name_specifier: class_or_namespace_name COLONCOLON . nested_name_specifier R12 | class_or_namespace_name COLONCOLON . ... State X1 で例えば次の字句が class-name だった場合必ずシフトするのは間違い 以下のコードを yyparse の適切な場所に挿入する: if (yystate == X1 && peek() != COLONCOLON) { yyn = R12 + 1; goto yyreduce; }

還元/還元衝突の対応 yacc/bison のレポートファイル このままだと R22 の規則が使われることがない State X2 R21 type_name: class_name . R22 class_or_namespace_name: class_name . このままだと R22 の規則が使われることがない 以下のコードを yyparse の適切な場所に挿入する: if (yystate == X2 && peek() == COLONCOLON) { yyn = R22 + 1; goto yyreduce; }

:: に対するスコープの移動の後処理 もともとあったスコープ位置に戻す必要がある N::outer::inner noi; このポイントではスコープ位置はルートだった このポイントでスコープ位置を N::outer からルートに戻す

このポイントでは N::T::f のパラメータスコープ このポイントではルート void N::T::f ( N2::T2* p) { N3::T3::x を参照; このポイントで N::T::f のボディのスコープに戻す必要がある このポイントでは N::T::f のボディのスコープ } このポイントでルートに戻す必要がある。