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

Slides:



Advertisements
Similar presentations
自然言語処理 平成 24 年 11 月 5 日 (No5)- 東京工科大学 コンピュータサイエンス学部 亀田弘之.
Advertisements

1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
BBT大学 Ruby on Rails開発環境セットアップマニュアル
情報処理実習 第05回 Excelマクロ機能入門 操作マクロ入門.
Fortran と有限差分法の 入門の入門の…
2014年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
2015年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
コンパイラ 2011年10月17日
プログラミング入門 (教科書1~3章) 2005/04/14(Thu.).
東京工科大学 コンピュータサイエンス学部 亀田弘之
コマンドプロンプトの起動と終了 最初に覚えるコマンド ディレクトリ構造とパス 各種コマンドの練習 Cコンパイルとプログラムの実行
2013年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
Mavenによる プロジェクト管理 近畿大学理工学部 情報学科3年  小野実.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
コンピュータ演習Ⅰ 8月7日(日) 1限目 ファイルの種類.
C言語 配列 2016年 吉田研究室.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
プログラミングIII演習 第1回目.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月15日
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜
データベース設計 第9回 Webインタフェースの作成(1)
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
FlexとBison+アルファ -実習編-
東京工科大学 コンピュータサイエンス学部 亀田弘之
形式言語とオートマトン Formal Languages and Automata 第4日目
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
コマンドプロンプトの起動と終了 最初に覚えるコマンド ディレクトリ構造とパス 各種コマンドの練習 Cコンパイルとプログラムの実行
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング基礎a 第10回 Javaによる図形処理入門(2) GUIの使い方
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング基礎a 第10回 Javaによる図形処理入門(2) GUIの使い方
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
B演習(言語処理系演習)第2回 田浦.
C言語 はじめに 2016年 吉田研究室.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
プログラミング入門 電卓を作ろう・パートI!!.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月11日
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

東京工科大学 コンピュータサイエンス学部 亀田弘之 言語プロセッサ2013 No.14 東京工科大学 コンピュータサイエンス学部 亀田弘之 平成26年1月20日(月)3限

今日の内容 ANTLRWorks の紹介 ANTLR v4 の紹介 プログラミング言語設計へ向けて 東京工科大学コンピュータサイエンス学部

学問的キーワード 文法 BNF(Backus-Naur Form) 字句解析器(lexer) 構文解析器(parser) 構文図 東京工科大学コンピュータサイエンス学部

Antlrworkの紹介 もう一つのツール (JavaCCもあるよ!) 東京工科大学コンピュータサイエンス学部

ANTLRWorksの紹介 ANTLRWorks とは何? ANTLRWorks インストール 起動と終了 使い方 文法作成 文字解析と構文解析 実行 東京工科大学コンピュータサイエンス学部

文法作成例 文法名の設定. ANTLRWorksをエディタとして使い,文法の設計 をする. 文法の名前とファイル名は揃える. 今の場合,文法の名前を Expr とするので,文法を格 納するファイル名は,Expr.g とする. ANTLRWorksをエディタとして使い,文法の設計 をする. 文法記述を順次説明する. 東京工科大学コンピュータサイエンス学部

Expr.gの仕様 “120+45*2” や “x = 5” などのプログラム文1つ上 が,改行で区切られている.これを順番に読み込 んで処理する. 例えば, 1+4 a = 8 a+a*2 というプログラムを読み込ませると, 5 24 と表示される. 東京工科大学コンピュータサイエンス学部

文法の作成(1):名前付与 grammar Expr; 文法の名前の定義 東京工科大学コンピュータサイエンス学部

文法の作成(2):prog要素定義 grammar Expr; prog: stat+ ; 東京工科大学コンピュータサイエンス学部

文法の作成(3):stat要素定義 grammar Expr.g ; prog: stat+ ; stat: expr NEWLINE | ID '=' expr NEWLINE | NEWLINE ; 東京工科大学コンピュータサイエンス学部

文法の作成(4):expr要素定義 expr: multExpr ( '+' multExpr | '-' multExpr )* ; 東京工科大学コンピュータサイエンス学部

文法の作成(5):multExpr要素定義 multExpr: atom ( '*‘ atom )* ; 東京工科大学コンピュータサイエンス学部

文法の作成(6):atom要素定義 atom: INT | ID | '(' expr ')' ; 東京工科大学コンピュータサイエンス学部

文法の作成(7):atom要素定義 ID : ('a'..'z'|'A'..'Z')+ ; 東京工科大学コンピュータサイエンス学部

文法の作成(8):INT要素定義 INT : '0'..'9'+ ; 東京工科大学コンピュータサイエンス学部

文法の作成(9):NEWLINE要素定義 NEWLINE:'\r'? '\n' ; 東京工科大学コンピュータサイエンス学部

文法の作成(10):WS要素定義 WS : (' '|'\t')+ {skip();} ; 東京工科大学コンピュータサイエンス学部

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

設計した文法の概要(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();} ; 説明できますか? 東京工科大学コンピュータサイエンス学部

(注) ここまで一所懸命やっている作業は, 「文法の設計・作成」 ですが,これは 「言語の設計・作成」 でもあります. ここまで一所懸命やっている作業は,   「文法の設計・作成」 ですが,これは   「言語の設計・作成」 でもあります. 形式言語とオートマトンの授業より   言語Lは文法Gにより定義され,L=L(G). 東京工科大学コンピュータサイエンス学部

このプログラミング言語のプログラム例は以下の通り. A = 100 B = 300 C = A + B * 2 C 1+2+3+4 東京工科大学コンピュータサイエンス学部

文法をもう少し詳しく見ると… 構文の記述だけではなく,動作も記述されている. 東京工科大学コンピュータサイエンス学部

文法の動作部分の説明 grammar Expr; @header { import java.util.HashMap; } @members { /** Map variable name to Integer object holding value */ HashMap memory = new HashMap(); 変数名とその値を保存する表 東京工科大学コンピュータサイエンス学部

grammar Expr; prog: stat+ ; stat: expr NEWLINE { System. out 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;} )* ; 東京工科大学コンピュータサイエンス学部

grammar Expr; (省略) multExpr returns [int value] : e=atom {$value = $e 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;} ; 東京工科大学コンピュータサイエンス学部

grammar Expr; (省略) ID : ('a'. 'z'|'A'. 'Z')+ ; INT : '0' grammar Expr; (省略) ID : ('a'..'z'|'A'..'Z')+ ; INT : '0'..'9'+ ; NEWLINE:'\r'? '\n' ; WS : (' '|'\t')+ {skip();} ; 東京工科大学コンピュータサイエンス学部

動作させてみよう! 構文着を作る(字句解析+構文解析) プログラムを実行する(実際に計算させる) 東京工科大学コンピュータサイエンス学部

これ以降は,自分でプログラミング言語を設計することになります program tasu { a = 4 b = a +6 a b } この言語の文法はどうなりますでしょうか? 東京工科大学コンピュータサイエンス学部

最後に、ANTLR4について 東京工科大学コンピュータサイエンス学部

まずは、開発・実行環境の整備 ANTLR v4 をダウンロードする。 CLASSPATH を設定する。 (任意) alias の設定をする。 東京工科大学コンピュータサイエンス学部

まずは、開発・実行環境の整備 ANTLR v4 をダウンロードする。 CLASSPATH を設定する。 (任意) alias の設定をする。 対象: Antlr-4.1-complete.jar 設置先: Linuxの場合: /usr/local/bin Windowsの場合: c:\Javalib CLASSPATH を設定する。 Linuxの場合: export CLASSPATH=“.:/usr/local/bin/antlr-4.1-complete.jar:$CLASSPATH” Windowsの場合: SET CLASSPATH=.;c:\Javalib\antlr-4.1-complete.jar;%CLASSPATH% (任意) alias の設定をする。 alias antlr4=‘java –jar /usr/local/bin/antlr-4.1-complete.jar’ alias grun=‘java org.antlr.v4.runtime.misc.TestRig’ 東京工科大学コンピュータサイエンス学部

ANTLRWorkに入力し、入力ミスのチェックをする。 練習1 次の文法を入力する Grammar Hello; R : ‘hello’ ID ; ID : [a-z]+ ; WS : [ \t\r\n]+ -> skip ; ANTLRWorkに入力し、入力ミスのチェックをする。 東京工科大学コンピュータサイエンス学部

注意点 文法を格納するファイル名は、 “Hello.g” です。 ANTLRWorksを用いて、構文図を描画してみる。 東京工科大学コンピュータサイエンス学部

$ antlr4 Hello.g $ javac Hello*.java 練習1 コンパイルする $ antlr4 Hello.g $ javac Hello*.java 東京工科大学コンピュータサイエンス学部

注意点 リストコマンド(lsやdir)などで、どんな名前のJava 言語コードがいくつ生成されたか確認してみよう。 自動生成されたプログラムの中を、エディタ等での ぞいてみるのも勉強になります。 東京工科大学コンピュータサイエンス学部

$ grun Hello r -tree < input.txt 練習1 実行する(CUI形式) $ grun Hello r -tree < input.txt コマンド grun は、alias で別名を与えたもの。 その実体は以下のことを行ったのと同じ。 $ java –jar /usr/local/bin/antlr-4.1-complete.jar Hello は、文法名がHello だから。 引数 r は、文法の開始記号が r だったから。 オプション –tree は、木構造を出力したいから。 入力ファイル input.txt は次ページ参照。 東京工科大学コンピュータサイエンス学部

12+ 81 A = 6 B = A * 10 A * (A + B) (注) input.txt の中身(1つの例) キーボード(標準入力)からの入力の代わり。 東京工科大学コンピュータサイエンス学部

実行結果(-treeで実行した場合) 東京工科大学コンピュータサイエンス学部

実行結果(-guiで実行した場合) 東京工科大学コンピュータサイエンス学部