Download - 言語プロセッサ 2013 No.14
![Page 1: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/1.jpg)
言語プロセッサ 2013 No.14
東京工科大学コンピュータサイエンス学部
亀田弘之
平成 26 年 1 月 20 日(月)3限
![Page 2: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/2.jpg)
今日の内容
1. ANTLRWorks の紹介2. ANTLR v4 の紹介3. プログラミング言語設計へ向けて
東京工科大学コンピュータサイエンス学部 2
![Page 3: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/3.jpg)
学問的キーワード
• 文法• BNF ( Backus-Naur Form )• 字句解析器( lexer )• 構文解析器( parser )• 構文図
東京工科大学コンピュータサイエンス学部 3
![Page 4: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/4.jpg)
Antlrwork の紹介
• もう一つのツール( JavaCC もあるよ!)
東京工科大学コンピュータサイエンス学部 4
![Page 5: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/5.jpg)
ANTLRWorks の紹介
1. ANTLRWorks とは何?2. ANTLRWorks インストール3. 起動と終了4. 使い方
① 文法作成② 文字解析と構文解析③ 実行
東京工科大学コンピュータサイエンス学部 5
![Page 6: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/6.jpg)
文法作成例
1. 文法名の設定.• 文法の名前とファイル名は揃える.• 今の場合,文法の名前を Expr とするので,文
法を格納するファイル名は, Expr.g とする.
2. ANTLRWorks をエディタとして使い,文法の設計をする.• 文法記述を順次説明する.
東京工科大学コンピュータサイエンス学部 6
![Page 7: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/7.jpg)
Expr.g の仕様
• “120+45*2” や “ x = 5” などのプログラム文1つ上が,改行で区切られている.これを順番に読み込んで処理する.• 例えば, 1+4 a = 8 a+a*2というプログラムを読み込ませると, 5 24と表示される.
東京工科大学コンピュータサイエンス学部 7
![Page 8: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/8.jpg)
文法の作成(1):名前付与
grammar Expr; 文法の名前の定義文法の名前の定義
東京工科大学コンピュータサイエンス学部 8
![Page 9: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/9.jpg)
文法の作成(2): prog 要素定義grammar Expr;prog: stat+ ;
東京工科大学コンピュータサイエンス学部 9
![Page 10: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/10.jpg)
文法の作成(3): stat 要素定義grammar Expr.g ;prog: stat+ ; stat: expr NEWLINE | ID '=' expr NEWLINE | NEWLINE ;
東京工科大学コンピュータサイエンス学部 10
![Page 11: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/11.jpg)
文法の作成(4): expr 要素定義expr: multExpr ( '+' multExpr | '-' multExpr )* ;
東京工科大学コンピュータサイエンス学部 11
![Page 12: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/12.jpg)
文法の作成(5): multExpr要素定義
multExpr: atom ( '*‘ atom )* ;
東京工科大学コンピュータサイエンス学部 12
![Page 13: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/13.jpg)
文法の作成(6): atom 要素定義atom: INT | ID | '(' expr ')' ;
東京工科大学コンピュータサイエンス学部 13
![Page 14: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/14.jpg)
文法の作成(7): atom 要素定義ID : ('a'..'z'|'A'..'Z')+ ;
東京工科大学コンピュータサイエンス学部 14
![Page 15: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/15.jpg)
文法の作成(8): INT 要素定義INT : '0'..'9'+ ;
東京工科大学コンピュータサイエンス学部 15
![Page 16: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/16.jpg)
文法の作成(9): NEWLINE 要素定義
NEWLINE:'\r'? '\n' ;
東京工科大学コンピュータサイエンス学部 16
![Page 17: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/17.jpg)
文法の作成(10): WS 要素定義WS : (' '|'\t')+ {skip();} ;
東京工科大学コンピュータサイエンス学部 17
![Page 18: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/18.jpg)
構文図
東京工科大学コンピュータサイエンス学部 18
![Page 19: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/19.jpg)
設計した文法の概要( Expr.g)
grammar Expr;prog: stat+ ;stat: expr NEWLINE | ID '=‘ expr NEWLINE | NEWLINE ;expr: multExpr ( '+' multExpr | '-' multExpr )*;multExpr: atom ( '*‘ atom )* ; atom: INT | ID | '(' expr ')' ;ID : ('a'..'z'|'A'..'Z')+ ;INT : '0'..'9'+ ;NEWLINE:'\r'? '\n' ;WS : (' '|'\t')+ {skip();} ;
説明できますか?
説明できますか?東京工科大学コンピュータサイエンス学
部 19
![Page 20: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/20.jpg)
(注)
• ここまで一所懸命やっている作業は, 「文法の設計・作成」ですが,これは 「言語の設計・作成」でもあります.
形式言語とオートマトンの授業より 言語 L は文法 G により定義され, L =L(G) .
形式言語とオートマトンの授業より 言語 L は文法 G により定義され, L =L(G) .
東京工科大学コンピュータサイエンス学部 20
![Page 21: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/21.jpg)
このプログラミング言語のプログラム例は以下の通り.
A = 100B = 300C = A + B * 2C1+2+3+4
東京工科大学コンピュータサイエンス学部 21
![Page 22: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/22.jpg)
文法をもう少し詳しく見ると…• 構文の記述だけではなく,動作も記述されて
いる.
東京工科大学コンピュータサイエンス学部 22
![Page 23: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/23.jpg)
grammar Expr;@header {import java.util.HashMap;}@members {/** Map variable name to Integer object holding value */HashMap memory = new HashMap();}
文法の動作部分の説明
変数名とその値を保存する表
東京工科大学コンピュータサイエンス学部 23
![Page 24: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/24.jpg)
grammar Expr;prog: stat+ ;stat: expr NEWLINE { System.out.println($expr.value); } | ID '=' expr NEWLINE { memory.put( $ID.text, new Integer($expr.value) ); } | NEWLINE ;expr returns [int value] : e=multExpr {$value = $e.value;} ( '+' e=multExpr {$value += $e.value;} | '-' e=multExpr {$value -= $e.value;} )* ;
東京工科大学コンピュータサイエンス学部 24
![Page 25: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/25.jpg)
grammar Expr; (省略)multExpr returns [int value] : e=atom {$value = $e.value;} (‘*’ e=atom {$value *= $e.value;} )* ; atom returns [int value] : INT {$value = Integer.parseInt($INT.text);} | ID { Integer v = (Integer)memory.get($ID.text); if ( v!=null ) $value = v.intValue(); else System.err.println("undefined variable "+$ID.text); } | '(' expr ')' {$value = $expr.value;} ;
東京工科大学コンピュータサイエンス学部 25
![Page 26: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/26.jpg)
grammar Expr; (省略)
ID : ('a'..'z'|'A'..'Z')+ ;INT : '0'..'9'+ ;NEWLINE:'\r'? '\n' ;WS : (' '|'\t')+ {skip();} ;
東京工科大学コンピュータサイエンス学部 26
![Page 27: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/27.jpg)
動作させてみよう!
1. 構文着を作る(字句解析+構文解析)2. プログラムを実行する(実際に計算させる
)
東京工科大学コンピュータサイエンス学部 27
![Page 28: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/28.jpg)
これ以降は,自分でプログラミング言語を設計することになりますprogram tasu { a = 4 b = a +6 a b}
この言語の文法はどうなりますでしょうか?
東京工科大学コンピュータサイエンス学部 28
![Page 29: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/29.jpg)
最後に、 ANTLR4 について
東京工科大学コンピュータサイエンス学部 29
![Page 30: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/30.jpg)
まずは、開発・実行環境の整備1. ANTLR v4 をダウンロードする。2. CLASSPATH を設定する。3. (任意) alias の設定をする。
東京工科大学コンピュータサイエンス学部 30
![Page 31: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/31.jpg)
まずは、開発・実行環境の整備1. ANTLR v4 をダウンロードする。• 対象: Antlr-4.1-complete.jar• 設置先:
• Linux の場合: /usr/local/bin• Windows の場合: c:\Javalib
2. CLASSPATH を設定する。• Linux の場合:
export CLASSPATH=“.:/usr/local/bin/antlr-4.1-complete.jar:$CLASSPATH”
• Windows の場合: SET CLASSPATH=.;c:\Javalib\antlr-4.1-complete.jar;%CLASSPATH%
3. (任意) alias の設定をする。• alias antlr4=‘java –jar /usr/local/bin/antlr-4.1-complete.jar’• alias grun=‘java org.antlr.v4.runtime.misc.TestRig’ 東京工科大学コンピュータサイエンス学
部 31
![Page 32: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/32.jpg)
練習1 次の文法を入力する
Grammar Hello;R : ‘hello’ ID ;ID : [a-z]+ ;WS : [ \t\r\n]+ -> skip ;
ANTLRWork に入力し、入力ミスのチェックをする。
ANTLRWork に入力し、入力ミスのチェックをする。
東京工科大学コンピュータサイエンス学部 32
![Page 33: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/33.jpg)
注意点
• 文法を格納するファイル名は、 “ Hello.g” です。• ANTLRWorks を用いて、構文図を描画してみる
。
東京工科大学コンピュータサイエンス学部 33
![Page 34: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/34.jpg)
練習1 コンパイルする
$ antlr4 Hello.g$ javac Hello*.java
東京工科大学コンピュータサイエンス学部 34
![Page 35: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/35.jpg)
注意点
• リストコマンド( ls や dir )などで、どんな名前の Java 言語コードがいくつ生成されたか確認してみよう。• 自動生成されたプログラムの中を、エディタ
等でのぞいてみるのも勉強になります。
東京工科大学コンピュータサイエンス学部 35
![Page 36: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/36.jpg)
練習1 実行する( CUI 形式)
$ grun Hello r -tree < input.txt
東京工科大学コンピュータサイエンス学部 36
• コマンド grun は、 alias で別名を与えたもの。その実体は以下のことを行ったのと同じ。$ java –jar /usr/local/bin/antlr-4.1-complete.jar
• Hello は、文法名が Hello だから。• 引数 r は、文法の開始記号が r だったから
。• オプション – tree は、木構造を出力したいか
ら。• 入力ファイル input.txt は次ページ参照。
![Page 37: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/37.jpg)
(注) input.txt の中身(1つの例)
12+ 81A = 6B = A * 10A * (A + B)
東京工科大学コンピュータサイエンス学部 37
キーボード(標準入力)からの入力の代わり。
![Page 38: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/38.jpg)
実行結果( -tree で実行した場合)
東京工科大学コンピュータサイエンス学部 38
![Page 39: 言語プロセッサ 2013 No.14](https://reader036.vdocuments.mx/reader036/viewer/2022081504/56813b7c550346895da4934b/html5/thumbnails/39.jpg)
実行結果( -gui で実行した場合)
東京工科大学コンピュータサイエンス学部 39