249
1 本本本本 本本本本本本本本本本本本本本本本本本本本本本本 本本本本本本本本本本本本本 本本本本本本本本 、。、 本本本本本本本本本本 本本本本本本本本本本本本本本本本本 本本本本 本 本本本本本本本本本本本本本本本本本本本本本本本本本本本本 。CD、 本本本本本 本本本本本本本本本本 本本本本本本本本本本 本本本本本本本 本本本本本本 本本本本本本本本本本本 ISBN4-7973-3169-0 本本本本本本本本本本 本本本本本本本 本本本CD 本本本本本 本本本本本本本 本本本本 () 本本本本本本本本本本本本 本本本本本本本本 ([email protected]) 本本本本本本本 ([email protected]) 本本本本本本 ([email protected]) 本本本本本本本本本本本 ([email protected]) 本本本本本本 ([email protected])

本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

Embed Size (px)

DESCRIPTION

本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。 テキストについては市販されています。教員用CDについては無料で提供してますので、詳しくは 『 コンパイラ入門 』 の付録M 参考情報をご覧下さい。. ソフトウエア実践講座 コンパイラ入門 ソフトバンク クリエイティブ株式会社  ISBN4-7973-3169-0 ソフトウエア実践講座 コンパイラ入門 教員用CD 教員用資料 講義用スライド(本資料) サンプルソースプログラム - PowerPoint PPT Presentation

Citation preview

Page 1: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

1

本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

テキストについては市販されています。教員用CDについては無料で提供してますので、詳しくは『コンパイラ入門』の付録M 参考情報をご覧下さい。

ソフトウエア実践講座 コンパイラ入門 ソフトバンク クリエイティブ株式会社  ISBN4-7973-3169-0 ソフトウエア実践講座 コンパイラ入門 教員用CD

教員用資料 講義用スライド(本資料) サンプルソースプログラム

初期テンプレート ([email protected]) スキャナ構築後 ([email protected]) パーサ構築後 ([email protected]) シンボルテーブル構築後 ([email protected]) コード生成後 ([email protected])

Page 2: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

2

ソフトウエア実践講座 コンパイラ入門

~ 究極のソフトウエア開発 ~

Page 3: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

3

目次 準備作業

1章  はじめに 2章  コンパイラ 3章  問題の把握 4章  開発環境の設定

スキャナの構築 5章  語彙定義 6章  スキャナの構築

パーサの構築 7章  文法定義 8章  パーサの構築 9章  パーサの構築(変数と関数) 10章 パーサの構築(式と代入文) 11章 パーサの構築(選択文と繰り返し文) 12章 シンボルテーブル

コードジェネレータの構築 13章 コードジェネレータ 14章 コードジェネレータ(変数と関

数) 15章 コードジェネレータ(式と代入

文) 16章 コードジェネレータ(選択文) 17章 コードジェネレータ(繰り返し

文)

参考資料 パーサの構築 テストプログラム 言語仕様 付録CD-ROM

Page 4: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

4

1章 はじめに シラバス 自作コンパイラのイメージ

Page 5: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

5

1章 はじめにシラバス案(1 / 6) コース名

対象者: ~大学 ~学部 ~学科 開講時期: ~ コース番号: ~ 授業科目: ~ 単位数: ~ 開講日: ~ 開講時間: ~ 開講場所: ~

担当教員 氏名: ~ 研究室: ~研究室 電話番号: ~ FAX 番号: ~ メールアドレス: ~ オフィスアワー: ~

担当助手/ティーチング・アシスタント 氏名: ~研究室 オフィスアワー: ~

Page 6: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

6

1章 はじめにシラバス案(2 / 6) 目的

コンパイラに必要な理論と実践を習得

ゴール 自作コンパイラの完成 必要な理論・知識を身につける

前提条件 最低1つのプログラム言語でプログラムを作成できること

課題・レポート・プロジェクト 自作コンパイラを作成するプロジェクトを完成する

1回目:スキャナー構築後のソース、入力プログラム、出力結果 2回目:パーサ構築後のソース、入力プログラム、出力結果 3回目:コードジェネレータ構築後のソース、入力プログラム、出力

結果 期末考査

Page 7: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

7

1章 はじめにシラバス案(3 / 6) 評価

自作コンパイラ作成プロジェクト 60% 期末考査 40%

成績 優 90%以上 良 75%以上、90%未満 可 60%以上、75%以下 不可 60%未満 合計が60%に満たない場合、上限を60%として再試験を評価

上手な履修方法のアドバイス スケジュールされた章を予め読んでおく事 毎週スケジュールに沿ってプロジェクトを推進・検証する事 プロジェクト推進に必要な内容を整理しておく事

Page 8: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

8

1章 はじめにシラバス案(4 / 6) 授業スケジュール

1週目 ~月~日(~) 1章:はじめに2章:コンパイラ

2週目 ~月~日(~) 3章:問題の把握 4章:開発環境の設定

3週目 ~月~日(~) 5章:語彙定義 4週目 ~月~日(~) 6章:スキャナーの構築 5週目 ~月~日(~) 7章:文法定義 6週目 ~月~日(~) 8章:パーサの構築 7週目 ~月~日(~) 9章:パーサの構築(変数と関数) 8週目 ~月~日(~) 10章:パーサの構築(式と代入文) 9週目 ~月~日(~) 11章:パーサの構築(選択文と繰り返し

文) 10週目 ~月~日(~) 12章:シンボルテーブル 11週目 ~月~日(~) 13章:コードジェネレータ 12週目 ~月~日(~) 14章:コードジェネレータ(変数と関数) 13週目 ~月~日(~) 15章:コードジェネレータ(式と代入文) 14週目 ~月~日(~) 16章:コードジェネレータ(選択文)

17章:コードジェネレータ(繰り返し文)15週目 ~月~日(~) 18章:ポストモーテム(事後検証)

16週目 ~月~日(~) 期末考査

Page 9: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

9

1章 はじめにシラバス案(5 / 6)

添付 CD 内容

統合開発環境プロジェクト一式 Visual Studio .NET 2003 Visual Studio 2005 Visual C#/C++ 2005 Express Edition

Express Edition 用擬似アセンブラ 入出力ライブラリ

iolib.lib / iolib.dll / iolib.inc コンパイラ開発用テンプレート

C# テンプレートソース( Primitive.cs ) 入力ファイル (in.txt) 出力ファイル (out.asm)

テストプログラム 検証用テストプログラムサンプル一式 HelloWorld.txt Change.txt Fibonacci.txt Prime.txt

統合化環境用サンプルプログラム PrimitiveIDE

教科書/テキスト ソフトウエア実践講座 ~コンパイラ入門~ ソフトバンク クリエイティブ株式会社 ISBN4-7973-3169-0

本スライドにはテキストの一部を抜粋して使用しています

Page 10: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

10

1章 はじめにシラバス案(6 / 6)~テキスト目次 準備作業

1章  はじめに 2章  コンパイラ 3章  問題の把握 4章  開発環境の設定

スキャナの構築 5章  語彙定義 6章  スキャナの構築

パーサの構築 7章 文法定義 8章  パーサの構築 9章  パーサの構築(変数と関数) 10章 パーサの構築(式と代入文) 11章 パーサの構築(選択文と繰り返し文) 12章 シンボルテーブル

コードジェネレータの構築 13章 コードジェネレータ 14章 コードジェネレータ(変数と関数) 15章 コードジェネレータ(式と代入文) 16章 コードジェネレータ(選択文) 17章 コードジェネレータ(繰り返し文)

ポストモーテム(事後検証) 18章 ポストモーテム(事後検証)

付録 A 言語仕様 B トークンと言語仕様 C トークン一覧表 D スキャナ後の言語仕様 E 文法変換規則 F 文法変換後の言語仕様 G 文法とパーサの変換対応表 H テンプレート I  アセンブラ関連 J 素数プログラム、アセンブラ、実行結果 K フィボナッチプログラム、アセンブラ、

実行結果 L 添付CD-ROMについて M 参考情報

Page 11: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

11

1章 はじめに1 . 3 本書で構築するコンパイラについて

MODULE Prime;VAR    i,j,n,q,r,flg : INTEGER;BEGIN    WriteStr("N>");    ReadInt(n);    i:=2;    WHILE i<=n    DO       flg:=0;    j:=2;    WHILE j<i    DO       q:=i/j;       r:=i-j*q;

IF r=0 THEN flg:=1 END;       j:=j+1    END    IF flg=0     THEN           WriteInt(i);       WriteStr(",");    END;    i:=i+1    END;END Prime.

Input N>1000  (入力)2 :→剰余が無いので素数3:→2で割り切れないので素数4:→2で割り切れる5:→2→3→4で割り切れないので素数6:→2で割り切れる7:→2→3→4→5→6で割り切れないので素

数8:→2で割り切れる9:→2→3で割り切れる10:→2で割り切れる・・・入力された数値までこれを繰り返す2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109, ・・・

Page 12: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

12

2章 コンパイラ コンパイラについて コンパイラを構成する要素 これから学ぶべき内容

Page 13: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

13

2章 コンパイラ2.1 コンパイラの概要

コンパイラ 特定のプログラム言語をアセンブラに変換するプログラム 一般的には、ある規則を別の規則に変換するプログラム規則=特定の規則に沿った記述やフォーマット

コンパイラとインタープリタ コンパイラは変換と実行が別のタイミングで行われる例: C 言語のコンパイル、アプリケーションの実行

インタープリタは変換と実行が同じタイミングで行われる例: BASIC インタープリタ

Page 14: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

14

2章 コンパイラ2.1 コンパイラの概要

コンパイラは変換プログラム 入力プログラム(通常~言語と名前がある) 出力プログラム(通常、アセンブラ言語)

プログラム言語 main() { puts(Hello, World!); }

アセンブラ言語 .data Letter dd 0.code mov Letter, ‘H’ ....

コンパイラ 入力 出力

Page 15: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

15

2章 コンパイラ2.1 コンパイラの概要 手続き型言語

C, Pascal, COBOL, FORTRAN など

オブジェクト指向型言語 C# 、 C++ 、 Smalltalk など

関数型言語 Lisp, Scheme, ML など

論理型言語 Prolog など

Page 16: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

16

2章 コンパイラ2.2 コンパイラの全体構成

コンパイラ

スキャナー パーサ コード ジェネレータ

プログラム言語 main() { puts(“Hello!); }

アセンブラ言語 .data Letter dd 0.code mov Letter, ‘H’ ....

入力:プログラム 出力:トークン 機能:トークンに分解

「トークン」とはプログラムの最小構成要素

入力:トークン出力:構文解析木機能:構成を分析

構成=「文法」~あるべきトークンがあるべき場所に収まっているか

入力:構文解析出力:アセンブラ機能:意味(コードを生成) 

「意味」とは解析結果

Page 17: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

17

2章 コンパイラ2.2 コンパイラの全体構成

プログラムMODULE HelloWorld;

BEGIN

WriteStr (“ Hello World!“)

END HelloWorld .

トークンMODULE

HelloWorld

;

BEGIN

WriteStr

(

"Hello World!“

)

END

HelloWorld

.

Page 18: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

18

2章 コンパイラ2.2 コンパイラの全体構成

構文解析木(該当する部分のみ抽出)<program>= MODULE IDENT ;

<program1>BEGIN<statlist>END IDENT .

<program1>= ε | <decllist><statlist>= <statement>

<statlist1><statlist1> = ε

| ; <statement> <statlist1> <statement>=IDENT→WriteStr

<statement1><statement1>= (

<literal>)

<literal>= STR→“Hello World!” | NUMBER | IDENT

トークンMODULE HelloWorld;

BEGIN

WriteStr

(

"Hello World!“

)

END HelloWorld .

Page 19: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

19

2章 コンパイラ2.2 コンパイラの全体構成

構文解析木(該当する部分のみ抽出)<program>= MODULE IDENT ;

<program1>BEGIN<statlist>END IDENT .

<program1>= ε | <decllist><statlist>= <statement>

<statlist1><statlist1> = ε

| ; <statement> <statlist1> <statement>=IDENT→WriteStr

<statement1><statement1>= (

<literal>)

<literal>= STR→”HelloWorld!” | NUMBER | IDENT

アセンブラ.586

.model flat,stdcall

INCLUDE iolib.inc

.data

  Letter dd 0

.code

  _start:

  mov Letter, 'H'

  invoke OutputLetter, Letter

 ・・・  invoke ExitProcess,0

  end _start

END

Page 20: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

20

2章 コンパイラ2.2 コンパイラの全体構成

準備作業 1~4章:基礎知識と開発環境

フェーズ1 5~6章:スキャナの構築

フェーズ2 7~12章:パーサの構築

フェーズ3 13~17章:コードジェネレータの構築

ポストモーテム 18章:まとめと更に深い学習のために

Page 21: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

21

3章 問題の把握ステップ1

  BNF と文法 BNF と EBNF 言語仕様 プログラムと言語仕様との関係

Page 22: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

22

3章 問題の把握3.2 BNF ( Backus Naur Form)

BNF 「文法」を記述する表記法 コンピュータ言語を表す為に使われることが多い

英文法 単語と単語の構成・関係を表す 5文型は単語の品詞から英文の型を表現している

プログラム言語の文法 プログラムの最小構成要素の構成・関係を表す 変数、キーワード、オペレータなどの関係 代入文の① abc=123 、② 123=abc 、どちらが正し

い?

Page 23: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

23

3章 問題の把握3.2 BNF の定義

BNF ターミナル(終端記号) ノンターミナル(非終端記号)で < > と表記する 左辺と右辺はターミナルとノンターミナルの集合体 左辺  ::= 右辺

本書では左辺はノンターミナルだけに制限する

例題 <文> ::= <主語> <動詞> <目的語> <主語> ::= I <動詞> ::= Love <目的語> ::= You

「 ::=」は置き換えるという意味、以後「→」を使用

Page 24: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

24

3章 問題の把握3.2 BNF の定義

BNF が出来ること 文字列が文法に合致しているかどうかを「識別」できる 置き換えのステップを「導出」と呼ぶ

例題 ステップ1~先頭から開始される~<文>

ステップ2~<文>は<主語><動詞><目的語>によって置き換えられる~<主語><動詞><目的語>

ステップ3~<主語>は I によって置き換えられる~I <動詞><目的語>

ステップ4~<動詞>は Love によって置き換えられる~I Love <目的語>

ステップ5~<目的語>は You によって置き換えられる~I Love You

ステップ6~<文>は I Love You に変換換された~

Page 25: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

25

3章 問題の把握3.2 BNF の定義

< 文 > ↓< 主語 t> < 動詞 > YOU ↓ ↓ I  LOVE

下記の様 に表す

縦書きでも 同義

Page 26: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

26

3章 問題の把握3.2 BNF例~数値の識別

数値 1文字以上の数字

BNF <number> → <digit> <number1> <number1> → ε

| <digit> <number1> <digit> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 注:|(OR)は選択を示す(次スライド参照)

識別できる数値の例 1、1、2、3、5、8、13、21・・・

識別できない数値の例 -123 (マイナスは定義されていない)、 abc( 数字ではない)

Page 27: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

27

3章 問題の把握3.2 BNF例~数値の識別

BNF <number> → <digit> <number1> <number1>→ ε| <digit> <number1> <digit> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

BNF (上記の記述と同義) <number> → <digit>

<number1> <digit> → 0 <digit> → 1 <digit> → 2 <digit> → 3 <digit> → 4 <digit> → 5 <digit> → 6 <digit> → 7 <digit> → 8 <digit> → 9 <number1> → ε <number1> → <digit>

<number1>

Page 28: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

28

3章 問題の把握3.2 BNF例~数値の識別

構文解析木 識別に到る BNF (右辺と左辺)を表したもの 前ページの例題でアニメーションが付いた部分を並べたもの

1を識別した場合の構文解析木 <number> → <digit> → 1

<number1> → ε

13の識別した場合の構文解析木 <number> → <digit> → 1

<number1> → <digit> → 3 <number1> → ε

ε (エプシロン)の意味 該当する BNFやシンボルが「選択・識別」されなかった意味 選択・識別する物が無いと明確に示す

Page 29: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

29

3章 問題の把握3.2 BNF例~数値の識別

構文解析木の表記について トポロジーが一致していればどんな形式でもかまわない 下記の解析木は同じ意味

横書きの場合(13を識別した場合) <number> → <digit> → 1

<number1> → <digit> → 3 <number1> → ε

縦書きの場合(13を識別した場合)<number> ↓<digit> <number1> ↓ ↓ 1 <digit> <number1>

↓ ↓ 3 ε

Page 30: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

30

3章 問題の把握3.2 BNF例~文字列の識別

文字列 1文字以上の文字でプログラムでは識別子と呼ばれる

BNF <ident> → <letter> <ident1> <ident1> → ε

| <letter> <ident1> <letter> → a | b | c | d | e | f | g | h | i | j | k | l | m |    n | o | p | q | r | s | t | u | v | w | x | y | z |    A | B | C | D | E | F | G | H | I | J | K | L | M |    N | O | P | Q | R | S | T | U | V | W | X | Y | Z

識別できる数値の例 a 、 ab, abc, xyz, Hello ・・

識別できない数値の例 123 、 abc123 (数字は定義されていない)

Page 31: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

31

3章 問題の把握3.2 BNF例~文字列の識別

Ab を識別した場合の構文解析木 ステップ1:  <ident>

ステップ2:  <ident>→<letter>                <ident1>

ステップ3:  <ident>→<letter>→A           <ident1>

ステップ4:  <ident>→<letter>→ A <ident1>→<letter>

<ident1> ステップ5:  <ident>→<letter>→ A

<ident1>→ <letter>→b <ident1>

ステップ6:  <ident>→<letter>→ A <ident1>→ <letter>→ b

<ident1>→ε

Page 32: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

32

3章 問題の把握3.3 BNFとEBNF

EBNF Extended BNF (拡張されたBNF) BNFよりコンパクトに記述できる

( )によるグルーピング まとめて処理できる

*による0回以上の繰り返し 再帰呼び出しを省略できる

+による1回以上の繰り返し 再帰呼び出しを省略できる

[ ] により二者択一の選択 ε を使わずに処理できる

Page 33: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

33

3章 問題の把握3.3 EBNF~( )と*

BNF(識別子) <ident> → <letter> <ident1> <ident1> → ε

→ <lettter> <ident1>→ <digit> <ident1>

<letter> → 前例と同じ(英小文字、英大文字) <digit>→ 前例と同じ(0~字、数値)

同等のEBNF <ident> → <letter> ( <letter> | <digit> )*

( )の効果 ( <letter> | <digit> ) によって2つのノンターミナルがまとめて処理

*の効果 ( <letter> | <digit> )* により<ident1> の再帰呼び出しが不要

Page 34: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

34

3章 問題の把握3.3 EBNF~ [ ]

BNF <program> → MODULE <ident> ; <additional> BEGIN ・・・ END <i

dent> . <additional>→ ε

→ <decllist> (変数定義が行われるノンターミナル)

同等のEBNF <program> --> MODULE <ident> ; [ <decllist> ] BEGIN ・・・ END <ident> .

例題1~変数が無い場合は [ ] 内が選択されなかった MODULE PROGRAM; ~ここに変数定義が無い~ BEGIN

・・・

例題2~変数がある場合は [ ] 内が選択された MODULE PROGRAM;

VAR I, J, K : INTEGER; BEGIN

・・・

Page 35: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

35

3章 問題の把握3.3 EBNF~+

BNF <decllist>→   VAR <decilist1> <decllist1> →   <identlist> : <type> ; <decllist2> <decllist2> → ε

→   <decilist1> 

同等のEBNF <decllist> -->VAR ( <identlist> : <type> ; )+

例題1~ <decllist> が+により1回選択された場合(前ページの例題2) .

例題2~変数定義のラインは1回以上何回定義されてもよい(この例では3回)

MODULE PROGRAM;VAR I, J, K : INTEGER;VAR a, b : INTEGER;VAR z, z, x, y, z : INTEGER;・・・

BEGIN・・・

Page 36: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

36

3章 問題の把握3.4 言語仕様=プログラムの設計図<program> →   MODULE <ident> ; [ <decllist> ] BEGIN <statlist> END <ident> .<ident> →   <letter> ( <letter> | <digit> )*<decllist> →   VAR ( <identlist> : <type> ; )+<statlist> →   <statement> ( ; <statement> )*<identlist> →   <ident> ( , <ident> )*<type> →   INTEGER | STRING<statement> →   <ident> := <expression> | IF <relation> THEN <statlist> [ ELSE <statlist> ] END

| WHILE <relation> DO <statlist> END | <ident> "(" <literal> ")“

<relation> →   <expression> <rel op> <expression><expression>→ <unary op> ] <term> ( <add op> [ <unary op> ] <term> )*<term> →   <factor> ( <mul op> <factor> )*<factor> →   <literal> | "(" <expression> ")“<literal> →   <ident> | <integer> | <string><integer> →   <digit>+<rel op> →   = | < | <= | <> | > | >=<unary op> →   + | -<add op> →   + | -<mul op> →   * | /<digit> →   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9<string> →   " <any character except EOF, EOL and "> “<letter> →   a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |

    A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

Page 37: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

37

3章 問題の把握3.4 言語仕様の説明

<program> は変数定義と文から構成される <program> →   MODULE <ident> ;

[ <decllist> ] BEGIN

<statlist> END <ident> .

<decllist> →   VAR ( <identlist> : <type> ; )+ <identlist> →   <ident> ( , <ident> )* <type> →   INTEGER | STRING

<statlist> →   <statement> ( ; <statement> )* <statement>→   <ident> := <expression>

  | IF <relation> THEN <statlist> [ ELSE <statlist> ] END

| WHILE <relation> DO <statlist> END | <ident> "(" <literal> ")“

変数定義例  VAR I,J,K: INTEGER;

文例 WriteStr(“HelloWorld!”)

Page 38: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

38

3章 問題の把握3.4 言語仕様の説明

<ident> による識別子~先頭が英字で2文字目以降は英数字 <ident> → <letter> ( <letter> | <digit> )* <digit> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <letter> → a | b | c | d | e | f | g | h | i | j | k | l | m | n

o | p | q | r | s | t | u | v | w | x | y | z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

<string> は” と“で囲まれた文字、但し、 EOF, EOL, ” は除く <string> →   " <any character except EOF, EOL and "> “ EOL (End Of Line)~2行にまたがれない EOF( End Of File)~ファイルの終わりまで継続できない 例:” Hello World!”, ”Input N>”, etc

<integer> による数値~1桁以上の数値 <integer> →   <digit>+ <digit> →   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Page 39: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

39

3章 問題の把握3.4 言語仕様の説明(2 /3)

<unary op> は符号 <unary op>→   + | -

<add op> は加減演算 <add op> →   + | -

<mul op> は乗除演算 <mul op> →   * | /

比較演算子 <rel op> →   = (EQ)

→   < (LT)→   <= (LE)→   <> (NE)→   > (GT)→   >= (GE)

Page 40: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

40

3章 問題の把握3.4 言語仕様の説明(3 /3)

<literal> は <ident> か <integer> か <string> <literal> →   <ident> | <integer> | <string>

<expression> は符号と加減乗除付の <literal> の式(再帰的に定義) 例1: 1+2*3 (加算、乗算) 例2: -1+-2*-3 (符号付) 例3: (1+2)*3 (括弧付の式~加算優先) 例 4 : (((1)))

<expression>→   [ <unary op> ] <term> ( <add op> [ <unary op> ] <term> )*

<term> →   <factor> ( <mul op> <factor> )* <factor> →   <literal> | "(" <expression> ")“

<relation> は比較式~式と式を比較演算子で結合 例: 123<234 <relation>→   <expression> <rel op> <expression>

Page 41: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

41

3章 問題の把握3.5 言語仕様とプログラム

相当する言語仕様 ( 該当する部分のみ)<program>   → MODULE <ident> ; [ <decllist> ] BEGIN <statlist> END <ident> .<statlist>    → <statement> ( ; <statement> )*<statement> →   <ident> "(" <literal> ")“

プログラムMODULE HelloWorld;

BEGIN

WriteStr ( "Hello World!“ )

END HelloWorld .

プログラムと言語仕様の対応MODULE <ident> ;

BEGIN

<statlist>→<statement>→<ident> ( <literal> )

END <ident> .

Page 42: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

42

4章 開発環境の設定ステップ2

 環境設定と動作検証 プロジェクト環境のセットアップ C# / アセンブラの開発 / 実行環境検証

Page 43: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

43

4章 開発環境の設定4.1 事前準備(開発環境)

開発環境 自作コンパイラを作るために必要な開発 /実行環境 コンパイラ、マクロアセンブラ、リンカが必要

コンパイラ ①   Visual Studio 2005 ②   Visual Studio .NET 2003 ③  Visual C# 2005 Express Edition  (無料ダウンロードはテキスト参

照)

アセンブラ マクロアセンブラ( ml ) ~ ①、②の場合 擬似アセンブラ( mlx) ~ ③の場合 (添付CDに格納)

リンカ リンカ( link ) ~ ①、②の場合 Visual C++ 2005 Express Edition ~ ③の場合

(無料ダウンロードについての詳細はテキスト参照)

Page 44: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

44

4章 開発環境の設定4.1 事前準備(開発方法) 統合開発環境による開発

プログラム開発作業の効率化 プロジェクト( CD で提供)を利用可能 新しい言語と環境に慣れる為に、こちらがお勧め

コマンドラインによる開発 エディタによるプログラム入力 コンパイル、アセンブル、リンク、実行はコマンド入

力 前提知識や間接作業が多いので、熟練者向き

Page 45: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

45

4章 開発環境の設定4.1 事前準備(開発方法)

統合開発環境 豊富な機能とメニューを選

コマンドライン 全てコマンドを入力

Page 46: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

46

4章 開発環境の設定4.1 事前準備

① 開発環境がインストールされている事を確認 Visual Studio 2005 Visual Studio .NET 2003 Visual C#/C++ 2005 Express Edition  (2つ必

要)

② 開発環境を持っていない場合 Visual C#/C++ 2005 Express Edition をダウンロ

ード

③ テキスト 4.1 事前準備を熟読 「陥りやすいトラブル」は必ず目を通すこと!

Page 47: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

47

4章 開発環境の設定4.1 事前準備

Visual Studio 2005 の統合開発環境を使う場合 テキスト4.2を参照しながら各自で実行

Visual Studio .NET 2003 の統合開発環境を使う場合 テキスト4.3を参照しながら各自で実行

Visual C#/C++ 2005 Express Edition の統合開発環境を使う場合

テキスト4.4を参照しながら各自で実行

上記の開発環境でコマンドラインを用いて開発する場合

テキスト4.5を参照しながら各自で実行

Page 48: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

48

4章 開発環境の設定参考 セットアップ

  Visual Studio 2005  (統合開発環境版)をダブルクリック 

  Setup.exe をダブルクリックし、インストーラを起動 

Page 49: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

49

4章 開発環境の設定参考 セットアップ

Page 50: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

50

4章 開発環境の設定参考 C# の開発 / 実行環境検証

入力

検証用プログラム In.txt

出力

実行結果out.asm C#

入力 出力

動作検証 入力ファイルをコンパイル・実行、出力結果を確認

開発環境、方法を自ら検証し、動作確認できる

開発 環境・方法

Page 51: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

51

4章 開発環境の設定参考 アセンブラの開発 / 実行環境検証

動作検証 入力ファイルをアセンブル・リンク・実行、出力結果

を確認 開発環境、方法を自ら検証し、動作確認できる

入力

検証用プログラム out.asm

出力

実行結果 out.exe アセンブラ

リンカ

入力 出力

開発 環境・方法

Page 52: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

52

4章 開発環境の設定参考 C# 、アセンブラ、リンカ

コンパイラ(自作コンパイラを開発する言語) C#

マクロアセンブラ ML ( MASM の後継) コンパイラが生成したアセンブラをオブジェクトに変換

リンカ LINK アセンブラが生成したオブジェクトを実行形式に変換

Page 53: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

53

4章 開発環境の設定参考 C# 、アセンブラ、リンカ

コマンドを入力することで検証可能

Page 54: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

54

4章 開発環境の設定参考 コマンドプロンプト 開発製品のコマンドプロンプトを使うこと

アクセサリから起動したコマンドプロンプトは使わないこと

Page 55: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

55

5章 語彙(ごい)定義ステップ3

 入力 言語仕様

 出力 トークン定義(一覧、チャート)

Page 56: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

56

5章 語彙定義5.1 トークン

プログラムMODULE HelloWorld;

BEGIN

WriteStr (“ Hello World!“)

END HelloWorld .

トークンMODULE

HelloWorld

;

BEGIN

WriteStr

(

"Hello World!“

)

END

HelloWorld

.

 トークンとはプログラムの最小構成要素 

文章だと、「単語」に相当プログラムだと、「トークン」と言われる

Page 57: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

57

5章 語彙定義5.1 トークン

トークンは言語仕様の中で定義されている ① <規則>で定義されているもの~識別子、数値、文字列 ② 予約語~MODULE、INTEGERなど ③ 埋め込まれている記号~2文字(<>、:=)、1文字(;

 .)など BNF で使われているシンボルとの違いに注意

例1  <ident> は規則で定義(先頭が英字で、2文字目以降は英数字)例2  MODULE, BEGIN, END等、プログラムの予約語例3 「;」や「.」など埋め込まれている文字

<program> →   MODULE <ident> ; [ <decllist> ] BEGIN <statlist> END <ident> .<ident> →   <letter> ( <letter> | <digit> )*<digit> →   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9<letter> →   a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p |

q | r | s | t | u | v | w | x | y | z |   A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |

          Q | R | S | T | U | V | W | X | Y | Z

Page 58: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

58

5章 語彙定義5.2 語彙定義

<規則>で定義されているトークン 識別子(先頭は英字、2文字目以降は英数字) 数値 (1桁(1文字)以上の数字) 文字列(“と”に囲まれた文字~但し1行以内のもの)

<ident> →   <letter> ( <letter> | <digit> )* 識別子<integer> →   <digit>+ 数値<string> →  “ <any character except EOF, EOL and ”> “ 文字列

<digit> →   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9<letter> →   a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p |

   q | r | s | t | u | v | w | x | y | z |   A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |

Q | R | S | T | U | V | W | X | Y | Z

Page 59: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

59

5章 語彙定義5.2 語彙定義

予約語 プログラムの中で予め決められている文字列 予約語は識別子として使えないことに注意

<program>   →  MODULE <ident> ; [ <decllist> ] BEGIN <statlist> END <ident> .<decllist>   →  VAR ( <identlist> : <type> ; )+<type>   →  INTEGER | STRING<statement> →   <ident> := <expression> | IF <relation> THEN <statlist> [ ELSE <statlist> ] END

| WHILE <relation> DO <statlist> END | <ident> "(" <literal> ")“

Page 60: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

60

5章 語彙定義5.2 語彙定義(3 / 3)

記号 区切り記号 識別子の規則で定義できない(先頭が英字、2文字目以降が英数)<program>   →  MODULE <ident> ; [ <decllist> ] BEGIN <statlist> END <ident> .<decllist>   →  VAR ( <identlist> : <type> ; )+<statlist>   →  <statement> ( ; <statement> )*<identlist>   →  <ident> ( , <ident> )*<statement> →   <ident> := <expression> | IF <relation> THEN <statlist> [ ELSE <statlist> ] END

| WHILE <relation> DO <statlist> END | <ident> "(" <literal> ")”

<relation>   →  <expression> <rel op> <expression><expression> →   <unary op> ] <term> ( <add op> [ <unary op> ] <term> )*<term> →   <factor> ( <mul op> <factor> )*<factor> →   <literal> | "(" <expression> ")”<rel op> →   = | < | <= | <> | > | >=<unary op> →   + | -<add op> →   + | -<mul op> →   * | /

Page 61: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

61

5章 語彙定義5.2 トークン一覧

Page 62: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

62

5章 語彙定義5.2 トークン識別チャート

同じ文字を持つトークンごとにチャート化

Page 63: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

63

5章 語彙定義5.3 語彙定義で使用された規則

この言語仕様の<規則>はスキャナでのみで使用される これ以降(パーサ以降)は使用しないので削除しておく

<ident> →   <letter> ( <letter> | <digit> )*

<integer> →   <digit>+

<string> →  “ <any character except EOF, EOL and ”> “

<digit> →   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

<letter> →   a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p |

q | r | s | t | u | v | w | x | y | z |

   A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |

Q | R | S | T | U | V | W | X | Y | Z

Page 64: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

64

<program>   →  MODULE IDENT ; [ <decllist> ] BEGIN <statlist> END IDENT .<decllist>   →  VAR ( <identlist> : <type> ; )+<statlist> → <statement> ( ; <statement> )*<identlist> →   IDENT ( , IDENT )*<type> →   INTEGER | STRING<statement> →   IDENT := <expression>

  | IF <relation> THEN <statlist> [ ELSE <statlist> ] END   | WHILE <relation> DO <statlist> END   | IDENT "(" <literal> ")“

<relation>   →  <expression> <rel op> <expression><expression> →   [ <unary op> ] <term> ( <add op> [ <unary op> ] <term> )*<term>   →  <factor> ( <mul op> <factor> )*<factor>   →  <literal> | "(" <expression> ")“<literal> →   IDENT | NUMBER | STR<rel op> →   = | < | <= | <> | > | >=<unary op>   →  + | -<add op> →   + | -<mul op> →   * | /

5章 語彙定義5.3 新しい言語仕様

Page 65: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

65

6章 スキャナの構築ステップ4

 入力 トークン定義(一覧、チャート)  Primitive.cs (スキャナ実装前)

 出力  Primitive.cs  (スキャナー実装済み)

Page 66: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

66

6章 スキャナの構築6.1 Token クラス

Token クラスはテンプレートに定義済み スキャナーは下記の情報だけを設定する

// Token public class Token{

public String def = “”; トークン定義(ユニークな名称~何でも良い)public String str = “”;読み込んだトークン文字列public String type = “”; タイプ (変数の場合、整数型か文字型かを設定)

}

初期設定 識別子の例 予約語の例 記号の例 token.def=“”; token.def=“IDENT” token.def=“BEGIN” token.def=“ASSIGN” token.str=“EOF”; token.str=“abc” token.str=“BEGIN” token.str=“:=“ token.type=“EOF”; token.type=EOF” token.type=“EOF” token.type=“EOF”

Page 67: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

67

6章 スキャナの構築6.1 トークン定義

ユニークな名称であれば何でも良いが、下記を使用する テキストではこの名称で統一しているので後で分かりやすい

Page 68: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

68

6章 スキャナの構築6.1 トークン定義

これは1文字、2文字から構成されるトークン

Page 69: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

69

6章 スキャナの構築6.2 入出力 

// IO: Scanner + Code Generatorpublic class IOStream  {

public void Open(String fin, String fout)  ファイルのオープンpublic void Close()   ファイルのクローズ

public void PutString(String operation)  ファイルへ文字列を書き込むpublic int GetCharacter()   ファイルより1文字読み出すpublic void UngetCharacter(int i)   ファイル(バッファ)へ1文字戻す

  パラメータが:public bool isEOF(int i)    EOF 場合に TRUEpublic bool isWhiteSpace(int i)   White スペース(タブなど)の場合に TRUEpublic bool isDigit(int i)   数字の場合に TRUEpublic bool isAlpha(int i)   英字(大文字・小文字)の場合に TRUEpublic bool isSign(int i)   符号( +/- )の場合に TRUE

 これらはテンプレートの設定済み 

Page 70: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

70

6章 スキャナの構築6.3 スキャナ  (Main)

static void Main(string[] args){

・・・io.Open(inFile, outFile); ファイルをオープンする

    //Scanner Test    token = io.GetToken(); 最初のトークンを読み込むwhile (token.def != “EOF”) ファイルの終わりで無い場合{   System.Console.WriteLine(token.def + “ ” + token.str); トークンを画面表示   token = io.GetToken(); 次のトークンを読み込む}

io.Close(); ファイルをクローズする・・・

}

Page 71: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

71

6章 スキャナの構築6.3 スキャナ  (GetToken)

// IO: Scanner + Code Generatorpublic class IOStream スキャナは IOStream の中に定義{  ・・・  // Scanner  public Token GetToken() これがスキャナのメソッド  {     token.str = “”; 最初に token の初期設定を行う     token.def = "EOF";     token.type = "EOF";

     c = GetCharacter(); 1文字を入力する     while (isWhiteSpace(c)) 空文字である場合は     {       c = GetCharacter(); 読み飛ばす

}

    ここの部分にトークンを定義する 次ページ以降を参照)}

Page 72: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

72

6章 スキャナの構築6.3 スキャナ  ( 識別子 )

  ・・・ ここは 6.3 スキャナ (GetToken) の一部

   if (isAlpha(c)) 最初の文字が英字   {     while (isAlpha(c) || isDigit(c)) 2番目以降が英数字の場合     {       token.str = token.str + (char)c;トークン文字列に1文字を追加       c = GetCharacter(); 次の文字を読み込む     }     UngetCharacter(c); 英数字で無いので1文字を戻す    

token.def = “IDENT”; トークン定義の文字列を IDENT に設定  return token; 呼び出し元に戻る

   }

Page 73: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

73

6章 スキャナの構築6.3 スキャナ  ( 予約語 )

  ・・・ ここは 6.3 スキャナ (GetToken) の一部

   if (isAlpha(c)) ここから   {       ・・・     while (isAlpha(c) || isDigit(c)) ・・・    ・・・ ・・・     UngetCharacter(c); ここまでは識別子と同じ、この下に追加

予約語を1つ1つチェックしていく if     (token.str.Equals("MODULE")) { token.def = token.str; return token; }

     else if (token.str.Equals("BEGIN")) { token.def = token.str; return token; }     else if (token.str.Equals("END")) { token.def = token.str; return token; }     else if (token.str.Equals("VAR")) { token.def = token.str; return token; }     else if (token.str.Equals("INTEGER")) { token.def = token.str; return token; }     else if (token.str.Equals("STRING")) { token.def = token.str; return token; }     else if (token.str.Equals("IF")) { token.def = token.str; return token; }     else if (token.str.Equals("THEN")) { token.def = token.str; return token; }     else if (token.str.Equals("ELSE")) { token.def = token.str; return token; }     else if (token.str.Equals("WHILE")) { token.def = token.str; return token; }     else if (token.str.Equals("DO")) { token.def = token.str; return token; }

else { token.def = "IDENT"; return token; }   }

Page 74: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

74

6章 スキャナの構築6.3 スキャナ (数値と文字列 )

  ・・・ ここは 6.3 スキャナ (GetToken) の一部   else if (isDigit(c)) 先頭の文字が数字   {     while (isDigit(c)) 2番目以降も数字の場合     {       token.str = token.str + (char)c; トークン文字列に1文字を追加       c = GetCharacter(); 次の文字を読み込む     }     UngetCharacter(c); 数字で無いので1文字を戻す     token.def = "NUMBER"; トークン定義の文字列を NUMBER に設定     return token; 呼び出し元に戻る   }

   else if (c == ‘“’) 先頭の文字が”の場合   {     c = GetCharacter(); 1文字を読み込む     while (c != ‘“’) 終わりの”でない場合     {       token.str = token.str + (char)c; トークン文字列に1文字を追加       c = GetCharacter(); 次の文字を読み込む     }     token.def = “STR”; トークン定義の文字列を STR に設定     return token; 読み出し元に戻る   }  ・・・

Page 75: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

75

6章 スキャナの構築6.3 スキャナ  ( 記号~2文字 )

  ・・・ ここは 6.3 スキャナ (GetToken) の一部   else if (c == ‘<’) 先頭の文字が<の場合   {     c = GetCharacter(); 次の文字を読み込む     if (c == ‘=’) 2番目の文字が=の場合     {       token.str = “<=”; トークン文字列を設定       token.def = “LE”; トークン定義の文字列を LE に設定       return token; 呼び出し元に戻る     }     else if (c == ‘>’) 2番目の文字が>の場合     {       token.str = “<>”; トークン文字列を設定       token.def = “NE”; トークン定義の文字列をNEに設定       return token; 呼び出し元に戻る     }     else 2番目の文字が=でも>でもない場合     {       UngetCharacter(c); 1文字を戻す       token.str = "<"; トークン文字列を設定       token.def = “LT”; トークン定義の文字列をLTに設定       return token; 呼び出し元に戻る     }    ・・・ >、>=や、:、:=も同様にして識

別する

Page 76: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

76

6章 スキャナの構築6.3 スキャナ  ( 記号~1文字 )

  ・・・ ここは 6.3 スキャナ (GetToken) の一部

   else if (c == '=') { token.str = "="; token.def = "EQ"; return token; }   else if (c == '+') { token.str = "+"; token.def = "PLUS"; return token; }   else if (c == '-') { token.str = "-"; token.def = "MINUS"; return token; }   else if (c == '*') { token.str = "*"; token.def = "MULT"; return token; }   else if (c == '/') { token.str = "/"; token.def = "DIV"; return token; }   else if (c == ';') { token.str = ";"; token.def = "SEMICOLON"; return token; }   else if (c == ',') { token.str = ","; token.def = "COMMA"; return token; }   else if (c == '(') { token.str = "("; token.def = "OPEN"; return token; }   else if (c == ')') { token.str = ")"; token.def = "CLOSE"; return token; }   else if (c == '.') { token.str = "."; token.def = "PERIOD"; return token; }

   else if (c == -1) { token.str = ""; token.def = "EOF"; token.type = ""; return token; }

   else { エラー}

Page 77: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

77

6章 スキャナの構築6.4 チェックポイント

入力ファイル (in.txt)

にデータを設定

Primitive.cs を実行し出力結果を比較

コンパイルと実行は4章を参照

Page 78: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

78

7章 文法定義ステップ5

 入力 言語仕様(5.3~新しい言語仕様)

 出力 言語仕様(パーサで使用するもの)

Page 79: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

79

変換前の言語仕様(パーサに変換できない)

↓① EBNFをBNFに変換② 共通項の除去③ 再帰性の除去(オプション)④ 分岐条件の明確化

↓変換後の言語仕様(パーサに変換できる)

7章 文法定義7.1 文法変換とパーサ

Page 80: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

80

変換元の言語仕様

<program>   →  MODULE IDENT ; [ <decllist> ] BEGIN <statlist> END IDENT .<decllist>   →  VAR ( <identlist> : <type> ; )+<statlist> → <statement> ( ; <statement> )*<identlist> →   IDENT ( , IDENT )*<type> →   INTEGER | STRING<statement> →   IDENT := <expression>

  | IF <relation> THEN <statlist> [ ELSE <statlist> ] END   | WHILE <relation> DO <statlist> END   | IDENT "(" <literal> ")“

<relation>   →  <expression> <rel op> <expression><expression> →   [ <unary op> ] <term> ( <add op> [ <unary op> ] <term> )*<term>   →  <factor> ( <mul op> <factor> )*<factor>   →  <literal> | "(" <expression> ")“<literal> →   IDENT | NUMBER | STR<rel op> →   = | < | <= | <> | > | >=<unary op>   →  + | -<add op> →   + | -<mul op> →   * | /

7章 文法定義7.2 EBNFから BNFへの変換

Page 81: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

81

7章 文法定義7.2 EBNFから BNFへの変換 EBNFの文法をBNFの文法へ変換

( )を使わない *を使わない +を使わない [ ] を使わない

使わないという意味は 別の形(BNF)で同等の操作に置き換え

る 再帰的な文法記述 ε の導入

詳細は3.3を復習

Page 82: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

82

7章 文法定義7.2 EBNFから BNFへの変換

Page 83: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

83

7章 文法定義7.2 EBNFから BNFへの変換<program> の変換

<decllist> の変換

<statlist> の変換

Page 84: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

84

7章 文法定義7.2 EBNFからBNFへの変換<identlist> の変換

<statement> の変換

Page 85: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

85

7章 文法定義7.2 EBNFからBNFへの変換<expression> の変換

<term> の変換

Page 86: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

86

7章 文法定義7.3 共通項の除去<decllist> の変換

<statement> の変換

Page 87: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

87

7章 文法定義7.4 分岐条件の明確化

分岐条件の明確化 同一ノンターミナルで複数の規則がある場合 トークンを使って分岐ができれば→分岐条件は明確

分岐条件が明確の場合 <sample>→   TOKEN-1 <next> ・・・ (A) <sample>→   TOKEN-2 <next> ・・・ (B) TOKEN-1/2 を使ってそれぞれ (A)/(B) に分岐可能

分岐条件が明確でない場合 <sample>→   TOKEN-1 <next> ・・・ (A) <sample>→   TOKEN-1 <next> ・・・ (B) TOKEN-1 では (A) に分岐して良いか、 (B) に分岐して良いか分か

らない

Page 88: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

88

7章 文法定義7.4 分岐条件の明確化

見分け方 同一ノンターミナルで複数の規則がある場合 取りうる可能性のある全てのトークンを抜き出して 重複しているトークンがあるかをチェックする

該当しない例~規則が1つしかない場合 <decllist> →   VAR <decllist1>

簡単な例 <type> →   INTEGER | STRING 取りえる可能性のあるトークンは INTEGER か STRING

簡単な例 <statement>→   IDENT <statement1> A

| IF <relation> THEN <statlist> <ifl> END B |    WHILE <relation> DO <statlist> END C

IDNET の時Aの規則、IFの時Bの規則、WHILEの時にCの規則 トークンを見て、それぞれの規則に分岐できる

Page 89: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

89

7章 文法定義7.4 分岐条件の明確化

複雑な例(テキストP106) <expression>→ <expression1> <term> <expression2> アルゴリズム的な抽出の方法はテキストにて説明 これは一見とても難しく見える・・・ 背景にある理由を理解する

理解を助ける方法について 上の規則は式を導く~ 1, -1, 1+1, 1*1, a/b, a*b*c, (1*2)+3 など つまり、 <expression2> の次はどんなトークンを導くかは、

「式」の後にどんなトークンを導くかを推定すればよい <expression> 後のトークン、 <expression2> 後のトークン、こ

れは同義 <expression1> <term> <expression2>  ● ←ここの部分 <expression> ● ←ここの部分 左辺と右辺は規則によって置き換わっただけ

Page 90: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

90

7章 文法定義7.4 分岐条件の明確化 プログラム例 (1が式を表す、●の右が次のトークン)

A:=1 ● ; → ; を導く A:=(1 ● ); → ) を導く IF A=1 ● THEN → THEN を導く WHILE A<1 ● DO → DO を導く IF 1 ● <>B → <> を導く(=比較演算子全て) IF... THEN A:=1 ● ELSE → ELSE を導く ... ELSE B:=1 ● END → END を導く

この様に該当規則がプログラム中で使われている場所を考える P106はこれを機械的にやっているだけに過ぎない 図と説明だけを目で追っていかずに背景をきちんと理解する

Page 91: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

91

7章 文法定義文法変換後の言語仕様(1 / 2 )

<program> →   MODULE IDENT ; <program1> BEGIN <statlist> END IDENT .

<program1> →   ε → {BEGIN}| <decllist> → {VAR}

<decllist> →   VAR <decllist1><decllist1> →   <identlist> : <type> ; <decllist2><decllist2> →   ε → {BEGIN}

|   <decllist1> → {IDENT}

<statlist> →   <statement> <statlist1> <statlist1> →   ε → {END, ELSE}

| ; <statement> <statlist1> → {;}

<identlist> →   IDENT <identlist1><identlist1> →   ε → {:}

| , IDENT <identlist1> → {,}

<type> →   INTEGER | STRING

<statement> →   IDENT <statement1>| IF <relation> THEN <statlist> <ifl> END|    WHILE <relation> DO <statlist> END

Page 92: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

92

7章 文法定義文法変換後の言語仕様(2 / 2 )<statement1> →   := <expression>

| ( <literal>)<if1> →   ε → {END}

| ELSE <statlist> → {ELSE}

<relation> →   <expression> <rel op> <expression><expression> →   <expression1> <term> <expression2><expression1> →   ε → {(, IDENT, NUMBER,STR)

| <unary op> → {+, -}<expression2> →   ε → {;, END, <>, <=, <, =, >, >=, THEN, DO, ), ELSE}

| <add op> <expression3> <term> <expression2> → {+, -}<expression3> →   ε → {(, IDENT, NUMBER, STR)

| <unary op> → {+, -}

<term> →   <factor> <term1><term1> →   ε → {+, -, ;, END, <>, <=, <, =, >, >=, THEN, DO, ELSE}

| <mul op> <factor> <term1> → {*, /}<factor> →   <literal> → {IDENT, N

UMBER, STR}| ( <expression> ) → {(}

<literal> →   IDENT | NUMBER | STR<rel op> →   <> | <= | < | = | > |>=<unary op> →   =+ | -<add op> →   =+ | -<mul op> →   * | /

Page 93: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

93

8章 パーサの構築ステップ6

 入力 言語仕様(7.6~変換済み言語仕様)  Primitive.cs (スキャナー実装済み)

 出力  Primitive.cs ( Hello World のみ識別するパーサ)

Page 94: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

94

8章 パーサの構築8.1 パースツリー

MODULE HelloWorld;

BEGIN

  WriteStr ( "Hello World!“ )

END HelloWorld .

入力

正常

エラー

出力

Page 95: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

95

8章 パーサの構築8.2 パーサの構築

Main・・・static void Main(string[] args){  ・・・   io.Open(inFile, outFile);   parse.Entry(); パーサのエントリー  ・・・   io.Close();  ・・・}・・・public class Parse パーサはこのクラスに記述する{

token = io.GetToken(); 最初のトークンを読み込むProgram(); プログラム(言語仕様)の最初を呼び出すXMATCH(“EOF”); 最後のトークンはEOF

}

Page 96: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

96

8章 パーサの構築8.2 パーサの構築

テスト用メソッド(パーサを構築していくときに使うと便利なメソッド)

private void strmsg(string msg) メソッド開始時に呼び出すと便利{   Console.WriteLine(msg + " started"); Console.ReadLine(); }  

private void endmsg(string msg) メソッド終了時に呼び出すと便利{   Console.WriteLine(msg + " ended"); }

private void msg() 現在のトークン内容を表示する{   Console.WriteLine("Token.str=" + token.str + " def=" + token.def); }

private void stop() エラー時には stop(); で強制終了{   Console.ReadLine(); System.Diagnostics.Process.GetCurrentProcess().Close(); }

Page 97: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

97

8章 パーサの構築8.2 パーサの構築

トークンのマッチングを行うメソッド

指定されたトークンと次のトークンを比較する。マッチしない場合は、エラーとなる。このメソッドを使うことで、マッチング処理を統一化できる上、プログラムが見やすくな

る。

private void XMATCH(string s){   if (s.Equals(token.def)) { token = io.GetToken(); }   else { Console.WriteLine("Parse error");stop();}}

指定されたトークンと現在のトークンを比較する。通常、IF文と共に使用される。

private bool MATCH(string s){   if (s.Equals(token.def))   { return true; }   else { return false; }}

Page 98: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

98

8章 パーサの構築8.2 < program>

文法 分岐条件<program>

→ MODULE IDENT ; <program1>  BEGIN   <statlist>END IDENT .

変換コードpublic void Program()

{

XMATCH("MODULE");XMATCH("IDENT");XMATCH("SEMICOLON");

//Program1();  ~8章では限定的な例題の為に、ここはコメントとする~XMATCH("BEGIN");Statlist();

XMATCH("END");XMATCH("IDENT");XMATCH("PERIOD");

Page 99: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

99

8章 パーサの構築8.2 <statlist>

文法 分岐条件<statlist>

→ <statement> <statlist1> 

変換コード public void Statlist()

{

Statement();Statlist1();

}

Page 100: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

100

8章 パーサの構築8.2 <statlist1>

文法 分岐条件<statlist1>

→ ε {END, ELSE}→ ; <statement>   <statlist1> {;}

変換コードpublic void Statlist1()

{

if (MATCH(“SEMICOLON”))   {XMATCH("SEMICOLON");Statement();Statlist1();}

}

ε を含むため、 else は不要

Page 101: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

101

8章 パーサの構築8.2 < statement>

文法 分岐条件<statement>

→ IDENT <statement1>

→ IF <relation> THEN <statlist> <ifl> END

→ WHILE <relation> DO <statlist> END

変換コードpublic void Statement()

{

if (MATCH("IDENT")) {XMATCH("IDENT"); Statement1();}

else if (MATCH("IF")) {XMATCH("IF"); Relation();XMATCH("THEN");

Statlist(); If1();XMATCH("END");}

else if (MATCH("WHILE")) {XMATCH("WHILE"); Relation();

XMATCH("DO"); Statlist();XMATCH("END");}

else { エラー }

}

Page 102: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

102

8章 パーサの構築8.2 < statement1>

文法 分岐条件<statement1>

→ := <expression>

→ (   <literal>   )

変換コードpublic void Statement1() {

if (MATCH(“OPEN”))    {XMATCH("OPEN");Literal();XMATCH("CLOSE");}

else if (MATCH(“ASSIGN”))   {XMATCH("ASSIGN");Expression();}}

else { エラー}}

Page 103: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

103

8章 パーサの構築8.2 <literal>

文法 分岐条件<literal>

→ IDENT→ NUMBER→ STR

変換コードpublic void Literal() {

if (MATCH("STR")) {XMATCH("STR");}

else if (MATCH("IDENT")) {XMATCH("IDENT");}

else if (MATCH("NUMBER")) {XMATCH("NUMBER");}

else { エラー }

}

Page 104: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

104

8章 パーサの構築8.3 チェックポイント

入力ファイル (in.txt) MODULE HelloWorld;   BEGIN   WriteStr ( "Hello World!“ ) END HelloWorld .

正常

エラー

出力 入力

Primitive.cs

public class Parse {  ・・・ 8章を実装 ・・・ }

Page 105: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

105

9章 パーサの構築(変数と関数)ステップ7

 入力 言語仕様 (9.1~変数と関数に該当する部分)  Primitive.cs (8章で作成したパーサ)

 出力  Primitive.cs (変数と関数を識別できるパーサ)

Page 106: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

106

9章 パーサの構築(変数と関数)9.1 変数と関数に関わる言語仕様 関数の必要性

ここでいう関数は入出力の意味 これが無いとプログラムの入出力が出来ない

変数の必要性 変数はメモリの一部に名前をつけたもの 変数の値を変化させることでプログラムは動く 変数が無いと途中経過や計算結果を保持できない

Page 107: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

107

9章 パーサの構築(変数と関数)9.1 変数と関数に関わる言語仕様

<program>   →  MODULE IDENT ; <program1> BEGIN <statlist> END IDENT .<program1> →   ε → {BEGIN}

  | <decllist> → {VAR}

<decllist> →   VAR <decllist1><decllist1> →   <identlist> : <type> ; <decllist2><decllist2> →   ε → {BEGIN}

|   <decllist1> → {IDENT}

<statlist> →   <statement> <statlist1> <statlist1> →   ε → {END, ELSE}

| ; <statement> <statlist1> → {;}

<identlist> →   IDENT <identlist1><identlist1> →   ε → {:}

| , IDENT <identlist1> → {,}

<type> →   INTEGER | STRING

<statement> →   IDENT <statement1><statement1> →   ( <literal>)

<literal>    →  IDENT | NUMBER | STR

Page 108: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

108

9章 パーサの構築(変数と関数)9.2 入力用データサンプル

変数定義を□、関数呼び出しを□で示している

Page 109: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

109

9章 パーサの構築(変数と関数)9.3 <program>

文法 分岐条件<program>

→ MODULE IDENT ; <program1>  BEGIN   <statlist>END IDENT .

変換コードpublic void Program()

{

XMATCH("MODULE");XMATCH("IDENT");XMATCH("SEMICOLON");

Program1();  ~8章のコメントを外す~XMATCH("BEGIN");Statlist();

XMATCH("END");XMATCH("IDENT");XMATCH("PERIOD");

Page 110: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

110

9章 パーサの構築(変数と関数)9.3 <program1>

文法 分岐条件<program1>

→ ε {BEGIN}→ <decllist> {VAR}

変換コードpublic void Program1()

{

if (MATCH(“VAR”))   {Decllist();}

}

ε を含むため、 else は不要

Page 111: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

111

9章 パーサの構築(変数と関数)9.3 <decllist>の変換

文法 分岐条件<decllist>

→ VAR <decllist1>

変換コードpublic void Decllist()

{

XMATCH("VAR");Decllist1();

}

Page 112: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

112

9章 パーサの構築(変数と関数)9.3 <decllist1>

文法 分岐条件<decllist1>

→ <identlist> : <type> ; <decllist2>

変換コードpublic void Decllist1()

{

Identlist();XMATCH("COLON");Type();XMATCH("SEMICOLON");Decllist2();

}

Page 113: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

113

9章 パーサの構築(変数と関数)9.3 <decllist2>

文法 分岐条件<decllist2>

→ ε {BEGIN}

→ <decllist1> {IDENT}

変換コードpublic void Decllist2()

{

if   (MATCH(“IDENT”))   {Decllist1();}

}ε を含むため、 else は不要

Page 114: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

114

9章 パーサの構築(変数と関数)9.3 <identlist>

文法 分岐条件<identlist>

→ IDENT <identlist1>

変換コード public void Identlist()

{

XMATCH("IDENT");Identlist1();

}

Page 115: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

115

9章 パーサの構築(変数と関数)9.3 <identlist1>

文法 分岐条件<identlist1>

→ ε {:}→ , IDENT <identlist1>  {,}

変換コード public void Identlist1()

{

if (MATCH(“COMMA”))   {XMATCH("COMMA"); XMATCH("IDENT");Identlist1();}

}

ε を含むため、 else は不要

Page 116: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

116

9章 パーサの構築(変数と関数)9.3 <type>

文法 分岐条件<type>

→ INTEGER→ STRING

変換コードpublic void Type()

{

if (MATCH(“INTEGER”))   {XMATCH("INTEGER");}

else if (MATCH("STRING")) {XMATCH("STRING");}

else { エラー}}

Page 117: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

117

9章 パーサの構築(変数と関数)9.3 < statement>

文法 分岐条件<statement>

→ IDENT <statement1> 9章ではこの部分だけ実装する

変換コードpublic void Statement()

{

if (MATCH("IDENT")) {XMATCH("IDENT"); Statement1();}

else { エラー }

}

Page 118: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

118

9章 パーサの構築(変数と関数)9.3 < statement1>

文法 分岐条件<statement1>

→ (   <literal>   ) 9章ではこの部分だけ実装する

変換コードpublic void Statement1() {

if (MATCH(“OPEN”))    {XMATCH("OPEN");Literal();XMATCH("CLOSE");}

else { エラー} }

Page 119: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

119

9章 パーサの構築(変数と関数)9.3 <literal>

文法 分岐条件<literal>

→ IDENT→ NUMBER→ STR

変換コードpublic void Literal() {

if (MATCH("STR")) {XMATCH("STR");}

else if (MATCH("IDENT")) {XMATCH("IDENT");}

else if (MATCH("NUMBER")) {XMATCH("NUMBER");}

else { エラー }

}

Page 120: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

120

9章 パーサの構築(変数と関数)9.3 チェックポイント

これは「文法」エラー? 変数の未定義、重複 関数の引数、タイプエラー 識別子、数値、文字列などに関連する不一致、実装課題(長さ)

結論から言うと・・・ これは「文法エラー」ではない~理由は言語仕様に沿っているから

この対応策は12章のシンボルテーブルで行う

Page 121: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

121

入力ファイル (in.txt)

   ~テストファイルをコピー~  (test11-15.txt)

正常

エラー

出力 入力

Primitive.cs

public class Parse {  ・・・ 9章を実装 ・・・ }

9章 パーサの構築(変数と関数)9.3 チェックポイント

Page 122: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

122

10章 パーサの構築(式と代入文)ステップ8

 入力 言語仕様 (10.1~式と代入文に該当する部分)  Primitive.cs (9章で作成したパーサ)

 出力  Primitive.cs (式と代入文を識別できるパーサ)

Page 123: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

123

10章 パーサの構築(式と代入文)10.1 式と代入文に関わる言語仕様

代入文の必要性 代入文は変数に値を格納する役割を担う 代入文が無いと変数間の値の受け渡しが出来ない

式の必要性 式は演算(値の変更)の役割を担う 式が無いと値を変更できない

Page 124: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

124

10章 パーサの構築(式と代入文)10.1 式と代入文に関わる言語仕様

~9章で提示したものは除いてあることに注意~

<statement>     →  IDENT <statement1><statement1>    →  := <expression>

     | ( <literal>)

<expression>     →  <expression1> <term> <expression2><expression1>    →  ε → {(, IDENT, NUMBER,STR)

     | <unary op> → {+, -}<expression2>    →  ε → {;, END, <>, <=, <, =, >, >=, THEN, DO, ), ELSE}

     | <add op> <expression3> <term> <expression2> → {+, -}<expression3>    →  ε → {(, IDENT, NUMBER, STR)

     | <unary op> → {+, -}

<term>     →  <factor> <term1><term1>     →  ε → {+, -, ;, END, <>, <=, <, =, >, >=, THEN, DO, ELSE}

    | <mul op> <factor> <term1> → {*, /}<factor>     →  <literal> → {IDENT, NUMBER, STR}

| ( <expression> ) → {(}

<unary op> →   + | -<add op> →   + | -<mul op> →   * | /

Page 125: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

125

10章 パーサの構築(式と代入文)10.2 入力用データサンプル

式を□、代入文を□で示している

Page 126: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

126

10章 パーサの構築(式と代入文)10.3 < statement>

文法 分岐条件<statement>

→ IDENT <statement1> 10章ではこの部分だけ実装

変換コードpublic void Statement()

{

if (MATCH("IDENT")) {XMATCH("IDENT"); Statement1();}

else { エラー }

}

Page 127: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

127

10章 パーサの構築(式と代入文)10.3 < statement1>

文法 分岐条件<statement1>

→ := <expression> ここは9章で既に実装済み→ (   <literal>   )

変換コードpublic void Statement1() {

if (MATCH(“OPEN”))    {XMATCH("OPEN");Literal();XMATCH("CLOSE");}

else if (MATCH(“ASSIGN”))   {XMATCH("ASSIGN");Expression();}}

else { エラー} }

Page 128: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

128

10章 パーサの構築(式と代入文)10.3 <expression>

文法 分岐条件<expression>

→ <expression1> <term> <expression2>

変換コードpublic void Expression()

{

Expression1();Term();Expression2();

}

Page 129: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

129

10章 パーサの構築(式と代入文)10.3 <expression1>

文法 分岐条件<expression1>

→  ε {(, IDENT, NUMBER,STR}

→ <unary op> {+, -}

変換コード public void Expression1()

{

if (MATCH("PLUS") || MATCH("MINUS")) {UnaryOp();}

}

ε を含むため、 else は不要

Page 130: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

130

10章 パーサの構築(式と代入文)10.3 <expression2>

文法 分岐条件<expression2>

→ ε {;, END, <>, <=, <, =, >, >=, THEN, DO, ), ELSE}

→ <add op> <expression3> <term> <expression2> {+, -}

変換コードpublic void Expression2()

{

if (MATCH("PLUS") || MATCH("MINUS")) {ddOp();Expression3();Term();Expression2();}

}

ε を含むため、 else は不要

Page 131: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

131

10章 パーサの構築(式と代入文)10.3 <expression3>

文法 分岐条件<expression3>

→ ε {(, IDENT, NUMBER, STR)

→ <unary op> {+, -}

変換コードpublic void Expression3()

{

if (MATCH("PLUS") || MATCH("MINUS")) {UnaryOp();}

}

ε を含むため、 else は不要

Page 132: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

132

10章 パーサの構築(式と代入文)10.3 <term>

文法 分岐条件<term>

→ <factor> <term1>

変換コードpublic void Term()

{

Factor();Term1();

}

Page 133: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

133

10章 パーサの構築(式と代入文)10.3 <term1>

文法 分岐条件<term1> → ε {+, -, ;, END,<>, <=, <, =, >, >=, THEN, DO, ELS

E} → <mul op> <factor> <term1> {*, /}

変換コードpublic void Term1()

{

if (MATCH("MULT") || MATCH("DIV")) {MultOp();Factor();Term1();}

}

ε を含むため、 else は不要

Page 134: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

134

10章 パーサの構築(式と代入文)10.3 <factor>

文法 分岐条件<factor>

→ <literal> {IDENT, NUMBER, STR}→ ( <expression> ) {(}

変換コードpublic void Factor(){

if (MATCH("OPEN")) {XMATCH("OPEN");Expression();XMATCH("CLOSE");}

else {Literal(); }

}

Page 135: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

135

10章 パーサの構築(式と代入文)10.3 <literal>

文法 分岐条件<literal>

→ IDENT→ NUMBER→ STR

変換コードpublic void Literal() {

if (MATCH("STR")) {XMATCH("STR");}

else if (MATCH("IDENT")) {XMATCH("IDENT");}

else if (MATCH("NUMBER")) {XMATCH("NUMBER");}

else { エラー }

}

Page 136: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

136

10章 パーサの構築(式と代入文)10.3 <rel op>

文法 分岐条件<rel op>

→ <> → <= → < → =→ >→ >=

変換コードpublic void RelOp ()   {

if (MATCH("EQ")) {XMATCH("EQ");}else if (MATCH("NE")) {XMATCH("NE");}else if (MATCH("LT")) {XMATCH("LT");}else if (MATCH("LE")) {XMATCH("LE");}else if (MATCH("GT")) {XMATCH("GT");} else if (MATCH("GE")) {XMATCH("GE");} else { エラー }

}

Page 137: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

137

10章 パーサの構築(式と代入文)10.3 <unary op>

文法 分岐条件<unary op>

→ +→ -

変換コードpublic void UnaryOp()

{

if (MATCH("PLUS")) {XMATCH("PLUS");}

else if (MATCH("MINUS")) {XMATCH("MINUS");}

else { エラー }

}

Page 138: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

138

10章 パーサの構築(式と代入文)10.3 <add op>

文法 分岐条件<add op>

→ +→ -

変換コードpublic void AddOp()

{

if (MATCH("PLUS")) {XMATCH("PLUS");}

else if (MATCH("MINUS")) {XMATCH("MINUS");}

else { エラー }

}

Page 139: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

139

10章 パーサの構築(式と代入文)10.3 <mul op>

文法 分岐条件<mul op>

→ *→ /

変換コードpublic void MultOp()

{

if (MATCH("MULT")) {XMATCH("MULT");}

else if (MATCH("DIV")) {XMATCH("DIV");}

else { エラー }

}

Page 140: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

140

入力ファイル (in.txt)

   ~テストファイルをコピー~  (test21-24.txt)

正常

エラー

出力 入力

Primitive.cs

public class Parse {  ・・・ 10章を実装 ・・・ }

10章 パーサの構築(式と代入文)10.3 チェックポイント

Page 141: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

141

11章 パーサの構築(選択文と繰り返し文)ステップ9

 入力 言語仕様 (11.1~選択文と繰り返し文に該当する部分)  Primitive.cs (10章で作成したパーサ)

 出力  Primitive.cs (選択文と繰り返し文を識別できるパーサ)

Page 142: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

142

11章 パーサの構築(選択文と繰り返し文)11.1 選択文の必要性

選択文は条件分岐を行う役割を担っている もし選択文が無いと、条件に応じた処理ができない それでもプログラムではあるが、計算能力が劣る 3章の Change.txt はプログラムだろうか?

繰り返し文の必要性 繰り返し文は選択文+GOTO文で実装できる もし無いと、全処理を明示的に記載する必要がある それでもプログラムではあるが、計算能力が劣る 100までの素数を繰り返し文無しで書けるだろう

か? N(Nは入力した数)はどの様に処理したらいいだろう?

Page 143: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

143

11章 パーサの構築(選択文と繰り返し文)11.1 選択文と繰り返し文の言語仕様

~9章/10章で提示したものは除いてあることに注意~

<statement> →   IDENT <statement1>| IF <relation> THEN <statlist> <ifl> END|    WHILE <relation> DO <statlist> END

<if1> →   ε → {END}| ELSE <statlist> → {ELSE}

<relation> →   <expression> <rel op> <expression>

<rel op> →   <> | <= | < | = | > |>=

Page 144: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

144

選択文と□、繰り返し文を□で示している

11章 パーサの構築(選択文と繰り返し文)11.2 入力用データサンプル

Page 145: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

145

選択文と□、繰り返し文を□で示している

11章 パーサの構築(選択文と繰り返し文)11.2 入力用データサンプル

Page 146: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

146

選択文と□、繰り返し文を□で示している

11章 パーサの構築(選択文と繰り返し文)11.2 入力用データサンプル

Page 147: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

147

11章 パーサの構築(選択文と繰り返し文)11.3 チェックポイント < statement>

文法 分岐条件<statement>

→ IDENT <statement1> 9章で実装済み→ IF <relation> THEN <statlist> <ifl> END

→ WHILE <relation> DO <statlist> END

変換コードpublic void Statement()

{

if (MATCH("IDENT")) {XMATCH("IDENT"); Statement1();}

else if (MATCH("IF")) {XMATCH("IF"); Relation();XMATCH("THEN");

Statlist(); If1();XMATCH("END");}

else if (MATCH("WHILE")) {XMATCH("WHILE"); Relation();

XMATCH("DO"); Statlist();XMATCH("END");}

else { エラー }

}

Page 148: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

148

11章 パーサの構築(選択文と繰り返し文)11.3  チェックポイント  <if1>

文法 分岐条件<if1>

→ ε {END}→ ELSE <statlist> {ELSE}

変換コードpublic void If1()

{

if (MATCH("ELSE")){XMATCH("ELSE");Statlist();}

}

ε を含むため、 else は不要

Page 149: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

149

11章 パーサの構築(選択文と繰り返し文)11.3 チェックポイント  <relation>

文法 分岐条件<relation>

→ <expression> <rel op> <expression>

変換コードpublic void Relation()

{

Expression();RelOp();Expression();

}

Page 150: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

150

11章 パーサの構築(選択文と繰り返し文)11.3 チェックポイント  <rel op>

文法 分岐条件<rel op>

→ <> → <= → < → =→ >→ >=

変換コードpublic void RelOp ()   {

if (MATCH("EQ")) {XMATCH("EQ");}else if (MATCH("NE")) {XMATCH("NE");}else if (MATCH("LT")) {XMATCH("LT");}else if (MATCH("LE")) {XMATCH("LE");}else if (MATCH("GT")) {XMATCH("GT");} else if (MATCH("GE")) {XMATCH("GE");} else { エラー }

}

Page 151: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

151

入力ファイル (in.txt)

   ~テストファイルをコピー~  (test31-37.txt)

正常

エラー

出力 入力

Primitive.cs

public class Parse {  ・・・ 11章を実装 ・・・ }

11章 パーサの構築(選択文と繰り返し文)11.3 チェックポイント

Page 152: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

152

12章 シンボルテーブルステップ10

 入力 12章で説明するシンボルテーブル 言語仕様(12.1~シンボルテーブルと連動する部分)  Primitive.cs (11章で作成したパーサ)

 出力  Primitive.cs (シンボルテーブル実装済みのパーサ)

Page 153: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

153

12章 シンボルテーブル12.1 シンボルテーブルの位置づけ

該当する言語仕様

<statement>  →  IDENT <statement1><statement1>→   ( <literal>)<literal>   →  IDENT | NUMBER | STR

問題のあるプログラム

シンボルテーブルの必要性

言語仕様には合致↓

文法エラーではない

しかし現実的に問題↓

「タイプ」、「定義の有無」等の情報を付加する

Page 154: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

154

12章 シンボルテーブル12.1 シンボルテーブルの位置づけ

シンボルテーブル

MODULE TEST;VAR  I : INTEGER;BEGIN  J := IEND TEST.

変数定義時にテーブル登録 タイプ設定時にテーブル更新

参照時にテーブル情報を確認 (タイプ、有無など)

Page 155: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

155

12章 シンボルテーブル12.2 シンボルテーブルの登録と参照

シンボルテーブル

変数定義時にテーブル登録

Add.Symbol(TOKEN);

タイプ設定時にテーブル更新 SetSymbolTYpe(“INTEGER);

参照時にテーブル情報を確認 (タイプ、有無など)

シンボルの有無の確認 If (CheckSymbol(TOKEN)<0) {未登録} else {登録済み }

Page 156: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

156

12章 シンボルテーブル12.2 シンボルテーブルの登録と参照

シンボルテーブル

public class Symbol シンボルテーブルは全てこのクラスに定義{   private int x = 0;   private const int MAX = 128; テーブルのサイズ  private int idx = -1; 登録シンボルの個数  Token[] tbl = new Token[MAX]; テーブルを作成

   public Symbol() システム入出力関数を初期設定  {     x=++idx; tbl[x]=new Token(); tbl[x].str="WriteStr"; tbl[x].def="PROC"; tbl[x].type="STRING";     x=++idx; tbl[x]=new Token(); tbl[x].str="WriteInt"; tbl[x].def="PROC"; tbl[x].type="INTEGER";     x=++idx; tbl[x]=new Token(); tbl[x].str="ReadStr"; tbl[x].def="PROC"; tbl[x].type="STRING";     x=++idx; tbl[x]=new Token(); tbl[x].str="ReadInt"; tbl[x].def="PROC"; tbl[x].type="INTEGER";   }  ・・・} 入出力

関数名 識別名引数

タイプ

Page 157: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

157

12章 シンボルテーブル12.2 シンボルテーブルの登録と参照

シンボルテーブルのメソッド

// Symbol Tablepublic class Symbol{

・・・public void PrintSymbol() 全シンボルテーブルを表示

public void AddSymbol(Token t) トークンの登録public void SetSymbolType(string type) タイプの登録public int CheckSymbol(Token t) トークン(=変数)の有無を確認

public int GetIndex() シンボルテーブルの登録数public Token GetSymbol(int i) 指定されたシンボルを返却・・・

}

Page 158: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

158

12章 シンボルテーブル12.3 パーサとの連動

言語仕様 (赤字は実装したパーサ部分に記載する操作)

<identlist> →  変数の登録  IDENT <identlist1><identlist1> →   ε

| , 変数の登録  IDENT <identlist1><type> →  タイプ(INTEGER)の設定 INTEGER

|   タイプ(STRING)の設定  STRING

<statement> →   IDENT <statement1><statement1> →   := <expression>  変数(左辺)の確認

| ( <literal>)

<term> →   <factor> 変数(右辺)の確認 <term1><term1> →   ε

| <mul op> <factor> 変数(右辺)の確認 <term1>

<factor> →   <literal>| ( <expression> )

<literal> →   IDENT | NUMBER | STR

Page 159: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

159

12章 シンボルテーブル12.3 パーサとの連動

変数の登録

public void Identlist(){

symbol.AddSymbol(token);XMATCH("IDENT");Identlist1();

}

public void Identlist1(){

if (MATCH("COMMA"))    {

    XMATCH("COMMA");   symbol.AddSymbol(token);    XMATCH("IDENT");    Identlist1();}

}

タイプの設定

public void Type(){

if (MATCH("INTEGER"))    {

   symbol.SetSymbolType("INTEGER");    XMATCH("INTEGER");}else if (MATCH("STRING")){   symbol.SetSymbolType("STRING");    XMATCH("STRING");}else{   エラー}

}

この状態の トークンを使う

Page 160: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

160

12章 シンボルテーブル12.3 パーサとの連動

変数(左辺)の確認

public void Statement(){    if (MATCH("IDENT"))

{    Token id = new Token();    id.str = token.str;    id.def = token.def;    id.type = token.type;    XMATCH("IDENT");    Statement1(id);}・・・

}

public void Statement1(Token id){

if (MATCH("ASSIGN")){

       XMATCH("ASSIGN");    Expression();    if (symbol.CheckSymbol(id) < 0)    {

         左辺( id.str )シンボルが未定義 ;stop();    }}else if (MATCH("OPEN")){    XMATCH("OPEN");    Token parameter = new Token();    Literal(parameter);  ~右辺のチェック~    XMATCH("CLOSE");}・・・

}

Page 161: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

161

12章 シンボルテーブル12.3 パーサとの連動

変数(右辺)の確認

public void Term(){

Token parameter = new Token();Factor(parameter);if (parameter.def.Equals("IDENT") && symbol.CheckSymbol(parameter) < 0){   右辺( parameter.str )シンボルが未定義 ;stop();}Term1();

}

public void Term1(){

Token parameter = new Token();if (MATCH("MULT") || MATCH("DIV")){    MultOp(); Factor(parameter);    if (parameter.def.Equals("IDENT") && symbol.CheckSymbol(parameter) < 0)    {

         右辺( parameter.str )が未定義 ;stop();    }    Term1();}

}

トークン格納用実際の設定は次ページ参照

トークン格納用実際の設定は次ページ参照

Page 162: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

162

変数(右辺)の確認 (これらのメソッドはパラメータ設定のために使用される)

public void Factor(Token parameter){

if (MATCH("OPEN")) {    XMATCH("OPEN"); Expression(); XMATCH("CLOSE");}else{    Literal(parameter); }

}

public void Literal(Token parameter){

parameter.str = token.str;parameter.def = token.def;parameter.type = token.type;

if      (MATCH("IDENT")) { XMATCH("IDENT"); }else if (MATCH("NUMBER")) { XMATCH("NUMBER"); }else if (MATCH("STR")) { XMATCH("STR"); }else { Console.WriteLine("Parse error - literal"); }

}

12章 シンボルテーブル12.3 パーサとの連動

Page 163: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

163

12章 シンボルテーブル12.4 チェックポイント

力試しをしてみよう

Page 164: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

164

13章 コードジェネレータステップ11

 入力  言語仕様 (13.1~HelloWorld に該当する部分)  Primitive.cs (12章で作成したパーサ)

 出力  Primitive.cs ( HelloWorld を出力するコンパイラ)

Page 165: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

165

13章 コードジェネレータ13.1 Primitive 言語とアセンブラの対応

Primitive 言語

~HelloWorld!の各文字に同様の処理 ~

アセンブラ (マクロアセンブラ)

Primitive.cs

コードジェネレータ

Page 166: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

166

13章 コードジェネレータ13.1 Primitive 言語とアセンブラの対応

現時点では固定的に出力している

io.sw.WriteLine(";ml out.asm /c /coff");io.sw.WriteLine(";link /Subsystem:console out.obj kernel32.lib

iolib.lib");io.sw.WriteLine("");io.sw.WriteLine(".586");io.sw.WriteLine(".model flat,stdcall");io.sw.WriteLine("");io.sw.WriteLine("INCLUDE iolib.inc");io.sw.WriteLine("");io.sw.WriteLine(".data");io.sw.WriteLine(" Msg db \"Hello World!\\n\",0");io.sw.WriteLine("");io.sw.WriteLine(".code");io.sw.WriteLine("");io.sw.WriteLine("_start:");io.sw.WriteLine(" invoke OutputString, NEAR32 PTR

Msg");io.sw.WriteLine(" invoke PauseProgram");io.sw.WriteLine(" invoke ExitProcess,0");io.sw.WriteLine("end _start");io.sw.WriteLine("");io.sw.WriteLine("END");

Primitive.cs (前章で作成)

コードジェネレータイメージ

既に「出来上がった」パーサに出力処理を「埋め込んで」いく

・・・・・・

・・・・・・

・・・・・・

・・・・・・

・・・・・・

Page 167: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

167

13章 コードジェネレータ13.3 コードジェネレータ例

パーサに、①~⑥の出力処理を「追加」する重要:パーサの「ロジック部分は変更しない」~追加するだけ

~HelloWorld!の各文字に同様の処理 ~

データ部

コード部

プログラム部 ① プログラム部の開始時 

⑥ プログラム部の終了時

② データ部の開始時 

③ データ部の終了時

④ コード部の開始時

⑤ コード部の終了時

HelloWorld 部

Page 168: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

168

13章 コードジェネレータ13.3 コードジェネレータ例

一番小さいプログラムに必要な言語仕様

<program>   →  MODULE IDENT ;

① の出力処理を追加

<program1>

② の出力処理を追加③の出力処理を追加

④の出力処理を追加BEGIN <statlist> END IDENT .

⑤の出力処理を追加

⑥の出力処理を追加

Page 169: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

169

13章 コードジェネレータ13.3 コードジェネレータ例

プログラム部分(①、⑥のコード生成)

Page 170: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

170

13章 コードジェネレータ13.3 コードジェネレータ例データ部分(上から②、③のコード生成) コード部分(上から④、⑤のコード生成)

Page 171: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

171

13章 コードジェネレータ13.3 コードジェネレータ例

HelloWorld に必要な言語仕様

<statement> →   IDENT   ① 関数名を次のメソッドへ送

る    <statement1>

<statement1> →   (   ② 格納用トークンを次のメ

ソッドへ送る    <literal>   ④ 出力処理を行う

    )<literal> →  ③ パラメータを設定する

    STR

Page 172: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

172

13章 コードジェネレータ13.3 コードジェネレータ例HelloWorldの出力処理

13章の場合は、パラメータに設定されているトークンは:id.str=WriteStrparameter.str=HelloWorld

Page 173: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

173

13章 コードジェネレータ13.4 チェックポイント

Page 174: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

174

13章 コードジェネレータ13.4 チェックポイント

入力ファイル (in.txt)

~テストファイルをコピー~ (test41.txt)

出力 入力

Primitive.cs

public class Parse {  ・・・ 13章を実装 ・・・ }

出力ファイル (out.asm)

~4章に沿って実行し 結果を確認~

Hello World!

Page 175: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

175

14章 コードジェネレータ(変数と関数)ステップ12

 入力  言語仕様 (7.6から必要部分を選択したもの)  Primitive.cs (13章で作成したコンパイラ)

 出力  Primitive.cs (変数と関数を生成するコンパイラ)

Page 176: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

176

14章 コードジェネレータ(変数と関数)14.1 入力データサンプル

変数定義を□、関数呼び出しを□で示している

32ビットの整数型を定義

・ WriteStr は前章の HelloWorld と同様に実装する・その他は該当するシステム入出力を呼び出す

Page 177: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

177

14章 コードジェネレータ(変数と関数)14.2 出力データサンプル

変数・定数はプログラムの入力に応じたものに変更する□

・ invoke を用いて iolib.lib の入出力関数を呼び出す(13.2、付録 I 参照)

Page 178: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

178

14章 コードジェネレータ(変数と関数)14.3 パーサとの連動

前章で作成したメソッドに対して、新しい処理を「追加」する

Page 179: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

179

14章 コードジェネレータ(変数と関数)14.4 コードジェネレータの実装データ定義: シンボルテーブルの変数データを生成

Page 180: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

180

14章 コードジェネレータ(変数と関数)14.4 コードジェネレータの実装

関数定義: 関数呼び出しに新しい関数を追加

Page 181: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

181

14章 コードジェネレータ(変数と関数)14.5 チェックポイント

入力ファイル (in.txt)

 ~テストファイルをコピー~ (test41.txt)

出力 入力

Primitive.cs

public class Parse {  ・・・ 14章を実装  ・・・ }

出力ファイル (out.asm) ~4章に沿って実行し

 結果を確認~

Hello World!

① 既存の下記メソッドを修正・ StrData メソッド・ GenerateFunctionCall メソッド② コンパイル後に実行し、出力アセンブラを確認③アセンブル、リンク後に実行し、画面表示を確認

Page 182: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

182

15章 コードジェネレータ(式と代入文)ステップ13

 入力  言語仕様 (7.6から必要部分を選択したもの)  Primitive.cs (14章で作成したコンパイラ)

 出力  Primitive.cs (式と代入文生成するコンパイラ)

Page 183: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

183

15章 コードジェネレータ(式と代入文)15.1 スタック

スタックとは・・・・データ構造・アクセス命令はプッシュ、ポッ

プ・一番上にしかアクセスできない・特徴は「 Last-In/First-Out」・プログラムで簡単に実装できる・お皿を重ねているイメージ

Page 184: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

184

15章 コードジェネレータ(式と代入文)15.1 スタック

実行すると パースツリー 

スタックと計算は相性が良い

push(3)

push(1)

push(2)

push(pop()*pop())

push(pop()+pop()) スタックで計算

 プログラム→パーサ(言語仕様)→パースツリー +

スタック(プッシュとポップ)=

式の計算ができる

 (演算子による実行順番が変換されている事に注意) 

Page 185: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

185

15章 コードジェネレータ(式と代入文)15.2 入力データサンプル

式を□、代入文を□で示している

Page 186: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

186

変数・定数はプログラムの入力に応じたものに変更する□

・システムのスタックを使用(宣言は不要)

・加算:  eax=eax+ebx・減算:  eax=eax-ebx・除算:  eax=eax*ebx・除算:  eax=eax/ebx (商)、 edx= 剰余

15章 コードジェネレータ(式と代入文)15.3 出力データサンプル

Page 187: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

187

前章で作成したメソッドに対して、新しい処理を「追加」する

15章 コードジェネレータ(式と代入文)15.4 パーサとの連動

Page 188: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

188

代入文: スタックをポップし、該当する変数に格納

15章 コードジェネレータ(式と代入文)15.5 コードジェネレータの実装

変数・定数: 該当する変数・定数を受け取り、スタックにプッシュ

Page 189: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

189

四則(加減乗除)演算: スタックを2回ポップ、計算結果をプッシュ

15章 コードジェネレータ(式と代入文)15.5 コードジェネレータの実装

Page 190: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

190

パーサの変更: 代入文

15章 コードジェネレータ(式と代入文)15.5 コードジェネレータの実装

Page 191: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

191

パーサの変更: 定数・変数・式

15章 コードジェネレータ(式と代入文)15.5 コードジェネレータの実装

Page 192: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

192

15章 コードジェネレータ(式と代入文)15.6 チェックポイント

  Change.txt  が実行できてから 次の章へ進もう!

入力ファイル (in.txt)

~テストファイルをコピー~ (test51-53.txt)

出力 入力

Primitive.cs

public class Parse {  ・・・ 15章を実装 ・・・ }

出力ファイル (out.asm)

~4章に沿って実行し 結果を確認~

Hello World!

Page 193: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

193

16章 コードジェネレータ(選択文)ステップ14

 入力 言語仕様 (7.6から必要部分を選択したもの)  Primitive.cs (15章で作成したコンパイラ)

 出力  Primitive.cs (選択文を生成するコンパイラ)

Page 194: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

194

16章 コードジェネレータ(選択文)16.1 構造化プログラムとブロック

ブロックとは・・・・コードをまとめたくくり・選択文のコード生成がし易い・IF、TRUE、FALSEブロックがある・各ブロックには番号が付く→

選択文に関する構造をブロックを用いて、条件分岐とラベルを表現する

Page 195: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

195

16章 コードジェネレータ(選択文)16.2 入力データサンプルIFブロックを□、TRUE/FALSEブロックを□で示している

Page 196: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

196

16章 コードジェネレータ(選択文)16.2 入力データサンプル

Page 197: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

197

16章 コードジェネレータ(選択文)16.3 出力データサンプル

Page 198: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

198

前章で作成したメソッドに対して、新しい処理を「追加」する

16章 コードジェネレータ(選択文)16.4 パーサとの連動

Page 199: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

199

ブロック番号開始・終了: ブロック番号の生成)

16章 コードジェネレータ(選択文)16.5 コードジェネレータの実装

・この場合の深さは2階層になる・①~②はブロック番号

Page 200: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

200

ブロック開始・終了: ブロックレベルの生成

16章 コードジェネレータ(選択文)16.5 コードジェネレータの実装

Page 201: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

201

条件分岐: (IF文の)比較演算子に合致した分岐命令を生成 

16章 コードジェネレータ(選択文)16.5 コードジェネレータの実装

Page 202: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

202

パーサの変更: 選択文

16章 コードジェネレータ(選択文)16.5 コードジェネレータの実装

Page 203: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

203

パーサの変更: 条件分岐

16章 コードジェネレータ(選択文)16.5 コードジェネレータの実装

Page 204: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

204

16章 コードジェネレータ(選択文)16.6 チェックポイント

入力ファイル (in.txt)

~テストファイルをコピー~ (test61-63.txt)

出力 入力

Primitive.cs

public class Parse {  ・・・ 16章を実装  ・・・ }

出力ファイル (out.asm)

~4章に沿って実行し 結果を確認~

Hello World!

Page 205: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

205

17章 コードジェネレータ(繰り返し文)ステップ15

 入力 言語仕様 (7.6から必要部分を選択したもの)  Primitive.cs (16章で作成したコンパイラ)

 出力  Primitive.cs (繰り返し文を生成するコンパイラ)

Page 206: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

206

17章 コードジェネレータ(繰り返し文)17.1 繰り返しにおけるブロック

ブロックは前章と同様に扱う、但し・WHILEの時、TRUEブロックを使う・FALSEブロックは使用しない・下記⑦を追加

①WHILE 条件式  もし真なら②に分岐  もし偽なら④へ分岐

②THEN の場合はここへ

⑦ここから①に分岐 ③は使用しない

④、⑤は使用しない

Page 207: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

207

17章 コードジェネレータ(繰り返し文)17.2 入力データサンプルWHILEブロックを□、TRUEブロックを□で示している

Page 208: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

208

17章 コードジェネレータ(繰り返し文)17.3 出力データサンプル

Page 209: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

209

前章で作成したメソッドに対して、新しい処理を「追加」する

17章 コードジェネレータ(繰り返し文)17.4 パーサとの連動

Page 210: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

210

ブロック開始分岐: WHILEブロックへの無条件分岐命令の生成

17章 コードジェネレータ(繰り返し文)17.5 コードジェネレータの実装

①WHILE 条件式   もし真なら②に分岐  もし偽なら④へ分岐

②THEN の場合はここへ

⑦ここから①に分岐 ③は使用しない

④、⑤は使用しない

Page 211: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

211

パーサの変更: 繰り返し文

17章 コードジェネレータ(繰り返し文)17.5 コードジェネレータの実装

Page 212: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

212

17章 コードジェネレータ(繰り返し文)17.6 チェックポイント

~最終テスト~Fibonacci.txt

Prime.txt

をコンパイルして、実行しよう

 思った結果が得られただろうか? 

入力ファイル (in.txt)

~テストファイルをコピー~ (test71-72.txt)

出力 入力

Primitive.cs

public class Parse {  ・・・ 17章を実装  ・・・ }

出力ファイル (out.asm)

~4章に沿って実行し 結果を確認~

おめでとう !

Page 213: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

213

参考資料

 パーサの構築 テストプログラム 言語仕様 付録CD内容について

Page 214: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

214

参考資料 パーサの構築< program>

文法 分岐条件<program>

→ MODULE IDENT ; <program1>  BEGIN   <statlist>END IDENT .

変換コードpublic void Program()

{

XMATCH("MODULE");XMATCH("IDENT");XMATCH("SEMICOLON");Program1();

XMATCH("BEGIN");Statlist();

XMATCH("END");XMATCH("IDENT");XMATCH("PERIOD");

Page 215: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

215

参考資料 パーサの構築< program1>

文法 分岐条件<program1>

→ ε {BEGIN}→ <decllist> {VAR}

変換コードpublic void Program1()

{

if (MATCH(“VAR”))   {Decllist();}

}

ε を含むため、 else は不要

Page 216: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

216

参考資料 パーサの構築<decllist>の変換

文法 分岐条件<decllist>

→ VAR <decllist1>

変換コードpublic void Decllist()

{

XMATCH("VAR");Decllist1();

}

Page 217: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

217

参考資料 パーサの構築<decllist1>

文法 分岐条件<decllist1>

→ <identlist> : <type> ; <decllist2>

変換コードpublic void Decllist1()

{

Identlist();XMATCH("COLON");Type();XMATCH("SEMICOLON");Decllist2();

}

Page 218: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

218

参考資料 パーサの構築 <decllist2>

文法 分岐条件<decllist2>

→ ε {BEGIN}

→ <decllist1> {IDENT}

変換コードpublic void Decllist2()

{

if   (MATCH(“IDENT”))   {Decllist1();}

}ε を含むため、 else は不要

Page 219: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

219

参考資料 パーサの構築 <statlist>

文法 分岐条件<statlist>

→ <statement> <statlist1> 

変換コード public void Statlist()

{

Statement();Statlist1();

}

Page 220: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

220

参考資料 パーサの構築 <statlist1>

文法 分岐条件<statlist1>

→ ε {END, ELSE}→ ; <statement>   <statlist1> {;}

変換コードpublic void Statlist1()

{

if (MATCH(“SEMICOLON”))   {XMATCH("SEMICOLON");Statement();Statlist1();}

}

ε を含むため、 else は不要

Page 221: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

221

参考資料 パーサの構築 <identlist>

文法 分岐条件<identlist>

→ IDENT <identlist1>

変換コード public void Identlist()

{

XMATCH("IDENT");Identlist1();

}

Page 222: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

222

参考資料 パーサの構築 <identlist1>

文法 分岐条件<identlist1>

→ ε {:}→ , IDENT <identlist1>  {,}

変換コード public void Identlist1()

{

if (MATCH(“COMMA”))   {XMATCH("COMMA"); XMATCH("IDENT");Identlist1();}

}

ε を含むため、 else は不要

Page 223: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

223

参考資料 パーサの構築 <type>

文法 分岐条件<type>

→ INTEGER→ STRING

変換コードpublic void Type()

{

if (MATCH(“INTEGER”))   {XMATCH("INTEGER");}

else if (MATCH("STRING")) {XMATCH("STRING");}

else { エラー}}

Page 224: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

224

参考資料 パーサの構築 < statement>

文法 分岐条件<statement>

→ IDENT <statement1>

→ IF <relation> THEN <statlist> <ifl> END

→ WHILE <relation> DO <statlist> END

変換コードpublic void Statement()

{

if (MATCH("IDENT")) {XMATCH("IDENT"); Statement1();}

else if (MATCH("IF")) {XMATCH("IF"); Relation();XMATCH("THEN");

Statlist(); If1();XMATCH("END");}

else if (MATCH("WHILE")) {XMATCH("WHILE"); Relation();

XMATCH("DO"); Statlist();XMATCH("END");}

else { エラー }

}

Page 225: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

225

参考資料 パーサの構築 < statement1>

文法 分岐条件<statement1>

→ := <expression>

→ (   <literal>   )

変換コードpublic void Statement1() {

if (MATCH(“OPEN”))    {XMATCH("OPEN");Literal();XMATCH("CLOSE");}

else if (MATCH(“ASSIGN”))   {XMATCH("ASSIGN");Expression();}}

else { エラー} }

Page 226: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

226

参考資料 パーサの構築 <if1>

文法 分岐条件<if1>

→ ε {END}→ ELSE <statlist> {ELSE}

変換コードpublic void If1()

{

if (MATCH("ELSE")){XMATCH("ELSE");Statlist();}

}

ε を含むため、 else は不要

Page 227: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

227

参考資料 パーサの構築 <relation>

文法 分岐条件<relation>

→ <expression> <rel op> <expression>

変換コードpublic void Relation()

{

Expression();RelOp();Expression();

}

Page 228: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

228

参考資料 パーサの構築 <expression>

文法 分岐条件<expression>

→ <expression1> <term> <expression2>

変換コードpublic void Expression()

{

Expression1();Term();Expression2();

}

Page 229: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

229

参考資料 パーサの構築 <expression1>

文法 分岐条件<expression1>

→  ε {(, IDENT, NUMBER,STR}

→ <unary op> {+, -}

変換コード public void Expression1()

{

if (MATCH("PLUS") || MATCH("MINUS")) {UnaryOp();}

}

ε を含むため、 else は不要

Page 230: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

230

参考資料 パーサの構築 <expression2>

文法 分岐条件<expression2>

→ ε {;, END, <>, <=, <, =, >, >=, THEN, DO, ), ELSE}

→ <add op> <expression3> <term> <expression2> {+, -}

変換コードpublic void Expression2()

{

if (MATCH("PLUS") || MATCH("MINUS")) {ddOp();Expression3();Term();Expression2();}

}

ε を含むため、 else は不要

Page 231: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

231

参考資料 パーサの構築 <expression3>

文法 分岐条件<expression3>

→ ε {(, IDENT, NUMBER, STR)

→ <unary op> {+, -}

変換コードpublic void Expression3()

{

if (MATCH("PLUS") || MATCH("MINUS")) {UnaryOp();}

}

ε を含むため、 else は不要

Page 232: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

232

参考資料 パーサの構築 <term>

文法 分岐条件<term>

→ <factor> <term1>

変換コードpublic void Term()

{

Factor();Term1();

}

Page 233: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

233

参考資料 パーサの構築 <term1>

文法 分岐条件<term1> → ε {+, -, ;, END,<>, <=, <, =, >, >=, THEN, DO, ELS

E} → <mul op> <factor> <term1> {*, /}

変換コードpublic void Term1()

{

if (MATCH("MULT") || MATCH("DIV")) {MultOp();Factor();Term1();}

}

ε を含むため、 else は不要

Page 234: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

234

参考資料 パーサの構築 <factor>

文法 分岐条件<factor>

→ <literal> {IDENT, NUMBER, STR}→ ( <expression> ) {(}

変換コードpublic void Factor(){

if (MATCH("OPEN")) {XMATCH("OPEN");Expression();XMATCH("CLOSE");}

else {Literal(); }

}

Page 235: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

235

参考資料 パーサの構築 <literal>

文法 分岐条件<literal>

→ IDENT→ NUMBER→ STR

変換コードpublic void Literal() {

if (MATCH("STR")) {XMATCH("STR");}

else if (MATCH("IDENT")) {XMATCH("IDENT");}

else if (MATCH("NUMBER")) {XMATCH("NUMBER");}

else { エラー }

}

Page 236: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

236

参考資料 パーサの構築 <rel op>

文法 分岐条件<rel op>

→ <> → <= → < → =→ >→ >=

変換コードpublic void RelOp ()   {

if (MATCH("EQ")) {XMATCH("EQ");}else if (MATCH("NE")) {XMATCH("NE");}else if (MATCH("LT")) {XMATCH("LT");}else if (MATCH("LE")) {XMATCH("LE");}else if (MATCH("GT")) {XMATCH("GT");} else if (MATCH("GE")) {XMATCH("GE");} else { エラー }

}

Page 237: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

237

参考資料 パーサの構築 <unary op>

文法 分岐条件<unary op>

→ +→ -

変換コードpublic void UnaryOp()

{

if (MATCH("PLUS")) {XMATCH("PLUS");}

else if (MATCH("MINUS")) {XMATCH("MINUS");}

else { エラー }

}

Page 238: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

238

参考資料 パーサの構築 <add op>

文法 分岐条件<add op>

→ +→ -

変換コードpublic void AddOp()

{

if (MATCH("PLUS")) {XMATCH("PLUS");}

else if (MATCH("MINUS")) {XMATCH("MINUS");}

else { エラー }

}

Page 239: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

239

参考資料 パーサの構築 <mul op>

文法 分岐条件<mul op>

→ *→ /

変換コードpublic void MultOp()

{

if (MATCH("MULT")) {XMATCH("MULT");}

else if (MATCH("DIV")) {XMATCH("DIV");}

else { エラー }

}

Page 240: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

240

参考資料 テストプログラムChange.txt

Page 241: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

241

参考資料 テストプログラムFibonacci.txt

Page 242: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

242

参考資料 テストプログラムPrime.txt

Page 243: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

243

参考資料 言語仕様オリジナルの言語仕様<program> →   MODULE <ident> ; [ <decllist> ] BEGIN <statlist> END <ident> .<ident> →   <letter> ( <letter> | <digit> )*<decllist> →   VAR ( <identlist> : <type> ; )+<statlist> →   <statement> ( ; <statement> )*<identlist> →   <ident> ( , <ident> )*<type> →   INTEGER | STRING<statement> →   <ident> := <expression> | IF <relation> THEN <statlist> [ ELSE <statlist> ] END

| WHILE <relation> DO <statlist> END| <ident> "(" <literal> ")“

<relation> →   <expression> <rel op> <expression><expression> →   <unary op> ] <term> ( <add op> [ <unary op> ] <term> )*<term> →   <factor> ( <mul op> <factor> )*<factor> →   <literal> | "(" <expression> ")“<literal> →   <ident> | <integer> | <string><integer> →   <digit>+<rel op> →   = | < | <= | <> | > | >=<unary op> →   + | -<add op> →   + | -<mul op> →   * | /<digit> →   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9<string> →   " <any character except EOF, EOL and "> “<letter> →   a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |

   A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

Page 244: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

244

参考資料 言語仕様 スキャナー後の言語仕様<program> →   MODULE IDENT ; [ <decllist> ] BEGIN <statlist> END IDENT .<decllist> →   VAR ( <identlist> : <type> ; )+<statlist> → <statement> ( ; <statement> )*<identlist> →   IDENT ( , IDENT )*<type> →   INTEGER | STRING<statement> →   IDENT := <expression>

  | IF <relation> THEN <statlist> [ ELSE <statlist> ] END  | WHILE <relation> DO <statlist> END  | IDENT "(" <literal> ")“

<relation> →   <expression> <rel op> <expression><expression> →   [ <unary op> ] <term> ( <add op> [ <unary op> ] <term> )*<term> →   <factor> ( <mul op> <factor> )*<factor> →   <literal> | "(" <expression> ")“<literal> →   IDENT | NUMBER | STR<rel op> →   = | < | <= | <> | > | >=<unary op> →   + | -<add op> →   + | -<mul op> →   * | /

Page 245: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

245

参考資料 言語仕様文法変換後の言語仕様(1 / 2 )

<program> →   MODULE IDENT ; <program1> BEGIN <statlist> END IDENT .

<program1> →   ε → {BEGIN}| <decllist> → {VAR}

<decllist> →   VAR <decllist1><decllist1> →   <identlist> : <type> ; <decllist2><decllist2> →   ε → {BEGIN}

|   <decllist1> → {IDENT}

<statlist> →   <statement> <statlist1> <statlist1> →   ε → {END, ELSE}

| ; <statement> <statlist1> → {;}

<identlist> →   IDENT <identlist1><identlist1> →   ε → {:}

| , IDENT <identlist1> → {,}

<type> →   INTEGER | STRING

<statement> →   IDENT <statement1>| IF <relation> THEN <statlist> <ifl> END|    WHILE <relation> DO <statlist> END

Page 246: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

246

参考資料 言語仕様文法変換後の言語仕様(2 / 2 )<statement1> →   := <expression>

| ( <literal>)<if1> →   ε → {END}

| ELSE <statlist> → {ELSE}

<relation> →   <expression> <rel op> <expression><expression> →   <expression1> <term> <expression2><expression1> →   ε → {(, IDENT, NUMBER,STR)

| <unary op> → {+, -}<expression2> →   ε → {;, END, <>, <=, <, =, >, >=, THEN, DO, ), ELSE}

| <add op> <expression3> <term> <expression2> → {+, -}<expression3> →   ε → {(, IDENT, NUMBER, STR)

| <unary op> → {+, -}

<term> →   <factor> <term1><term1> →   ε → {+, -, ;, END, <>, <=, <, =, >, >=, THEN, DO, ELSE}

| <mul op> <factor> <term1> → {*, /}<factor> →   <literal> → {IDENT, N

UMBER, STR}| ( <expression> ) → {(}

<literal> →   IDENT | NUMBER | STR<rel op> →   <> | <= | < | = | > |>=<unary op> →   + | -<add op> →   + | -<mul op> →   * | /

Page 247: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

247

参考資料 付録CD-ROMVisual Studio .NET 2003 / Visual Studio 2005 の統合開発環境を使う場合(インストール後)

Page 248: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

248

参考資料 付録CD-ROMVisual C#/C++ 2005 Express Edition の統合開発環境を使う場合(インストール後)

Page 249: 本資料は、下記の資料と共に使用されることを想定してます。本資料だけをお持ちの方は、下記資料を整えた上で読み進めて下さい。

249

参考資料 付録CD-ROMコマンドラインを用いた開発を行う場合(インストール後)