12.3,E,-15, 12.3,E5,+,=, >,<,…,

Slides:



Advertisements
Similar presentations
平成 19 年度卒業研究 PASCAL コンパイラについ て 福永研究室 山川 武志 畑中 陽介 佐藤 遼.
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
5.制御構造と配列 場合分け( If Then Else , Select Case ) 繰返し( Do While ) 繰返しその2( For Next )
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
JavaScript プログラミング入門 2006/11/10 神津.
コンパイラ 2011年10月17日
情報基礎実習I (第4回) 木曜4・5限 担当:北川 晃.
VBAを通して プログラム言語の基本構造を学ぶ
情報基礎実習I (第7回) 木曜4・5限 担当:北川 晃.
言語処理系(4) 金子敬一.
数値計算及び実習 第3回 プログラミングの基礎(1).
VBA H106077 寺沢友宏.
基礎プログラミングおよび演習 第9回
プログラミング基礎I(再) 山元進.
情報基礎実習I (第5回) 木曜4・5限 担当:北川 晃.
情報基礎A 第10週 プログラミング入門 VBAの基本文法2 データ型・If ~Then~Else
PHP 概要 担当 岡村耕二 月曜日 2限 平成21年度 情報科学III (理系コア科目・2年生)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
情報基礎A 第7週 プログラミング入門 VBAの基本文法2 データ型・If ~Then~Else
言語処理系(5) 金子敬一.
言語処理系(9) 金子敬一.
情報基礎A 第11週 プログラミング入門 VBAの基本文法3 配列・For~Next
PHP 概要 担当 岡村耕二 月曜日 2限 平成20年度 情報科学III (理系コア科目・2年生)
プログラミング言語 作成の実際 しらいゆたか.
コンパイラ 2012年10月15日
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
東京工科大学 コンピュータサイエンス学部 亀田弘之
データベース設計 第9回 Webインタフェースの作成(1)
テキストボックス、チェックボックス×2、コマンドボタンを配置する。 コマンドボタンに機能を与える
実例で学ぶプログラミング VBAを用いて簡単なゲームを作ろう 徳山 豪 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
コンパイラ 第4回 字句解析 ― 字句解析プログラムの作成 ―
本時の目標 「簡単なプログラム言語の意味を理解し、マクロ機能を使って簡単なプログラムを作ることができる。」
B演習(言語処理系演習)第8回 評価器 田浦.
第二回 VB講座 電卓を作ろう.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
情報実習I (第6回) 木曜4・5限 担当:北川 晃.
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
情報実習I (第7回) 木曜4・5限 担当:北川 晃.
アルゴリズムとプログラミング (Algorithms and Programming)
ソフトウェア制作論 平成30年10月3日.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
実践プログラミング入門2 配列を使ってゲームを作ろう 徳山 豪 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
プログラムの制御構造 配列・繰り返し.
アルゴリズムとデータ構造1 2005年6月24日
VBで始めるプログラミング 第三回 コードを書こう!! まきはた@ナーク ’04/05/21.
PHP 概要 担当 岡村耕二 月曜日 2限 平成22年度 情報科学III (理系コア科目・2年生)
プログラムの基本構造と 構造化チャート(PAD)
コンパイラ 2011年10月20日
情報基礎演習I(プログラミング) 第11回 7月12日 水曜5限 江草由佳
B演習(言語処理系演習)第2回 田浦.
第6回レポート解説 条件1 条件2 条件3 月の入力 月、日、曜日の表示 日の入力 曜日の入力
情報工学Ⅱ (第9回) 月曜4限 担当:北川 晃.
コンパイラ 2012年10月29日
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
C言語講座 制御(選択) 2006年 計算技術研究会.
情報実習I (第6回) 木曜4・5限 担当:北川 晃.
コンパイラ 2012年10月11日
アルゴリズムの視覚化 この図は左が大きく、 右が小さくなるようにソートしている  この図は左が大きく、  右が小さくなるようにソートしている
第3回簡単なデータの入出力.
ソフトウェア制作論 平成30年10月17日.
8.文字列処理 8.1 C#の文字列 C#では, “ABCD”のように文字列を2重引用符で挟んで指定します。ASCIIコード体系のとき,以下のような内部形式となります。 1 1 文字 ‘A’ ナル文字 1 1 文字 ‘B’ A B C D \ 文字 ‘C’ 1 1 文字 ‘D’ ナル文字‘\0’
場合分け(If Then Else,Select Case) 繰返し(Do While) 繰返しその2(For Next)
3.テキストボックスによる データ入力 データ入力と表示のプログラム.
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
プログラミング言語によっては,複素数が使えない。
情報処理Ⅱ 2006年10月20日(金).
6.3 インタプリタ (1)インタプリタ(interpreter)とは
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

12.3,E,-15, 12.3,E5,+,=, >,<,…, 3.2 字句解析のプログラム (1)一般的構成 ソースプログラム 1文(テキスト 数値/文字列/ 名前/区切り記号 単純字句解析 12.3,E,-15, 12.3,E5,+,=, >,<,…, while, if,・・・,”abcdefg” 1文読込み (注釈部分の削除) 文構成単位の 字句解析 トークン ソース プログラム ファイル エディタ用 テキスト ボックス 12.3E-15, 12.3E5 ==,++,+=, >=, … , while, if,・・・, “abcdefg” 構文解析

(2)1文読込み(注釈部分の削除) VBに似た言語の1文読込み ①1行に1文が基本。 ②1行に複文のときコロン(:)で区切る ③複数行にまたがるときはアンダーライン(_)を最後に付ける。 ④注釈の先頭はシングルクォート(‘)

1文読込みの状態遷移 状態遷移図 通常 モード 文字列内部 引用符直後 エラー 終了 【演習】C言語の1文読み込みの状態遷移図を書け。 行終り 通常 モード 文字列内部 引用符(“) 引用符(“) 引用符直後 行終り エラー 引用符(“) 引用符以外の文字 継続指定“ _” 行終りまで無視(継続行用) 行終り以外 行終り 行終り以外 行終りまで無視(注釈用) 注釈指定“‘” 行終り 行終り “:”または行終り 終了 【演習】C言語の1文読み込みの状態遷移図を書け。 ①8進数はないものとする。 ②\n,\”等の記法が許されるものとする。

参考(1) Private Alltext As String Private ScanMode As Short Private Function scanComment() As String Dim CH1, CH2 As String: Dim LN As Integer CH1 = Microsoft.VisualBasic.Left(Alltext, 1) Select Case ScanMode Case 0 CH2 = Microsoft.VisualBasic.Left(Alltext, 2) If CH1 = " " Or CH1 = " " Or CH1 = vbTab Then LN = Microsoft.VisualBasic.Len(Alltext) Alltext = Microsoft.VisualBasic.Right(Alltext, LN - 1) scanComment = " " ElseIf CH2 = vbCrLf Then Alltext = Microsoft.VisualBasic.Right(Alltext, LN - 2) ElseIf CH2 = "//" Then Do While Alltext <> "" If CH2 = vbCrLf Then Exit Do End If Loop

参考(2) ElseIf CH2 = "/*" Then LN = Microsoft.VisualBasic.Len(Alltext) Alltext = Microsoft.VisualBasic.Right(Alltext, LN - 2) Do While Alltext <> "" CH2 = Microsoft.VisualBasic.Left(Alltext, 2) If CH2 = "*/" Then Exit Do End If Alltext = Microsoft.VisualBasic.Right(Alltext, LN - 1) Loop scanComment = " " Else scanComment = CH1 If CH1 = """" Then ScanMode = 1 ElseIf CH1 = "\" Then ScanMode = 2 Case 1 参考(2)

参考(3) If CH1 = """" Then ScanMode = 0 ElseIf CH1 = "\" Then End If Case 2 scanComment = CH1 LN = Microsoft.VisualBasic.Len(Alltext) Alltext = Microsoft.VisualBasic.Right(Alltext, LN - 1) Case 3 ScanMode = 1 End Select End Function Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim R, Str As String Alltext = TextBox1.Text Str = "" : ScanMode = 0 Do While Alltext <> "" R = scanComment() TextBox2.Text = TextBox2.Text & R MsgBox(Alltext & vbCrLf & "→[" & R & "] Scan Mode=" & ScanMode) Loop End Sub End Class 参考(3)

(3)単純字句解析 状態遷移図 エラー 終了 【演習】C言語を意識した単純字句解析の状態遷移図を書け。 半角・全角空白 またはタブコード 行終り 通常 モード 文字列 内部 引用符(“) 引用符(“) 引用符 直後 文終り エラー 区切記号 (1文字) 引用符(“) 引用符以外の文字 数字 数字 文終り 数字 モード 小数点 数字 小数点、数字以外 小数部 モード 小数点 数字以外 小数部モードの結果、 得られた文字列が“.”だけの場合、 “.”を区切り記号としてみなす。 英字 英数字 識別子 モード 英数字以外 終了 【演習】C言語を意識した単純字句解析の状態遷移図を書け。 引用符で囲まれたキャラクタ, 二重引用符で囲まれた文字列, \n, \”等の記法を意識すること。

Cの単純字句解析参考(その1) Private Function setWordData(ByVal tp As String, ByVal st As String) As WordData setWordData.Type = tp setWordData.Str = st End Function Private Function setString() Dim Str, R As String Str = """" : R = scanComment() Do While R <> """" If R = "\" Then Str = Str & R : R = scanComment() If R = "" Then MsgBox("文法エラー。二重引用符が不足しています。") R = """" Exit Do End If Loop setString = Str & R

Cの単純字句解析参考(その2) Private Function setChar() Dim Str, R As String Str = "'" : R = scanComment() Do While R <> "'" If R = "\" Then Str = Str & R : R = scanComment() If R = "" Then MsgBox("文法エラー。二重引用符が不足しています。") R = "'" Exit Do End If Loop setChar = Str & R End Function

Cの単純字句解析参考(その3) Private Function setNumber(ByVal RR As String) Dim Str, R As String : R = RR If R <> "." Then Str = RR : R = scanComment() Do While Asc(R) >= Asc("0") And Asc(R) <= Asc("9") Str = Str & R : R = scanComment() Loop Alltext = R & Alltext : setNumber = Str Exit Function End If Alltext = R & Alltext setNumber = Str End Function

Cの単純字句解析参考(その4) Private Function setName(ByVal RR As String) Dim Str, R As String R = RR : Str = RR : R = scanComment() Do While (Asc(R) >= Asc("A") And Asc(R) <= Asc("Z")) Or _ (Asc(R) >= Asc("a") And Asc(R) <= Asc("z")) Or _ (Asc(R) >= Asc("0") And Asc(R) <= Asc("9")) Or R = "_" Str = Str & R R = scanComment() Loop Alltext = R & Alltext setName = Str End Function

Cの単純字句解析参考(その4) Private Function LA0() As WordData Dim R, Str As String: Str = "" : ScanMode = 0: R = scanComment() Do While Alltext <> "" And (R = " " Or R = "") R = scanComment() Loop If (R = " " Or R = "") And Alltext = "" Then LA0.Type = "EOF”: LA0.Str = "" ElseIf R = """" Then LA0.Type = "String”: LA0.Str = setString() ElseIf R = "'" Then LA0.Type = "Char”: LA0.Str = setChar() ElseIf R = "\" Then LA0.Type = "Code”: LA0.Str = R & scanComment() ElseIf R = "." Then LA0.Type = "Number”: LA0.Str = setNumber(R)  If LA0.Str = "." Then LA0.Type = "Delimiter" ElseIf Asc(R) >= Asc("0") And Asc(R) <= Asc("9") Then ElseIf (Asc(R) >= Asc("A") And Asc(R) <= Asc("Z")) Or _ (Asc(R) >= Asc("a") And Asc(R) <= Asc("z")) Or R = "_" Then LA0.Type = "Name”: LA0.Str = setName(R) Else LA0.Type = "Delimiter”: LA0.Str = R End If End Function

Cの単純字句解析参考(その5) Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim S As WordData Alltext = TextBox1.Text TextBox2.Text = "" Do While Alltext <> "" S = LA0() TextBox2.Text = TextBox2.Text & vbCrLf & S.Type & " Value=""" & S.Str & """" Loop End Sub End Class

(4)文構成単位としての字句解析 ①浮動小数点等としての「123.5E-23」、「34.E5」等の表現 ②16進数「0X0FEC」等の表現   数値「0」、 名前「X0FEC」 ③8進数「0276」(先頭が0で始まる) ④複数文字列からなる演算子(==, ++, ||など) ⑤2単語以上からなるがひとつの意味になるもの(BASICに多い)   select case, end if, do while, loop until, … 先読みしてこれらを判定する

C#プログラム例(その1) private bool E_exp(string str) // E<数字列>のチェック { if(str.Length<2) return false; if(str[0]!='E' && str[0]!='e') return false; for(int i=1;i<str.Length;i++) if(該当文字(数字,str[i])<0) return false; return true; } private void set_TokenX(string type, string str) // トークンのセット tokenX[numTokenX].type=type; tokenX[numTokenX].str=str; numTokenX++; private void combineDelimiter(string str1, string str2) // 区切り記号の接続 set_TokenX("Delimiter",str1+str2);

C#プログラム例(その2) private void LA1() { numTokenX=0; WordData token1,token2,token3,token4; token1=LA0();token2=LA0();token3=LA0();token4=LA0();    // 先読み   while(token1.type!="End") { if( token1.type=="Number" && token2.type=="Name" && token2.str=="E" &&   token3.type=="Delimiter" && (token3.str=="+" || token3.str=="-")&&    token4.type=="Number") {  set_TokenX("Number",token1.str+token2.str+token3.str+token4.str);       token1=LA0();token2=LA0();token3=LA0();token4=LA0(); } else if( token1.type=="Number" && token2.type=="Name" && E_exp(token2.str)) { set_TokenX("Number",token1.str+token2.str); token1=token3;token2=token4;token3=LA0();token4=LA0(); else if(token1.type=="Delimiter" && token1.str==">" && token2.type=="Delimiter" && token2.str=="=" ) { combineDelimiter(token1.str,token2.str); else if(token1.type=="Delimiter" && token1.str==”<" && } // 後半省略

(5)1文の形態による字句解析の構成の違い ①行が基本的な文の区切りを示す。 (複数行にわたるときは継続の指定を行う)   FORTRAN, BASIC, COBOL SA 1文取出し LA1 1文バッファ LA0 ②ブロック内の最初と最後を示す記号 (begin-end,{})等があるもの。   ALGOL,PL/I, C, C++,JAVA, C# SA LA1 LA0 1文字取出し