コンパイラとは プログラミング言語 ( 高級言語 ) で書かれたプログラムを入力し, コンピュータが実行できる言語 ( 機械語など ) に変換するプログラムのこと例 : gcc コンパイラは対応する言語によって複雑である場合もあるし単純である場合もある 本実験では簡単な言語のコンパイラを作成する
|
|
|
- るるみ こしの
- 7 years ago
- Views:
Transcription
1 情報工学実験 C コンパイラ (2016 年度 ) 担当 : 笹倉 佐藤 version
2 コンパイラとは プログラミング言語 ( 高級言語 ) で書かれたプログラムを入力し, コンピュータが実行できる言語 ( 機械語など ) に変換するプログラムのこと例 : gcc コンパイラは対応する言語によって複雑である場合もあるし単純である場合もある 本実験では簡単な言語のコンパイラを作成する
3 本実験の目的 3 年間の総仕上げとしてある程度大きなプログラムを作成する グループでシステム ( プログラム ) を仕上げる経験をする 自分でスケジュールを立てシステムを構築する経験をする
4 スケジュール 12/6( 火 ) 概要説明 yacc, lex 演習 12/13( 火 ) yacc, lex を用いた構文解析 1 12/15( 木 ) yacc, lex を用いた構文解析 2 12/20( 火 ) yacc, lex を用いた構文解析 3 1/10( 火 ) コード生成説明 1/18( 水 ) コード生成 1 1/24( 火 ) コード生成 2 1/26( 木 ) コード生成 3 1/31( 火 ) コード生成 4 2/2( 木 ) コード生成 5 2/7( 火 ) 最終面接
5 実験概要 手続き型言語のコンパイラの作成 目的コードはハードウェア実験で作成したプロセッサのアセンブラ 基本言語仕様を与えるので, それを適宜拡張する yacc, lex を使う 時間があればコード最適化を行う
6 実施上の注意 Web ページ hap:// /~sasakura/jikken/ グループで行う グループで共通の言語仕様を決めてプログラムを作成する できるだけ分担してプログラムを書く わからないことはまずグループで相談する 遅刻 欠席する場合は必ずグループの他のメンバーにも連絡のこと 作業報告書を毎回出す 最終面接で評価する ( 最終課題のプログラムが動くかどうか, 内容をきちんと理解しているか, レポートがきちんと書けているか )
7 グループ自己紹介 (5 分間 ) 下記のことをすべて述べること 名前 今朝の朝ごはんは何を食べたか 好きな食べもの 好きな色 特技 好きな科目 苦手な科目 プログラミングの経験 プログラミングがどれくらい好きか
8 手続き型言語とは プログラムに書いてある順番通りにコンピュータが実行すればよいようになっている言語例 :C 言語 その他の言語とは 関数型言語例 :ML, Haskell オブジェクト指向言語例 :Java
9 手続き型言語の利点 手続き を考えてプログラムを書けばよいので比較的わかりやすい コンパイラを作りやすい 基本的には入力プログラムの 1 行 1 行を順番に実行コード ( アセンブラ ) に変換していけばよい ただしそうすると効率の悪いプログラムになる場合があるので, コード最適化を行う場合が多い.
10 コンパイラの概要 字句解析入力プログラムを字句 ( トークン ) に分ける 構文解析入力プログラムが文法に合っているかどうかをチェックする. 抽象構文木 (AST) を作る. AST レベルでの最適化 コード生成実行コード ( アセンブラ ) に変換する コードレベルでの最適化
11 字句解析 入力プログラムを字句 ( トークン ) に分ける 自作するならオートマトンを用いる表駆動型 ( 参考 :2015 年度コンパイラ実験 ) 今回は ( 今年度から ) lex を使う lex については後述
12 字句解析オートマトン 初期状態 整数 以外 0 9 実数 0 9 以外 終了状態 英字 英数字 識別子 英数字以外 整数 実数 識別子の場合の例
13 構文解析 入力プログラムが文法に合っているかどうかをチェックする 合っていなければコンパイラがエラーを出す 自作するなら, 再帰下降型構文解析や演算子順位法を使う 今回は yacc を利用. yacc については後述
14 構文木 < 簡単な算術式 > ::= < 簡単な算術式 > < 演算子 > < 数 > < 数 > < 演算子 > ::= + - < 数 > ::= < 数字 >< 数 > < 数字 > < 数字 > ::= < 簡単な算術式 > < 簡単な算術式 > < 演算子 > < 数 > < 簡単な算術式 > < 数 > < 演算子 > < 数 > ー 3
15 抽象構文木 (AST) 構文解析の結果, プログラムを木の形で記憶する 構文木から非終端記号を取り除き, コード生成に必要なものだけを残して作った木 この木をたどりながらコード生成をする AST を意味を変えないように違う形にすることでより速いコードにすることができる ( コード最適化 )
16 コード生成 AST をたどりながら実行コード ( アセンブラ ) に変換していく AST の形によってどういうコードを生成するかが決まる 一度生成したコードを見直して意味を変えないように変換することでより速いコードにすることもできる ( コード最適化 )
17 yacc, lex UNIX で標準で装備されている字句解析 構文解析ルーチン lex (lexical analyzer) 字句解析ルーチン単独で使うこともできる yacc (Yet Another Compiler Compiler) 構文解析ルーチン字句解析の結果を使うので基本的に lex と一緒に使う
18 yacc と lex 概念的 : 入力プログラム 実装 : 入力プログラム 字句解析 構文解析 構文解析 yacc 字句解析 lex AST AST
19 yacc と lex の出力 yacc も lex も C プログラムを自動生成する その C プログラムをコンパイルすることで実行可能なファイルができる lex lex.yy.c yacc *.tab.h *.tab.c
20 lex の構造 定義部 %% 定義部の終了規則部 %% 規則部の終了ユーザ定義サブルーチン部 :Cのプログラムを書く
21 lex 定義部 初期設定を行う %{ と %} で囲まれた部分はそのまま lex.yy.c にコピーされる.
22 lex 規則部 パタン空白アクションの繰り返し パタンは正規表現で書く アクションは C 言語で書く 例 : %% \n ++num_lines; ++num_chars;. ++num_chars; %%
23 正規表現で使える文字 配布したプリントを参照
24 ユーザ定義サブルーチン部 ここで書いたものはすべて C 言語だと解釈され lex.yy.c にそのままコピーされる yylex() を呼び出さないと字句解析が実行されないので lex 単独でプログラムを書く場合はこの中で必ず yylex() を呼び出さなければならない
25 例 : 文字数を数えるプログラム (count.l) %{ int num_lines = 0, num_chars = 0; %} %% \n ++num_lines; ++num_chars;. ++num_chars; %% Int main(void) { yylex(); prinb("# of lines = %d, # of chars = %d\n", num_lines, num_chars); } return 0;
26 lex のコンパイルの仕方 > flex ファイル名 > gcc lex.yy.c o 実行ファイル名 - lfl UNIX の標準は lex だが,GNU の lex 相当である flex を本実験では使う. lex(flex) の関数 ( 例えば yylex) を使うためには,lex のライブラリである libfl.a をリンクする必要がある.- lfl はそれを指定している. count.l をコンパイルして実行してみよう > flex count.l > gcc lex.yy.c o count - lfl
27 ライブラリがないと言われたら 1. ~/.bashrc に以下を追記 export LD_LIBRARY_PATH=/home/users/ecs/ sato/local/lib:$ld_library_path export LIBRARY_PATH=/home/users/ecs/ sato/local/lib:$library_path 2. bashrc を再読み込みして環境変数を再設定 source./bashrc
28 例 2: 単語数を数えるプログラム (word.l) %{ int charcount = 0; int wordcount = 0; int linecount = 0; %} %% [^ \t\n]+ {wordcount++; charcount += yyleng; } \n {charcount++; linecount++;}. {charcount++;} %% int main(void ) { yylex(); prinb("# of lines = %d, # of words = %d, # of chars = %d\n", linecount, wordcount, charcount); } return 0;
29 lex の主要な変数 関数 yyleng ( 最後に ) マッチしたトークンの長さ yytext ( 最後に ) マッチしたトークン文字列 yylex() 字句解析の開始. アクションの中で return を使うか, もしくは入力がなくなるまで字句解析をする. return を用いたとき, 再度 yylex() を呼ぶと前回の続きから字句解析を再開する
30 例 3: 単語の認識 (verb.l) %{ /* Simple verb recogniton. */ %} %% [\t ]+ /* ignore whitespace */ is am are were was {prinb("%s: is a verb\n", yytext); } [a- za- Z]+ {prinb("%s: is not a verb\n", yytext); }. \n {ECHO; } %% int main(void){ } yylex(); return 0;
31 lex 知っておいた方がよいこと lex のパタンは一度だけしかマッチしない 合致するパタンが複数あるときはマッチする長さがもっとも長いパタンのアクションを実行する例 : This is an island. を入力してみる. : 特別なアクション. 次のパタンと同じアクションを使用することを示す. ECHO : トークンの内容をそのまま出力する. どのパタンにもマッチしない入力に対するデフォルトアクションとして使われる.
32 応用問題 (word- ext.l) word.l を次のように拡張しよう 1. アルファベットのみをcharCountで数える. 2. 数字のみを数える変数を付け加える. 3. 単語と認識したものをその都度表示する.
33 yacc の構造 定義部 %% 定義部の終了規則部 %% 規則部の終了ユーザ定義サブルーチン部 :Cのプログラムを書く 形は lex と同じ
34 yacc 注意点 yacc は字句解析をされた後のトークンを入力とするので必ず字句解析ルーチンが必要. 単独では使えない 字句解析ルーチンを使うには yacc の中から yylex() 関数を呼び出す ( 実際には yyparse() 関数を呼ぶとその中で自動的に yylex() を呼んでくれる ) 字句解析ルーチンは自作することも可能だが普通は lex を使う
35 yacc 定義部 初期設定を行う 使用するトークン名を %token の後に続けて書く そうするとそれに対応した C のマクロ宣言が作成され *.tab.h が自動的に作成される それを lex プログラムでも yacc プログラムでも include することでトークンの受け渡しが可能になる. %{ と %} で囲まれた部分はそのまま *.tab.c にコピーされる. 必要なヘッダファイルの include などを行ったりする
36 yacc 規則部 文法規則を書く 左辺 : 右辺 ; 文法としては左辺が右辺に変換される ( 基本的に書き換えるだけ ). ただしそれに加えて右辺にアクションが書ける. 左辺は非終端記号 左辺と右辺の区切りは : 各ルールの区切りは ; lex と同様に が使える 右辺のアクションはその時点で実行される.C のプログラムも書ける 最初の規則の左辺がスタートシンボルとみなされる
37 yacc ユーザ定義サブルーチン部 ここで書いたものはすべて C 言語だと解釈され *.tab.c にそのままコピーされる yyparse() を呼び出さないと字句解析が実行されないので yacc が main となるプログラムを書く場合はこの中で必ず yyparse() を呼び出さなければならない yyparse() の中で yylex() が呼ばれている.
38 例 : I am だけを受理する (sample.y) %{ #include <stdio.h> #include "sample.tab.h" extern int yylex(); extern int yyerror(); %} %token SUBJECT PRED SPACE %% statement : SUBJECT SPACE PRED { prinb("ok!\n");} ; %% int main(void){ } if (yyparse()) { } fprinb(stderr, "Error! Error! Error!\n"); return 1;
39 例 : I am だけを受理する (sample.l) %{ #include "sample.tab.h" /* lex for sample.y */ %} %% I {return SUBJECT;} am {return PRED;} [\t ]+ {return SPACE;} \n return 0;. return yytext[0]; %%
40 yacc のコンパイルの仕方 > flex ファイル名 > bison - d ファイル名 > gcc *.tab.c lex.yy.c o 実行ファイル名 lfl - ly UNIX の標準は yacc だが,GNU の yacc 相当である bison を本実験では使う.- d はヘッダファイルを出すためのオプション. ヘッダファイルに変更がなければつけなくていい. sample.y をコンパイルして実行してみよう > flex sample.l > bison d sample.y > gcc sample.tab.c lex.yy.c o sample lfl - ly
41 yacc が対応できない規則 1 二つ以上のトークンを先読みしないといけないような文法 例 : phrase : cart_animal AND CART work_animal AND PLOW ; cart_animal : HORSE GOAT; work_animal : HORSE OX; ( 注 : 大文字はトークン ) この例では例えば HORSE AND CART の HORSE が cart_animal から導出された HORSE なのか work_animal から導出された HORSE なのかは HORSE の 2 トークン先の CART を見ないと決定できない
42 yacc が対応できない規則 2 曖昧な文法 複数の構文木を作れるような文法を曖昧な文法という 曖昧な文法に対して yacc は reduce/reduce conflict や shi /reduce conflict のエラーを出す.
43 曖昧な文法の例 1 start : x y; x : A; y : A; この時,A という入力に対して, これが x から導出される A なのか y から導出される A なのかはっきりしない. どちらも有りうる. これが還元 / 還元衝突 (reduce/reduce conflict)
44 曖昧な文法の例 2 start : x y R; x : A R; y : A; AR という入力に対して,x から A R が導出されるし,y を A を考えて start の規則に戻って R とも考えられる. どちらも有りうる. これがシフト / 還元衝突 (shi /reduce conflict)
45 lex から yacc に値を渡す方法 lex プログラムから yacc プログラムに値を渡すには lex プログラムのアクション部で return 値 ; とする. この場合, 型はデフォルトでは int lex プログラムで渡したい値を yylval 変数に入れておく. この場合の型はデフォルトでは int yylval の型は変更することができる ( 後述 ). yacc プログラムで値を受け取るには 規則部のシンボルの値として受け取れる. $$ : 左辺のシンボルの値 $1 : 右辺一番左のシンボルの値 $2 : 右辺二番目のシンボルの値
46 yylval の型 yylval のデフォルトの型は int int の値が欲しければ何もしなくてよい yylval はライブラリの中で宣言されているので, これを使う lex プログラムの宣言部に C 言語として extern int yylval; を書いておけばよい.
47 加減算を行う計算機 (p- m.y) %{ #include <stdio.h> #include "p- m.tab.h" extern int yylex(); extern int yyerror(); %} %token NUMBER %% statement : expression {prinb("= %d\n", $1);}; expression : expression '+' NUMBER {$$ = $1 + $3; } expression '- ' NUMBER {$$ = $1 - $3; } NUMBER {$$ = $1;}; %% int main(void) { } if (yyparse()) { } fprinb(stderr, "Error\n"); return 1;
48 加減算を行う計算機 (p- m.l) %{ #include "p- m.tab.h" extern int yylval; %} %% [0-9]+ {yylval = atoi(yytext); return NUMBER; } [\t ] ; /* ignore whitespace */ \n return 0;. return yytext[0]; %%
49 演習 : 四則演算 (arith.y) p- m.y を拡張して乗除算と括弧も扱えるようにしよう 乗除算は加減算より優先される ( 先に実行される ) ことに注意 括弧があると括弧の中を先に計算することに注意 最初に文法を考える
50 演習 : 文法 数字と四則演算とかっこからなる算術式の文法を書いてみよ よくない例 (BNF 表記 ): < 算術式 > ::= < 算術式 > < 演算子 > < 因子 > < 因子 > < 演算子 > ::= + - * / < 因子 > ::= < 数 > (< 算術式 >) 算術式において乗除算は加減算より優先されることがこの文法では実現できていない
51 演習 : 文法 数字と四則演算とかっこからなる算術式の文法を書いてみよ 正しい例 (BNF 表記 ): < 算術式 > ::= < 算術式 > + < 項 > < 算術式 > - < 項 > < 項 > < 項 > ::= < 項 > * < 因子 > < 項 > / < 因子 > < 因子 > < 因子 > ::= < 数 > (< 算術式 >)
52 演習 : 四則演算 (arith.y) 文法の正しい例になるように p- m.y を変更し四則演算と括弧が使えるようにしよう (lex プログラムは p- m.y と同じでよい ) 応用 : 除算の時に 0 で割っている場合にはエラーメッセージをだして計算を行わないようにする ヒント : エラーが起こったことを知らせるには関数 yyerror() を使うのがよい 関数 yyerror() はデフォルトでは引数で与えた文字列を stderr に表示する ( 独自に実装することも可能 )
53 演習 : 実数 (arithr.l, arithr.y) これまで整数の四則演算を行っていた arith.y を実数の四則演算を行うように変更しよう lex プログラムを実数をトークンとするように変更する lex プログラムから yacc プログラムへ渡す値も実数になる ヒント :lex プログラム yacc プログラムのどちらにも宣言部で arithr.tab.h を include する前に #define YYSTYPE double を入れる ( 注 :YYSTYPE は yylval の型 ) arithr.tab.h を見て理解すること
54 変数を使えるようにする arithr.y を拡張して変数を使えるようにする 変数はアルファベット小文字一文字だけからなるものとする 変数の数はたかだか 26 なので,26 個の要素をもつ配列 vbltable に格納する 一行だけで計算が終わるのではなく数式を連続で計算できるようにし,$ が入力されたら終了するようにする
55 %union どの変数が使われるのかを知るためには lex プログラムから変数名を受け取らなければならない 数字が入力された時は実数を, 変数が入力された時には整数 ( 配列の添え字に使う ) を受け取るように複数種類の型の値を yylval に入れて lex プログラムから yacc プログラムへ値を渡したい そのための %union
56 %union 宣言の使い方例 yacc プログラムの宣言部にシンボルの型を定義する %union { double dval; int vblno; } C の共用体として実現される yacc プログラムの各シンボルにどの型を取るかを教えてあげなければならない トークンの場合 %token <dval> NUMBER %token <vblno> NAME 非終端記号のシンボルの場合 %type <dval> expression
57 演習 : 変数も使える計算機 (arithrv.[ly]) arithr.[ly] を拡張する %union 行を arithrv.y に加える 変数の値を格納する配列 vbltable[26] を arithrv.y で宣言し, arithrv.l では extern 宣言する 変数のトークンを NAME として arithrv.l で読み込めるようにする arithrv.y に statement : NAME = expression expression を付け加える ( アクション部も各自考えて追加すること ) NAME を expression の中で使えるようにする statement を複数行読めるようにし,$ が来たら終わるようにする 各トークン, 必要な非終端記号に型を指定すること
58 基本言語仕様 < プログラム > ::= < 変数宣言部 > < 文集合 > < 変数宣言部 > ::= < 宣言文 > < 変数宣言部 > < 宣言文 > < 宣言文 > ::= define < 識別子 >; < 文集合 > ::= < 文 > < 文集合 > < 文 > < 文 > ::= < 代入文 > < ループ文 > < 条件分岐文 > < 代入文 > ::= < 識別子 > = < 算術式 >; < 算術式 > ::= < 算術式 > < 加減演算子 > < 項 > < 項 > < 項 > ::= < 項 > < 乗除演算子 > < 因子 > < 因子 > < 因子 > ::= < 変数 > (< 算術式 >) < 加減演算子 > ::= + - < 乗除演算子 > ::= * / < 変数 > ::= < 識別子 > < 数 > < ループ文 > ::= while (< 条件式 >) { < 文集合 > } < 条件分岐文 > ::= if (< 条件式 >) { < 文集合 > } if (< 条件式 >) { < 文集合 > } else { < 文集合 > } < 条件式 > ::= < 算術式 > < 比較演算子 > < 算術式 > < 比較演算子 > ::= == '<' '>' < 識別子 > ::= < 英字 > < 英数字列 > < 英字 > < 英数字列 > ::= < 英数字 > < 英数字列 > < 英数字 > < 英数字 > ::= < 英字 > < 数字 > < 数 > ::= < 数字 > < 数 > < 数字 > < 英字 > ::= 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 < 数字 > ::=
59 この言語で書けるプログラムの例 define a; define a1; define b; a = 2800; b = (a + 5) *3; if (b> 3000) { b = 3000; } a1 = 0; while(a1 < 2){ b = b / 2; a1 = a1 + 1; }
60 本日の作業内容 作業目標 このスライドにあるすべての演習問題を実行する それができたら基本言語仕様を構文解析する yacc,lex プログラムを作成する まずは正しいプログラムは何のエラーもなく通るようにする. コード生成はまだしなくてよい. アクション部は何も書かなくてよい. エラーがあれば error と出力するようにする グループで相談しながら作業すること. 可能ならば分担して作業すること. 時間が来たら作業報告書を書いて印刷し, それを提出のこと. 作業報告書にはそれぞれのメンバーが今日何をしたかを書くこと
情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤
情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤 2017.12.7 前回の演習問題の解答例 1. 四則演算のできる計算機のプログラム ( 括弧も使える ) 2. 実数の扱える四則演算の計算機のプログラム ( 実数 も というより実数 が が正しかったです ) 3. 変数も扱える四則演算の計算機のプログラム ( 変数と実数が扱える ) 演習問題 1 で行うべきこと
情報工学実験 C コンパイラ第 2 回説明資料 (2018 年度 ) 担当 : 笹倉 佐藤
情報工学実験 C コンパイラ第 2 回説明資料 (2018 年度 ) 担当 : 笹倉 佐藤 2018.12.13 コンパイラ作成実験 非常に難しい. まず コンパイラを実装すること自体が難しい. コンパイラを指して 人工知能 と呼んだ時代もあった. 難しさは 抽象的なアイデアを元に具体的な実装を行うことにある. クヌースはこれを 計算機科学的な考え方 と呼び できる人の存在比率は 1/50 だと述べている.
文法と言語 ー文脈自由文法とLR構文解析2ー
文法と言語ー文脈自由文法とLR 構文解析 2 ー 和田俊和資料保存場所 http://vrl.sys.wakayama-u.ac.jp/~twada/syspro/ 前回までの復習 最右導出と上昇型構文解析 最右導出を前提とした場合, 上昇型の構文解析がしばしば用いられる. 上昇型構文解析では生成規則の右辺にマッチする部分を見つけ, それを左辺の非終端記号に置き換える 還元 (reduction)
PowerPoint プレゼンテーション
コンパイラとプログラミング言語 第 3 4 週 プログラミング言語の形式的な記述 2014 年 4 月 23 日 金岡晃 授業計画 第 1 週 (4/9) コンパイラの概要 第 8 週 (5/28) 下向き構文解析 / 構文解析プログラム 第 2 週 (4/16) コンパイラの構成 第 9 週 (6/4) 中間表現と意味解析 第 3 週 (4/23) プログラミング言語の形式的な記述 第 10 週
分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1
分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 2018.12.20 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1 なぜ分割コンパイルするのか 1. コンパイル時間を短縮するため 2. ソースコードを見やすくするため 3. ソースコードを再利用しやすくするため
PowerPoint プレゼンテーション
講座を行う前に 自己紹介 僕と上回生について 1 年生同士で少しお話しよう! オリエンテーションの宿題 アルゴロジック http://home.jeita.or.jp/is/highschool/algo/index3.html どこまでできましたか? あまりできなかった人はこれから全部クリアしよう! 2016 年度 C 言語講座 第一回目 2016/6/11 fumi 今回の目標 プログラムを書いて実行するやり方を覚える
プログラミング基礎
C プログラミング Ⅰ 授業ガイダンス C 言語の概要プログラム作成 実行方法 授業内容について 授業目的 C 言語によるプログラミングの基礎を学ぶこと 学習内容 C 言語の基礎的な文法 入出力, 変数, 演算, 条件分岐, 繰り返し, 配列,( 関数 ) C 言語による簡単な計算処理プログラムの開発 到達目標 C 言語の基礎的な文法を理解する 簡単な計算処理プログラムを作成できるようにする 授業ガイダンス
PowerPoint プレゼンテーション
2018/10/05 竹島研究室創成課題 第 2 回 C 言語演習 変数と演算 東京工科大学 加納徹 前回の復習 Hello, world! と表示するプログラム 1 #include 2 3 int main(void) { 4 printf("hello, world! n"); 5 return 0; 6 } 2 プログラム実行の流れ 1. 作業ディレクトリへの移動 $ cd
Microsoft Word - Javacc.docx
JavaCC 実習レポート課題について以下の実習のために コンパイラのページ http://www.info.kindai.ac.jp/compiler/ から javacc.zip をダウンロードしてください javacc.zip は以下のファイルから成ります javacc/ sample0.k, sample1.k, samplell2.k : k 言語の例プログラム sample0.asm,
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき
char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く
変数 入出力 演算子ここまでに C 言語プログラミングの様子を知ってもらうため printf 文 変数 scanf 文 if 文を使った簡単なプログラムを紹介した 今回は変数の詳細について習い それに併せて使い方が増える入出力処理の方法を習う また 演算子についての復習と供に新しい演算子を紹介する 変数の宣言プログラムでデータを取り扱う場合には対象となるデータを保存する必要がでてくる このデータを保存する場所のことを
Microsoft PowerPoint - 03BNFScanner-print.ppt
コンパイラ理論 3 BNF と EBNF の復習そして構文解析へ 3 章問題の把握ステップ 1 櫻井彰人 と文法 と EBNF 言語仕様 プログラムと言語仕様との関係 コンパイラ入門 C# で学ぶ理論と実践 より 3.2 BNF(Backus Naur Form) 文法 を記述する表記法 コンピュータ言語を表す為に使われることが多い 英文法 単語と単語の構成 関係を表す 5 文型は単語の品詞から英文の型を表現している
プログラミング実習I
プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 [email protected] 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,
Microsoft PowerPoint - 3.ppt [互換モード]
3. プッシュダウンオートマトンと文脈自由文法 1 3-1. プッシュダウンオートマトン オートマトンはメモリがほとんど無かった この制限を除いた機械を考える 理想的なスタックを利用できるようなオートマトンをプッシュダウンオートマトン (Push Down Automaton,PDA) という 0 1 入力テープ 1 a 1 1 0 1 スタッb 入力テープを一度走査したあと ク2 入力テプを度走査したあと
PowerPoint プレゼンテーション
プログラミング応用演習 第 2 回文字列とポインタ 先週のパズルの解説 答え : 全部 p a 1 図の書き方 : p+1 は式であって その値を格納する記憶場所を考えないので 四角で囲まない 2 p+1 同じものを表すいろいろな書き方をしてみましたが パズル以上の意味はありません プログラム中に書くときは p+1 が短くていいんじゃないかな p+1 は 2 の記憶場所 p[1] は 2 に格納されている値
Microsoft PowerPoint - CproNt02.ppt [互換モード]
第 2 章 C プログラムの書き方 CPro:02-01 概要 C プログラムの構成要素は関数 ( プログラム = 関数の集まり ) 関数は, ヘッダと本体からなる 使用する関数は, プログラムの先頭 ( 厳密には, 使用場所より前 ) で型宣言 ( プロトタイプ宣言 ) する 関数は仮引数を用いることができる ( なくてもよい ) 関数には戻り値がある ( なくてもよい void 型 ) コメント
書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf
情報処理基礎 C 言語についてプログラミング言語は 1950 年以前の機械語 アセンブリ言語 ( アセンブラ ) の開発を始めとして 現在までに非常に多くの言語が開発 発表された 情報処理基礎で習う C 言語は 1972 年にアメリカの AT&T ベル研究所でオペレーションシステムである UNIX を作成するために開発された C 言語は現在使われている多数のプログラミング言語に大きな影響を与えている
PowerPoint プレゼンテーション
プログラミング応用演習 第 2 回文字列とポインタ 先週のパズルの解説 答え : 全部 p a 1 図の書き方 : p+1 は式であって その値を格納する記憶場所を考えないので 四角で囲まない 2 p+1 同じものを表すいろいろな書き方をしてみましたが パズル以上の意味はありません プログラム中に書くときは p+1 が短くていいんじゃないかな p+1 は 2 の記憶場所 p[1] は 2 に格納されている値
untitled
II yacc 005 : 1, 1 1 1 %{ int lineno=0; 3 int wordno=0; 4 int charno=0; 5 6 %} 7 8 %% 9 [ \t]+ { charno+=strlen(yytext); } 10 "\n" { lineno++; charno++; } 11 [^ \t\n]+ { wordno++; charno+=strlen(yytext);}
PowerPoint プレゼンテーション
プログラミング応用演習 第 2 回文字列とポインタ 再掲 プログラミング上達のために 何度か言っていますが 単純な方法があります : 毎日プログラムを書いていれば そのうち慣れます 中身はなんでも構いません 逆にしばらくプログラムを書かずにいると忘れます レポート以降プログラムを書いていないという人は そろそろ忘れている頃かも知れませんね 今後もプログラミングの授業があり 基礎演習の内容が前提となりますので
コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n
コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n を入力してもらい その後 1 から n までの全ての整数の合計 sum を計算し 最後にその sum
kiso2-03.key
座席指定はありません Linux を起動して下さい 第3回 計算機基礎実習II 2018 のウェブページか ら 以下の課題に自力で取り組んで下さい 計算機基礎実習II 第2回の復習課題(rev02) 第3回の基本課題(base03) 第2回課題の回答例 ex02-2.c include int main { int l int v, s; /* 一辺の長さ */ /* 体積 v
/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){
ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す
PowerPoint Presentation
プログラミング基礎 第 2 週 (4,5,6 回 ) 2011-10-07 出村公成 この資料の再配布を禁止します 予定 プログラミング入門 (45 分 ) 変数 入出力 分岐 演習 (90 分 ) タッチタイプ練習 統合開発環境 Codeblocksの使い方 教科書例題の打ち込みと実行 プログラミング入門 C 言語の簡単な例を体験 変数 入出力 分岐 プログラムの例リスト 2.1 改 #include
Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕
Java Script プログラミング入門 3-6~3-7 茨城大学工学部情報工学科 08T4018Y 小幡智裕 3-6 組み込み関数 組み込み関数とは JavaScript の内部にあらかじめ用意されている関数のこと ユーザ定義の関数と同様に 関数名のみで呼び出すことができる 3-6-1 文字列を式として評価する関数 eval() 関数 引数 : string 式として評価する文字列 戻り値 :
JavaプログラミングⅠ
Java プログラミング Ⅰ 6 回目 if 文と if else 文 今日の講義で学ぶ内容 関係演算子 if 文と if~else 文 if 文の入れ子 関係演算子 関係演算子 ==,!=, >, >=,
Microsoft PowerPoint ppt
基礎演習 3 C 言語の基礎 (5) 第 05 回 (20 年 07 月 07 日 ) メモリとポインタの概念 ビットとバイト 計算機内部では データは2 進数で保存している 計算機は メモリにデータを蓄えている bit 1bit 0 もしくは 1 のどちらかを保存 byte 1byte 1bitが8つ集まっている byte が メモリの基本単位として使用される メモリとアドレス メモリは 1byte
JavaプログラミングⅠ
Java プログラミング Ⅰ 12 回目クラス 今日の講義で学ぶ内容 クラスとは クラスの宣言と利用 クラスの応用 クラス クラスとは 異なる複数の型の変数を内部にもつ型です 直観的に表現すると int 型や double 型は 1 1 つの値を管理できます int 型の変数 配列型は 2 5 8 6 3 7 同じ型の複数の変数を管理できます 配列型の変数 ( 配列変数 ) クラスは double
Microsoft PowerPoint - 09.pptx
情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源
(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド
メソッド ( 教科書第 7 章 p.221~p.239) ここまでには文字列を表示する System.out.print() やキーボードから整数を入力する stdin.nextint() などを用いてプログラムを作成してきた これらはメソッドと呼ばれるプログラムを構成する部品である メソッドとは Java や C++ などのオブジェクト指向プログラミング言語で利用されている概念であり 他の言語での関数やサブルーチンに相当するが
プログラミング実習I
プログラミング実習 I 03 変数と式 人間システム工学科井村誠孝 [email protected] 3.1 変数と型 変数とは p.60 C 言語のプログラム中で, 入力あるいは計算された数や文字を保持するには, 変数を使用する. 名前がついていて値を入れられる箱, というイメージ. 変数定義 : 変数は変数定義 ( 宣言 ) してからでないと使うことはできない. 代入 : 変数には値を代入できる.
PowerPoint プレゼンテーション
プログラミング応用演習 第 3 回構造体, ファイル入出力 先週の出席確認へのコメント 暗号を破りたいが 平文の候補が多すぎる 人間の目で確認する代わりに どんなプログラムがあればよいか? 辞書を挙げた人が多かった 正しい着眼です 何億個もの平文候補が想定されるので 形態素解析や品詞判別を挙げた人もいます 辞書に近い回答で悪くはないのですが 平文候補ごとにあまり高機能なものを呼び出すと時間がかかる
数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留
第 10 章分割コンパイル 1 ソースを分割する今まで出てきたソースは全て一つのソースファイルにソースを記述してきました しかし ソースが長くなっていくと全てを一つのファイルに書くと読みづらくなります そこで ソースを複数のファイルに分割してコンパイルを行う分割コンパイルをします 今章は章名にもなっている 分割コンパイルの方法についてやります 分割コンパイルする時は大抵 関連性のある機能ごとにファイルにまとめます
情報処理演習 B8クラス
予定スケジュール ( 全 15 回 ) 1 1. 終了 プログラミング言語の基礎 2. 終了 演算と型 3. 終了 プログラムの流れの分岐 (if 文,switch 文など ) 4. 終了 プログラムの流れの繰返し (do, while, for 文など ) 5. 終了 中間レポート1 6. 終了 配列 7. 終了 関数 8. 終了 文字列 ( 文字列の配列, 文字列の操作 ) 9. 終了 ポインタ
Java講座
~ 第 1 回 ~ 情報科学部コンピュータ科学科 2 年竹中優 プログラムを書く上で Hello world 基礎事項 演算子 構文 2 コメントアウト (//, /* */, /** */) をしよう! インデントをしよう! 変数などにはわかりやすい名前をつけよう! 要するに 他人が見て理解しやすいコードを書こうということです 3 1. Eclipse を起動 2. ファイル 新規 javaプロジェクト
プログラミング基礎I(再)
山元進 クラスとは クラスの宣言 オブジェクトの作成 クラスのメンバー フィールド 変数 配列 メソッド メソッドとは メソッドの引数 戻り値 変数の型を拡張したもの 例えば車のデータベース 車のメーカー 車種 登録番号などのデータ データベースの操作 ( 新規データのボタンなど ) プログラムで使う部品の仕様書 そのクラスのオブジェクトを作ると初めて部品になる 継承 などの仕組みにより カスタマイズが安全
講習No.1
プログラムはどこに保存され, どこで実行されるのか? 復習 ハードディスク キーボード Central Processing Unit 例えば i7, ARM, Cortex-A17 ディスプレイ 例えば 4G バイト メモリ プログラムは, ワープロ文章などと同様, ハードディスクなどにファイルとして保存されている. プログラムは, メモリ上に呼び出されて ( ロード ) 実行される. プログラムの作成
Cプログラミング1(再) 第2回
C プログラミング 1( 再 ) 第 2 回 講義では Cプログラミングの基本を学び演習では やや実践的なプログラミングを通して学ぶ 1 前回のレポートから 前回の宿題 数あてゲーム の説明において 次のように書いていたものがいた : これはコンピュータがランダムに設定した数字を人間が当てるゲームである この説明でどこかおかしなところはないだろうか? 2 コンピュータの用語と日常的な用語の違い 物理において
4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ
4 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プログラミング技術 工業 333 実教出版 ) 共通 : 科目 プログラミング技術 のオリエンテーション プログラミング技術は
Microsoft PowerPoint - å®�æ−•試é¨fi3ㆮ対ç�Œ.pptx
C言語の繰り返し処理 for文と while文と do文 臼杵 潤 0) 準備 変数の加減算 int a, b=10; // a= a = 0; a = a+1; // a= a += 1; // a= // a= a ++; a = a + b; // a= a += b; // a= // a= a --; 下を1行ずつ実行すると それぞれ aの値はどう変わるか 0 1 2 3 13 23 22
プログラミング入門1
プログラミング入門 1 第 5 回 繰り返し (while ループ ) 授業開始前に ログオン後 不要なファイルを削除し て待機してください Java 1 第 5 回 2 参考書について 参考書は自分にあったものをぜひ手元において自習してください 授業の WEB 教材は勉強の入り口へみなさんを案内するのが目的でつくられている これで十分という訳ではない 第 1 回に紹介した本以外にも良書がたくさんある
Microsoft PowerPoint ppt
仮想マシン () 仮想マシン 復習 仮想マシンの概要 hsm 仮想マシン プログラム言語の処理系 ( コンパイラ ) 原始プログラム (Source program) コンパイラ (Compiler) 目的プログラム (Object code) 原始言語 (Source language) 解析 合成 目的言語 (Object Language) コンパイルする / 翻訳する (to compile
memo
数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int
今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること
C プログラミング演習 1( 再 ) 4 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順
オートマトン 形式言語及び演習 3. 正規表現 酒井正彦 正規表現とは 正規表現 ( 正則表現, Regular Expression) オートマトン : 言語を定義する機械正規表現 : 言語
オートマトン 形式言語及び演習 3. 酒井正彦 www.trs.css.i.nagoya-u.ac.jp/~sakai/lecture/automata/ とは ( 正則表現, Regular Expression) オートマトン : 言語を定義する機械 : 言語を記号列で定義 - 記述しやすい ( ユーザフレンドリ ) 例 :01 + 10 - UNIX の grep コマンド - UNIX の
コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol
コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include 2. #include /*troupper,islower,isupper,tolowerを使うため宣言*/ 3. 4. int get_n(char *); 5. void replace(char
解答編 第 9 章文字データの取り扱い 演習問題 9.1 文法事項 1 ) コンピュータにおける 文字データの取り扱いについて説明しなさい コンピュータでは 文字に整数の番号を割り当てて ( コード化して ) 文字コードとして扱います 実際に用いられる文字コードとして ASCII コード EUC コ
解答編 第 9 章文字データの取り扱い 演習問題 9.1 文法事項 1 ) コンピュータにおける 文字データの取り扱いについて説明しなさい コンピュータでは 文字に整数の番号を割り当てて ( コード化して ) 文字コードとして扱います 実際に用いられる文字コードとして ASCII コード EUC コード JIS コード SJIS コードなど 様々な規格が存在します 2 ) C 言語の文字型は整数型の一種と考えられるが
