言語プロセッサ 2013 No.14

39
言言言言言言言 2013 No.14 言言言言言言 言言言言言言言言言言言言言 言言言言 言言 26 言 1 言 20 言 言言 言 言 ()3

description

言語プロセッサ 2013 No.14. 東京工科大学 コンピュータサイエンス学部 亀田弘之. 平成 26 年 1 月 20 日(月)3限. 今日の内容. ANTLRWorks の紹介 ANTLR v4 の紹介 プログラミング言語設計へ向けて. 学問的キーワード. 文法 BNF ( Backus-Naur Form ) 字句解析器( lexer ) 構文解析器( parser ) 構文図. Antlrwork の紹介. もう一つのツール ( JavaCC もあるよ!). ANTLRWorks の紹介. ANTLRWorks とは何? - PowerPoint PPT Presentation

Transcript of 言語プロセッサ 2013 No.14

Page 1: 言語プロセッサ 2013 No.14

言語プロセッサ 2013  No.14

東京工科大学コンピュータサイエンス学部

亀田弘之

平成 26 年 1 月 20 日(月)3限

Page 2: 言語プロセッサ 2013 No.14

今日の内容

1. ANTLRWorks の紹介2. ANTLR v4 の紹介3. プログラミング言語設計へ向けて

東京工科大学コンピュータサイエンス学部 2

Page 3: 言語プロセッサ 2013 No.14

学問的キーワード

• 文法• BNF ( Backus-Naur Form )• 字句解析器( lexer )• 構文解析器( parser )• 構文図

東京工科大学コンピュータサイエンス学部 3

Page 4: 言語プロセッサ 2013 No.14

Antlrwork の紹介

• もう一つのツール( JavaCC もあるよ!)

東京工科大学コンピュータサイエンス学部 4

Page 5: 言語プロセッサ 2013 No.14

ANTLRWorks の紹介

1. ANTLRWorks とは何?2. ANTLRWorks インストール3. 起動と終了4. 使い方

① 文法作成② 文字解析と構文解析③ 実行

東京工科大学コンピュータサイエンス学部 5

Page 6: 言語プロセッサ 2013 No.14

文法作成例

1. 文法名の設定.• 文法の名前とファイル名は揃える.• 今の場合,文法の名前を  Expr  とするので,文

法を格納するファイル名は, Expr.g とする.

2. ANTLRWorks をエディタとして使い,文法の設計をする.• 文法記述を順次説明する.

東京工科大学コンピュータサイエンス学部 6

Page 7: 言語プロセッサ 2013 No.14

Expr.g の仕様

• “120+45*2” や “ x = 5” などのプログラム文1つ上が,改行で区切られている.これを順番に読み込んで処理する.• 例えば,     1+4 a = 8 a+a*2というプログラムを読み込ませると,     5 24と表示される.

東京工科大学コンピュータサイエンス学部 7

Page 8: 言語プロセッサ 2013 No.14

文法の作成(1):名前付与

grammar Expr; 文法の名前の定義文法の名前の定義

東京工科大学コンピュータサイエンス学部 8

Page 9: 言語プロセッサ 2013 No.14

文法の作成(2): prog 要素定義grammar Expr;prog: stat+ ;

東京工科大学コンピュータサイエンス学部 9

Page 10: 言語プロセッサ 2013 No.14

文法の作成(3): stat 要素定義grammar Expr.g ;prog: stat+ ; stat: expr NEWLINE | ID '=' expr NEWLINE | NEWLINE ;

東京工科大学コンピュータサイエンス学部 10

Page 11: 言語プロセッサ 2013 No.14

文法の作成(4): expr 要素定義expr: multExpr ( '+' multExpr | '-' multExpr )* ;

東京工科大学コンピュータサイエンス学部 11

Page 12: 言語プロセッサ 2013 No.14

文法の作成(5): multExpr要素定義

multExpr: atom ( '*‘ atom )* ;

東京工科大学コンピュータサイエンス学部 12

Page 13: 言語プロセッサ 2013 No.14

文法の作成(6): atom 要素定義atom: INT | ID | '(' expr ')' ;

東京工科大学コンピュータサイエンス学部 13

Page 14: 言語プロセッサ 2013 No.14

文法の作成(7): atom 要素定義ID : ('a'..'z'|'A'..'Z')+ ;

東京工科大学コンピュータサイエンス学部 14

Page 15: 言語プロセッサ 2013 No.14

文法の作成(8): INT 要素定義INT : '0'..'9'+ ;

東京工科大学コンピュータサイエンス学部 15

Page 16: 言語プロセッサ 2013 No.14

文法の作成(9): NEWLINE 要素定義

NEWLINE:'\r'? '\n' ;

東京工科大学コンピュータサイエンス学部 16

Page 17: 言語プロセッサ 2013 No.14

文法の作成(10): WS 要素定義WS : (' '|'\t')+ {skip();} ;

東京工科大学コンピュータサイエンス学部 17

Page 18: 言語プロセッサ 2013 No.14

構文図

東京工科大学コンピュータサイエンス学部 18

Page 19: 言語プロセッサ 2013 No.14

設計した文法の概要( 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

(注)

• ここまで一所懸命やっている作業は,  「文法の設計・作成」ですが,これは  「言語の設計・作成」でもあります.

形式言語とオートマトンの授業より  言語 L は文法 G により定義され, L =L(G) .

形式言語とオートマトンの授業より  言語 L は文法 G により定義され, L =L(G) .

東京工科大学コンピュータサイエンス学部 20

Page 21: 言語プロセッサ 2013 No.14

このプログラミング言語のプログラム例は以下の通り.

A = 100B = 300C = A + B * 2C1+2+3+4

東京工科大学コンピュータサイエンス学部 21

Page 22: 言語プロセッサ 2013 No.14

文法をもう少し詳しく見ると…• 構文の記述だけではなく,動作も記述されて

いる.

東京工科大学コンピュータサイエンス学部 22

Page 23: 言語プロセッサ 2013 No.14

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

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

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

grammar Expr;    (省略)

ID : ('a'..'z'|'A'..'Z')+ ;INT : '0'..'9'+ ;NEWLINE:'\r'? '\n' ;WS : (' '|'\t')+ {skip();} ;

東京工科大学コンピュータサイエンス学部 26

Page 27: 言語プロセッサ 2013 No.14

動作させてみよう!

1. 構文着を作る(字句解析+構文解析)2. プログラムを実行する(実際に計算させる

東京工科大学コンピュータサイエンス学部 27

Page 28: 言語プロセッサ 2013 No.14

これ以降は,自分でプログラミング言語を設計することになりますprogram tasu   { a = 4 b = a +6 a b}

この言語の文法はどうなりますでしょうか?

東京工科大学コンピュータサイエンス学部 28

Page 29: 言語プロセッサ 2013 No.14

最後に、 ANTLR4 について

東京工科大学コンピュータサイエンス学部 29

Page 30: 言語プロセッサ 2013 No.14

まずは、開発・実行環境の整備1. ANTLR v4 をダウンロードする。2. CLASSPATH を設定する。3. (任意) alias の設定をする。

東京工科大学コンピュータサイエンス学部 30

Page 31: 言語プロセッサ 2013 No.14

まずは、開発・実行環境の整備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

練習1 次の文法を入力する

Grammar Hello;R : ‘hello’ ID ;ID : [a-z]+ ;WS : [ \t\r\n]+ -> skip ;

ANTLRWork に入力し、入力ミスのチェックをする。

ANTLRWork に入力し、入力ミスのチェックをする。

東京工科大学コンピュータサイエンス学部 32

Page 33: 言語プロセッサ 2013 No.14

注意点

• 文法を格納するファイル名は、 “ Hello.g” です。• ANTLRWorks を用いて、構文図を描画してみる

東京工科大学コンピュータサイエンス学部 33

Page 34: 言語プロセッサ 2013 No.14

練習1 コンパイルする

$ antlr4 Hello.g$ javac Hello*.java

東京工科大学コンピュータサイエンス学部 34

Page 35: 言語プロセッサ 2013 No.14

注意点

• リストコマンド( ls や dir )などで、どんな名前の Java 言語コードがいくつ生成されたか確認してみよう。• 自動生成されたプログラムの中を、エディタ

等でのぞいてみるのも勉強になります。

東京工科大学コンピュータサイエンス学部 35

Page 36: 言語プロセッサ 2013 No.14

練習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

(注) input.txt  の中身(1つの例)

12+ 81A = 6B = A * 10A * (A + B)

東京工科大学コンピュータサイエンス学部 37

キーボード(標準入力)からの入力の代わり。

Page 38: 言語プロセッサ 2013 No.14

実行結果( -tree で実行した場合)

東京工科大学コンピュータサイエンス学部 38

Page 39: 言語プロセッサ 2013 No.14

実行結果( -gui で実行した場合)

東京工科大学コンピュータサイエンス学部 39