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

Similar documents
Microsoft PowerPoint - 03BNFScanner-print.ppt

PowerPoint プレゼンテーション

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

Microsoft PowerPoint ppt

Microsoft Word - Javacc.docx

Microsoft Word - problem3.doc

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

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

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

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

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

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

オートマトンと言語

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

nlp1-04a.key

Microsoft PowerPoint ppt

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

プログラミング実習I

Microsoft PowerPoint - Compiler03note.pptx

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

Microsoft PowerPoint - ruby_instruction.ppt

Microsoft Word - problem5.doc

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

PowerPoint プレゼンテーション

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Java講座

PowerPoint プレゼンテーション

JavaプログラミングⅠ

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - Compiler03.pptx

ポインタ変数

kantan_C_1_iro3.indd

新版 明解C++入門編

Microsoft PowerPoint - 11Syntax.ppt

Prog1_2nd

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

Report#2.docx

文字列操作と正規表現

ポインタ変数

関東/関西/九州同時開催 女性エンジニア大集合!新春LT 座談会 スクリプト インタプリタを 作ってみた 1 スクリプトインタプリタを作ってみた

02: 変数と標準入出力

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Report#2.docx

PowerPoint Presentation

C8

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

シェルプログラミング コマンドをパイプでつなげるだけでは済まないような ある程度まとまった処理を複数のコマンドを制御構文を用いたりしてファイルとしたものを ( シェル ) スクリプトと呼ぶ シェルプログラム バッチなどともいう.bash_profile もシェルスクリプトなので このファイルを解読し

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

Microsoft PowerPoint - Compiler05.pptx

ポインタ変数

Prog1_6th

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

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

第10回 モジュール

JavaプログラミングⅠ

Microsoft PowerPoint - Compiler06note.pptx

JavaプログラミングⅠ

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

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

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

ExcelVBA

Prog1_10th

Prog1_3rd

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

プレポスト【解説】

Microsoft PowerPoint - enshu4.ppt [äº™æ‘łã…¢ã…¼ã…›]

Microsoft PowerPoint - Compiler05note.pptx

JavaプログラミングⅠ

nlp1-05.key

第12回 モナドパーサ

Microsoft PowerPoint - Compiler06.pptx

Prog1_10th

GSLetterNeo vol 年 7 月 形式手法コトハジメ TLA + Toolbox を使って (2)- 熊澤努 sra.co.jp はじめに GSLetterNeo Vol.130 で TLA + Toolbox を紹介しました 今回からより詳しく T

JavaプログラミングⅠ

02: 変数と標準入出力

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

PowerPoint プレゼンテーション

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - 13Kadai.pptx

解きながら学ぶC++入門編

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

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 文字列 文字列リテラル プログラムの中で文字列を表す方法は幾つか有るが 基本的な方法は下記の 2 種で有る 対象と成る文字の集まりをダブルクオーテーション ( " ) で囲うか シングルクオーテーション ( ' ) で囲う PYTHON3 "

2006年10月5日(木)実施

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

02: 変数と標準入出力

gengo1-2

Microsoft Word - DF-Salford解説09.doc

02: 変数と標準入出力

Microsoft PowerPoint - prog03.ppt

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

2-1 / 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリ

PowerPoint プレゼンテーション

Microsoft Word - no103.docx

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

※ ポイント ※

PowerPoint Presentation

Microsoft Word - 3new.doc

sinfI2005_VBA.doc

Fortran 勉強会 第 5 回 辻野智紀

Transcription:

コンパイラ理論 3 BNF と EBNF そして構文解析へ 3 章ステップ 1: 問題の把握 櫻井彰人 と文法 と EBNF 言語仕様 プログラムと言語仕様との関係 コンパイラ入門 C# で学ぶ理論と実践 より 3.2 BNF(Backus Naur Form) 文法 を記述する表記法 コンピュータ言語を表す為に使われることが多い 英文法 単語と単語の構成 関係を表す 5 文型は単語の品詞から英文の型を表現している プログラム言語の文法 プログラムの最小構成要素の構成 関係を表す 変数 キーワード オペレータなどの関係 代入文の 1abc=123 2123=abc どちらが正しい? 3.2 BNF の定義 ターミナル ( 終端記号 ) ノンターミナル ( 非終端記号 ) で < > と表記する 左辺と右辺はターミナルとノンターミナルの集合体 左辺 ::= 右辺 本書では左辺はノンターミナルだけに制限する 例題 < 文 > ::= < 主語 > < 動詞 > < 目的語 > < 主語 > ::= I < 動詞 > ::= Love < 目的語 > ::= You ::= は置き換えるという意味 以後 を使用 3.2 BNF の定義 を用いて出来ること 例題 文法に合致した文字列を生成 ( 導出という ) すること 文字列が文法に合致しているかどうかを 識別 すること ステップ 1~ 先頭 と定義したものから開始 ~ < 文 > ステップ2~< 文 >を< 主語 >< 動詞 >< 目的語 >によって置き換えよう~ < 主語 >< 動詞 >< 目的語 > ステップ3~< 主語 >は I によって置き換えよう~ I < 動詞 >< 目的語 > ステップ 4~< 動詞 > は Love によって置き換えよう ~ I Love < 目的語 > ステップ5~< 目的語 >は You によって置き換えよう~ I Love You ステップ6~< 文 >から I Love You を生成した~ 数 1 文字以上の数字からなる連なり <number> <digit> <number1> <number1> ε <digit> <number1> 注 : (OR) は選択を示す ( 次スライド参照 ) 生成 ( 識別 ) できる数の例 1 1 2 3 5 8 13 21 生成 ( 識別 ) できない数の例 -123( マイナスは定義されていない ) abc( 数字ではないものあり ) 1

<number> <digit> <number1> <number1> ε <digit> <number1> ( 上記の記述と同義 ) <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> 構文解析木 開始から生成完了! に到る BNF( 右辺と左辺 ) を表したもの 1 を識別した場合の構文解析木 <number> <digit> 1 <number1> ε 13 の識別した場合の構文解析木 <number> <digit> 1 <number1> <digit> 3 <number1> ε ε( エプシロン ) の意味 空文字列 空白ではなく 本当に ない ことを表す 生成時には何も生成されないし 識別時には その場所に何もなくてよいことを表す 構文解析木の表記について 木としての形が一致していればどんな形式でもかまわない 下記の解析 木 は同じ意味 横書きの場合 (13 を生成した場合 ) <number> <digit> 1 <number1> <digit> 3 <number1> ε 縦書きの場合 (13を生成した場合) <number> <digit> <number1> 1 <digit> <number1> 3 ε 3.2 BNF 例 ~ 識別子 識別子 1 文字以上の文字の列で色々な名前として使用される プログラムでは識別子と呼ばれる ( 数字を含んでいいのだが 以下では 簡単のため 数字なし ) <ident> <letter> ε <letter> <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( 数字は用いないと 定義している ) 3.2 BNF 例 ~ 識別子 Ab を生成 ステップ 1: <ident> ステップ 2: <ident> <letter> ステップ 3: <ident> <letter> A ステップ 4: <ident> <letter> A <letter> ステップ 5: <ident> <letter> A <letter> b ステップ 6: <ident> <letter> A <letter> b ε 3.3 BNF と EBNF EBNF Extended BNF( 拡張された BNF) よりコンパクトに記述できる ( ) によるグルーピング まとめて書ける * による0 回以上の繰り返し 再帰呼び出しが省略できる場合がある +による1 回以上の繰り返し 再帰呼び出しが省略できる場合がある [ ] により択一の選択 εを使わずに書ける まとめて書ける 2

3.3 EBNF~( ) と * ( 識別子 ) <ident> <letter> ε <lettter> <digit> <letter> 前例と同じ ( 英小文字 英大文字 ) <digit> 前例と同じ (0~ 字 数値 ) 同等の EBNF <ident> <letter> ( <letter> <digit> )* ( ) の効果 ( <letter> <digit> ) によって 2 つの非終端記号をまとめて記述 * の効果 ( <letter> <digit> )* により の再帰呼び出しが不要 3.3 EBNF~[ ] <program> MODULE <ident> ; <additional> END <ident>. <additional> ε <decllist> ( 変数宣言の仕方を記述する非終端記号 ) 同等の EBNF <program> --> MODULE <ident> ; [ <decllist> ] END <ident>. 例題 1~ 変数宣言が無いということと [ ] 内が選択されなかったことが対応する MODULE PROGRAM; ~ここに変数宣言が無い~ 例題 2~ 変数宣言があるということは [ ] 内が選択されたということ MODULE PROGRAM; VAR I, J, K : INTEGER; 3.3 EBNF~+ <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; 3.4 言語仕様 = プログラムの設計図 <ident> <letter> ( <letter> <digit> )* <identlist> <ident> (, <ident> )* <type> INTEGER STRING <statement> <ident> := <expression> <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> * / <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 3.4 言語仕様の説明 3.4 言語仕様の説明 <program> は変数定義と文から構成される <program> MODULE <ident> ; [ <decllist> ] <statlist> END <ident>. <identlist> <ident> (, <ident> )* <type> INTEGER STRING 変数定義例 VAR I,J,K: INTEGER; 文例 WriteStr( HelloWorld! ) <statement> <ident> := <expression> <ident> "(" <literal> ") <ident> による識別子 ~ 先頭が英字で2 文字目以降は英数字 <ident> <letter> ( <letter> <digit> )* <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>+ 普通の識別子定義 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) 符号は演算子として定義するのが普通 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> リテラル とは字面通りとか書かれた通りといった意味 意味のある最小単位というものを呼ぶときによく用いられる言葉である 3.5 言語仕様とプログラム 字句解析と構文解析 トークンの提供 プログラム MODULE HelloWorld; WriteStr ( "Hello World! ) END HelloWorld. プログラムと言語仕様の対応 MODULE <ident> ; <statlist> <statement> <ident> ( <literal> ) END <ident>. ソースプログラム 字句解析 トークンの要求 構文解析 記号表 相当する言語仕様 ( 該当する部分のみ ) <statement> <ident> "(" <literal> ") なぜ分けるか? 字句解析を構文解析から分ける理由 : 字句 の定義は 正規文法でできる 簡単な道具で済ませられるところは 簡単にすませよう! 設計が単純になる 効率 ( 速度等 ) の向上が図れる 可搬性がます字句解析 構文解析それぞれによいツールが存在する トークン 字句 パターン (Tokens, Lexemes, Patterns) トークンは キーワード (if, for, long,...) 演算子 (+,*,...) 識別子 定数 文字列 区切り記号を含む 字句が属すクラスのことをいう字句は 文字のある列であって ソースプログラム内で意味をもつ最小の単位パターンは (Lexで用いるが) あるトークンの生成規則 4

5 章語彙 ( ごい ) 定義ステップ 3 入力 言語仕様 出力 トークン定義 ( 一覧 チャート ) 5.1 トークン プログラム MODULE HelloWorld; WriteStr( Hello World! ) END HelloWorld. トークンとはプログラムの最小構成要素文章だと 単語 に相当プログラムだと トークン と言われる トークン MODULE HelloWorld ; WriteStr ( "Hello World! ) END HelloWorld. コンパイラ入門 C# で学ぶ理論と実践 より 5.1 トークン トークンは言語仕様の中で定義されている 1 < 規則 >で定義されているもの~ 識別子 数 文字列 2 予約語 ~MODULE INTEGERなど 3 その他の記号 ~2 文字 (<> :=) 1 文字 (;.) など で使われているシンボルとの違いに注意 例 1 <ident> は規則で定義 ( 先頭が英字で 2 文字目以降は英数字 ) 例 2 MODULE,, END 等 プログラムの予約語例 3 ; や. など埋め込まれている文字 <ident> <letter> ( <letter> <digit> )* <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 5.2 語彙定義 < 規則 > で定義されているトークン 識別子 ( 先頭は英字 2 文字目以降は英数字 ) 数 (1 桁 (1 文字 ) 以上の数字 ) 文字列 ( と に囲まれた文字 ~ 但し 1 行以内のもの ) <ident> <letter> ( <letter> <digit> )* 識別子 <integer> <digit>+ 数 <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 5.2 語彙定義 予約語 プログラムの中で予め決められている文字列 予約語は識別子として使えないことに注意 <type> INTEGER STRING <statement> <ident> := <expression> <ident> "(" <literal> ") 5.2 語彙定義 (3/3) その他の記号 区切り記号 演算子 言語によっては英数字を使うことがある 人間が読みやすいように 特殊な記号を用いることが多い <identlist> <ident> (, <ident> )* <statement> <ident> := <expression> <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> * / 5

5.2 トークン一覧 5.2 トークン識別チャート 構文解析プログラムが書きやすいようにチャート化 5.3 規則の仕分け 字句解析用 パーサでは使用しない 定義済みとして考える <ident> <letter> ( <letter> <digit> )* <integer> <digit>+ <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 5.3 新しい言語仕様 <program> MODULE IDENT ; [ <decllist> ] <statlist> END IDENT. <identlist> IDENT (, IDENT )* <type> INTEGER STRING <statement> IDENT := <expression> 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> * / 6