Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

[修士論文] 入力支援機能を備えた日本語表記による初学者向けプログラミング学習環境の構築

1,006 views

Published on

Published in: Education
  • Be the first to comment

  • Be the first to like this

[修士論文] 入力支援機能を備えた日本語表記による初学者向けプログラミング学習環境の構築

  1. 1. 大阪市立大学大学院 創造都市研究科 修士学位論文 修士論文      入力支援機能を備えた日本語表記による初学者向けプログラミング学習環境の構築  Japanese-based Programming Environment for Novices with Coding Support Function         2006年1月 大阪市立大学大学院 創造都市研究科 都市情報学専攻 情報基盤研究分野 M04UC507 中村亮太 (NAKAMURA,Ryota)
  2. 2. 目次1 はじめに 12 プログラミング教育に必要な支援機能 2 2.1 プログラミング演習の難しさ . . . . . . . . . . . . . . . . . . . . . . . . 2 2.2 「プログラミング」入門教育の目標 . . . . . . . . . . . . . . . . . . . . . 2 2.3 初学者用プログラミング環境として何が必要か . . . . . . . . . . . . . . . 33 初学者向けプログラミング学習環境 PEN 4 3.1 プログラム入力支援機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.1.1 プログラム入力支援ボタン . . . . . . . . . . . . . . . . . . . . . . . . 5 3.1.2 インデントの自動挿入 . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.2 プログラムの実行状態表示機能 . . . . . . . . . . . . . . . . . . . . . . . 8 3.2.1 実行制御ボタン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.2.2 実行箇所マーカー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.2.3 実行状態表示ラベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.2.4 スロー実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2.5 ステップ実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2.6 変数表示画面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.3 プログラム入力支援ボタンのカスタマイズ . . . . . . . . . . . . . . . . . 114 PENの実装 12 4.1 構文定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2 プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.3 実行制御/状態表示の遷移 . . . . . . . . . . . . . . . . . . . . . . . . . . 175 評価 18 5.1 操作記録の解析と評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.2 授業での利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.2.1 大阪学院大学での使用例 . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.2.2 大阪市立大学での使用例 . . . . . . . . . . . . . . . . . . . . . . . . . 206 おわりに 21謝辞 22 i
  3. 3. 参考文献 23 ii
  4. 4. 図目次1 PENの実行時の表示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 xDNCLの記述例(数当てゲーム) . . . . . . . . . . . . . . . . . . . . 53 入力支援ボタンによるプログラミング例 . . . . . . . . . . . . . . . . . . 64 インデントの自動挿入 . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 実行箇所マーカー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 実行速度調節バー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 プログラム入力支援ボタンのカスタマイズ例 . . . . . . . . . . . . . . . 118 プログラム実行系の概略 . . . . . . . . . . . . . . . . . . . . . . . . . . 129 JJTreeの記述例(加算・減算) . . . . . . . . . . . . . . . . . . . . . . 1410 プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1511 パーサクラスへの入力するプログラム . . . . . . . . . . . . . . . . . . . 1612 パーサクラス内に生成される構文木 . . . . . . . . . . . . . . . . . . . . 1613 実行状態遷移図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17表目次1 実行制御ボタンの一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 実行状態の一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 JavaCCとJJTreeで使用できる正規表現の一覧 . . . . . . . . . . . . . . 134 解析結果の平均値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 iii
  5. 5. 1 はじめに 中学、高校、大学で、一般情報処理教育が行なわれているが、その多くはリテラシー中心の教育となっており、プログラミング教育はあまり実施されていない。しかし、情報処理学会の提言[1]で「一般情報処理教育としてのプログラミング教育の重要性」について述べられている。また提言では、プログラミング教育の目標を、「プログラミングとは何かを理解すること」としている。 しかし、既存環境でプログラミング教育を行った場合、「プログラミング言語のとっつきにくさ」「ちょっとミスで発生する文法エラー」や「実 、行時エラーの対処の難しさ」などといった問題がある。これらの問題により、プログラミング初学者の学習意欲を失わせてしまい、既存環境では目標を達成するには困難であると考える。 また、プログラミング初学者用の学習環境を提供する研究として、ドリトル[8]やNigari[9]などがある。プログラミング入門教育用として、さまざまな機能が実装されているが、これらはいずれも、オブジェクト指向環境となっている。オブジェクト指向の考え方は極めて重要ではあるが、提言では「手続き的思考の育成」も学習目標としているので、これらの環境は一般情報処理教育としてのプログラミング教育としては適していないと考える。 本研究では、既存環境での問題点を解消し、プログラミング教育の目標を達成するためのサポートツールとして、入力支援機能を備えた日本語表記による初学者向けプログラミング学習環境 PEN [2][3][4][5][6][7] (Programming Environment for Novices)を構築し、その有用性を明らかにすることを目的とする。  PENのプログラム言語は、初学者でも容易に理解できるよう、日本語表現のプログラム言語 xDNCL言語を用いた。また、簡単にプログラムを記述できるよう、プログラム入力支援機能を実装した。プログラム実行の流れを観察できるよう、実行形式はインタプリタ形式とし、プログラム実行制御/状態表示機能によって、プログラムのトレース作業を行えるようにした。 2章では、プログラミング教育の目標と、その目標を達成するにはどういった学習環境が必要かを述べ、3章では初学者向けプログラミング学習環境 PENの概要を述べる。4章では、実装をどのように行ったかについて述べる。5章では、PENの評価結果を報告し、6章で、まとめと今後の課題について述べる。 1
  6. 6. 2 プログラミング教育に必要な支援機能 ここではまず、2.1において従来のプログラミング演習で初学者が直面する問題を挙げる。2.2では、本研究で考えるプログラミング教育の目標を明白にし、2.3では、その教育目標を達成するためのプログラミング環境としてどのような機能が必要かについて考察する。2.1 プログラミング演習の難しさ 初学者は、プログラミング演習の初期の段階でつまずくことが多い。演習初期段階ではタイプミスに起因する文法エラーが多く発生し、意味の理解できないコンパイルエラーメッセージを(多くの場合英語で)突き付けられ、それだけで自信をなくす者も少なくない。文法エラーの修正ばかりに気を取られていると、プログラムの構造をどのように組み立てるかといった、全体への配慮ができず、プログラミングの力がなかなか身につかないことが多い。また、コンパイルエラーがなくなっても、論理的なエラーのために予想していたのと違う結果が返ってくると対処することが難しい。論理的なエラーはエラーメッセージが表示されないので、間違い箇所をみつけるためには、変数に何が代入されているかを逐次チェックしていかなければならない。デバッガを用いれば、このようなチェックは比較的容易に行うことができるが、多くのデバッガは初学者が使うことを考慮しておらず、使いにくいことが多い。2.2 「プログラミング」入門教育の目標 1にで述べたように、ここで想定している「プログラミング入門」は、大岩レポート[10]でいうところの「プログラミング」を目指すものであり、職業技能としてのプログラミング言語の習得を目的とするものではない。「プログラミング」習得の目的は、文献[11]に示されている通りであり、要約すると次の通りである。 プログラミングを、決まった正解を求める機械的な作業のようにとらえるのは、 まったくの間違いである。プログラミングは、無限の解法が存在する、まさに創造 的な作業というべきであり、その過程そのものが教育的に有益である。自分が考え たことを決められたルールに従って、きちんと記述するという訓練は、自分の知識 状態や考え方を明確にする力を養える。また、プログラムのデバッグは、間違い発 見のプロセスであり、自ら発見するという学習そのものであり、自立的な思考力を 養える。このような効果を得るためには、プログラムを書いて、実際に動かしてみ 2
  7. 7. るということを自ら体験する必要がある。 さらに、プログラミングを体験することで、コンピュータというものの本質を理解できるようになる。すなわち、コンピュータは、プログラムに書かれたことを忠実に実行するだけの機械であって、それ以上でもそれ以下でもないことを実感できる。また、考えたことをプログラムに書き表すのは容易ではないことや、コンピュータのプログラムからバグを取り去るのは容易でないことなども自分の経験として理解できるようになる[12]。 このように「プログラミング」の習得は、上記のような体験にもとづいて、コンピュータの本質を理解することを目標としている。2.3 初学者用プログラミング環境として何が必要か 2.2で示したプログラミング入門を、なるべく短時間に習得するために必要なプログラミング環境について考える。 まず、プログラミング言語としてどのようなものを選ぶかが重要な問題である。読んで分かりやすい言語であることが第一の条件であろう。そこで、大学入試センターの「情報関係基礎」で用いられている手順記述言語DNCL[13]、および、DNCLをもとに作られた東京農工大の入試用手順記述言語TUATLE[14]に注目した。これらの言語は日本語をベースとした記述言語であり、特別な説明なしで入試で用いられているということからも、分かりやすさの点では問題ないと思われる。 DNCLおよびTUATLEは、読みやすさの点では、初学者に十分受け入れられるレベルであるが、書くのは必ずしも容易ではない。日本語をベースとしていることから、キーワードなども長めであり、入力において、文法エラーが入り込む余地は大きい。そこでプログラムを書く際の何らかの入力支援機能が必要となる。 また、2.2で述べたように、プログラミングは自分で書いて実際に動かしてみることが重要である。そのためには、言語処理系が必要であり、さらに、論理的な間違いを発見しやすいように、初学者がプログラムの実行状況を観察できる機能等が必要である。 3
  8. 8. 3 初学者向けプログラミング学習環境 PEN 図1 PENの実行時の表示例 図1はPENの実行時のスナップショットである。PENはプログラムの入力/編集を行うためのエディタ機能、プログラムの実行・一時停止・一行実行などの実行制御機能、実行結果とその履歴を表示するコンソール機能、実行中の各変数の値を表示する機能等をもつ(付録A)。 PENで動作するプログラム言語は、DNCLおよびTUATLEを拡張した言語を用いた。これをxDNCL(付録B)とよぶ。図2にxDNCLによるプログラムの記述例を示す。言語仕様はDNCLに、変数宣言の追加と演算子の定義で若干の変更を行っているが、基本的にはほとんど同じである。また、よくある入力間違いによるプログラムの記述ミスを、文法エラーとせずに受理し、実行できるようにしている(付録C)。 4
  9. 9. 図2 xDNCLの記述例(数当てゲーム)3.1 プログラム入力支援機能3.1.1 プログラム入力支援ボタン 上述したように、xDNCLで記述されたプログラムは読みやすいが、日本語で記述されているので、プログラム作成時は文法通りに間違わず入力することは必ずしも容易ではない。また、キーボードに慣れていない初学者にとっては、かな漢字変換の操作も煩雑である。 キー入力の操作を減らし、補助するための機能として、図1の下部のようなプログラム入力支援ボタンを用意した。 以下に、プログラム入力支援ボタンの使用例を示す(図3)。 1. 図3 (a)の状態で入力支援ボタン [ ∼の間、繰り返す ] をクリックすると、図3 (b) のように制御構造のテンプレートが編集画面に挿入される。 5
  10. 10. 図3 入力支援ボタンによるプログラミング例 2. 次に≪条件式≫など、≪と≫で囲まれた部分(この部分全体で一つの文字として扱 われる)をマウスでクリックするか、その位置にカーソルを移動することにより、図 3 (c)のように≪と≫で囲まれた部分が選択される。 3. 選択された部分を実際の条件式等に書き換えて、さらに4行目以降に命令を挿入し ていくことにより、プログラムを作成することが可能である。3.1.2 インデントの自動挿入 DNCL等では、インデントを縦棒記号(|)で表している。PENでは、インデントの縦棒記号を自動で挿入するようにした(図4)。 6
  11. 11. 図4 インデントの自動挿入 図4 (a)の状態で、 [ もし∼そうでなければ ] の入力支援ボタンを押すと、インデントを付加した制御構造のテンプレートが図4 (b)のように挿入される。インデントを自動的に付加することにより、プログラムの記述を助けるだけではなく、プログラムの構造を明確に意識する手助けにもなる。 7
  12. 12. 3.2 プログラムの実行状態表示機能 プログラムの実行状態の表示機能について、図1 を用いて説明する。 プログラムの実行は図1上部中央にある実行制御ボタン群の実行ボタンにより行う。また、プログラム実行の流れを理解できるよう、1行ずつ実行できるステップ実行や、実行速度を調節し実行できるスロー実行の機能を持つ。 実行時には、どの行が実行されているかを実行箇所マーカーで常に明示している。変数表示画面では、実行中のプログラムで用いているすべての変数の値を常に表示している。これらの情報を提示することで、プログラムがどのように実行されているかなどの状況を把握しやすくしている。また、実行状態表示ラベルでプログラムの実行時の状態を明示している。3.2.1 実行制御ボタン 図1の上部中央に実行制御ボタンがあり、プログラムの実行や一時停止などの実行状態の制御が行える。表1に、個々の実行制御ボタン名と押した時にどのような状態に遷移するかを示す。 表1 実行制御ボタンの一覧 実行制御ボタン名 意味 実行 プログラムの実行を開始する。プログラム実行中は「一時停 止」ボタンに変化する。実行する速度は「実行速度調整スライ ダー」で変化させることができる。 始めから実行 実行ボタンと同じ。 一時停止 実行を一時停止する。一時停止時は、「再開」のボタンに変化 する。 再開 一時停止中のプログラムの実行を再開する。再開後は、「一時 停止」のボタンに変化する。 一行実行 「実行箇所マーカー」のある行のみを実行し、その後、一時停 止状態になる。 始めに戻る プログラムの実行を取り止め、プログラムの最初に戻ります。 8
  13. 13. 図5 実行箇所マーカー3.2.2 実行箇所マーカー 図5にある「●」は、次に実行するプログラムの行を指し示した実行箇所マーカーである。また、スロー実行やステップ実行と組み合わせて用いると、トレース作業を容易に行える。3.2.3 実行状態表示ラベル 図1の右上に実行状態表示ラベルがあり、プログラムの実行状態を把握できるようにしている。プログラムの状態としては、表2に示すように、5つの状態がある。プログラムの実行状態を表示することにより、プログラムが途中でが停止しているのか動いているのか、入力を求められて停止しているかなどが、一目でわかる。 表2 実行状態の一覧 実行状態 意味 実行待ち プログラムを実行していない状態。プログラムの編集が可能。 実行中 通常にプログラムを実行している状態。 一時停止中 「一時停止」や「一行実行」によって実行が停止されている状態。 入力待ち プログラム内の入力文による入力待ち状態。入力はコンソール画面 に行う。 実行終了 プログラムの実行が終了した状態。再度、プログラムを実行する場 合は「始めから実行」で行う。また状態を「実行待ち」に初期化する には「始めに戻る」で行う。 9
  14. 14. 3.2.4 スロー実行 図6 実行速度調節バー プログラムを実行しながら観察できるよう、実行速度を調節できる機能を実装した。実行速度の調節は図6の実行速度調節バーにて行う。実行速度調節バーのツマミをドラッグ&ドロップし、右へ動かすと実行速度が遅くなり、逆に左に動かすと速くなる。実行速度の調節はプログラムの実行中でも変更できるので、注目してみたい箇所で実行速度を遅くし、じっくりと観察するといった使い方も可能である。3.2.5 ステップ実行 プログラムの実行過程を詳しく観察できるよう、ステップ実行を用意している。ステップ実行は、図1上部中央にある実行制御ボタン群の一行実行ボタンで実行できる。一行実行ボタンを押すと、実行箇所マーカーの指し示している行を実行し、次の命令に実行箇所マーカーが移り、プログラム実行状態が一時停止状態になる。3.2.6 変数表示画面 プログラムの実行過程を観察する際、変数にどのような値が代入されているかなどの情報が必要になる。変数に関する情報は、図1の右下にある変数表示画面に表示される。表示される項目は「データ型」「変数名」 、 、および「変数の値」である。 10
  15. 15. 3.3 プログラム入力支援ボタンのカスタマイズ プログラム入力支援ボタンは外部ファイルによって定義されており、ボタンの表示名やサイズ、色、押した時に入力される文字列をカスタマイズできるようにしている。カスタマイズすることにより、教員が授業の進行状況に合わせて、必要なボタンのみを表示させておくことも可能である。また、個々の入力支援ボタンには任意の文字列を対応付けておくことができるので、不等号など入力しづらい文字をボタンに割り当てることもできる。 ボタンの定義方法は、入力支援ボタン定義ファイルに、1行につきボタン1つを記述する。フォーマットは「ボタン名@ボタンサイズ@ボタン色(R,G,B)[@挿入文字列]」である。ボタン名とは、ボタンに表示される文字列で、ボタン名は最大48文字表示できる。ボタンサイズはボタンの横幅で、例えばボタン名10文字分の幅をとりたい場合は、 10」と 「記述する。挿入文字列は、ボタンを押したときに編集画面に入力される文字列である。また、挿入文字列を記述しなかった場合、ボタンではなくラベルとして表示される。図7に、初学者向けの入力支援ボタンの定義ファイルと、その入力支援ボタンの表示例を示す。 図7 プログラム入力支援ボタンのカスタマイズ例 11
  16. 16. 4 PENの実装 PENは多くの環境で動作できるようJava言語で記述した。付録Dにすべてのパッケージ階層を掲載している。インタフェースには、動作環境にあまり影響されることなく、一貫したユーザインターフェイスを提供できる、Swingパッケージを用いた。 字句解析や構文木を生成するパーザの作成には、Javaで記述されたコンパイラ・コンパイラのJavaCC[16][17]と、そのプリプロセッサであるJJTreeを用いた。パーザを作成するまでの流れを簡単に説明すると、まずJJTreeに構文定義ファイルを入力として渡す。JJTreeは構文定義ファイルをJavaCC形式に変換し、また構文木を生成するためのJavaソースファイルなどを出力する。次に、JavaCC形式の構文定義ファイルをJavaCCに入力として渡すと、パーザクラス、例外処理クラスやトークンを扱うクラスファイルなどが出力される。xDNCL言語で記述したプログラムを実行するには、JJTreeとJavaCCを用いて作成したパーザクラスへプログラムを入力として渡す。パーザクラスは入力されたプログラムの字句解析を行い、インスタンス内に構文木を生成する。生成した構文木を格納したインスタンスに、各ノードで行う処理を記述したクラスを渡すと、xDNCL言語で記述したプログラムが実行される。 図8 プログラム実行系の概略 12
  17. 17. 4.1 構文定義 JJTreeやJavaCCへ入力する構文定義ファイルはBNF記法に近い記法で記述する。また、JavaCCとJJTreeの構文定義には正規表現を使用することができる(表3)。 JJTreeへ入力する構文定義の記述例として加算・減算のみの数式を受理するものを、図9に記す。TOKENには字句規則を <トークン名: 正規表現>の形式で記述し、また複数定義する場合は|で区切る。Expression()とLiteral()は構文規則で、Expression()はLiteral()と<ADDOPERATOR> Literal() または、<SUBOPERATOR> Lit-eral()の0回以上の繰り返しからなる。 付録EにxDNCL言語のBNF記法による構文定義、付録FにJJTree形式による構文定義を掲載した。 表3 JavaCCとJJTreeで使用できる正規表現の一覧 表記法 意味 ”...” 引用符内に書かれた文字(列)と一致 | または [...] 文字クラス ˜[...] 補集合文字クラス – 範囲 , 列挙 (...)? 省略可能 (...)* 0回以上の繰り返し (...)+ 1回以上の繰り返し 13
  18. 18. TOKEN : { < ADDOPERATOR: "+" > | < SUBOPERATOR: "-" > | < INTEGER_LITERAL: ["0"-"9"] >}void Expression() : {} { Literal() ( <ADDOPERATOR> Literal() | <SUBOPERATOR> Literal() )*}void Literal() : {} { <INTEGER_LITERAL> [ Literal() ] } 図9 JJTreeの記述例(加算・減算)4.2 プログラムの実行 プログラム実行処理系はコンソール画面への描画などの関係から、ユーザインタフェースとは別のスレッドで起動する。以下に、xDNCL言語で記述したプログラムの実行から終了までの、概略を記す。 1. 実行制御ボタンの実行ボタンか一行実行ボタンを押すと、ThreadRunクラスのイ ンスタンスが、スレッドとして起動する(図10 (a))。 2. ThreadRunクラスが起動すると、編集画面に記述したプログラムをパーザクラス に渡す(図10 (b))。 3. 入力されたプログラムの字句解析を行い、構文木を生成する。生成された構文木は パーザクラスのインスタンシに格納される(図10 (c))。例えば、図11の偶数奇数を 判断するプログラムをパーサクラスへ渡した場合、パーサクラス内のインスタンス に図12の構文木が格納される。構文エラーが発生し構文木が生成できなかった場 合、エラー文をコンソール画面へ出力しスレッドを停止する(図10 (d))。 4. 各ノードの処理を記述したIntVExecuterクラス(付録G)を、構文木を格納したイン スタンスに渡す(図10 (e))。 5. インスタンスにIntVExecuterクラスが渡されると、IntVExecuterクラスに記述さ れた処理通りに、構文木のノードを実行していく(図10 (f))。 14
  19. 19. 6. 構文木のノードをすべて実行すると、プログラムの終了処理を行いスレッドを停止 する(図10 (g))。実行時エラーによりプログラムが停止した場合、構文エラーが発 生した時同様にコンソール画面へエラー文を出力し、スレッドを停止する。 図10 プログラムの実行 15
  20. 20. 図11 パーサクラスへの入力するプログラム図12 パーサクラス内に生成される構文木 16
  21. 21. 4.3 実行制御/状態表示の遷移 プログラムの実行状態は状態表示ラベルに表示しており、表2のように5状態ある。PENは起動すると実行待ちの状態にセットされる。実行状態は実行制御ボタン(表1)の操作や、プログラムの命令によって図13のように遷移する。例えば実行状態が実行待ちの時、実行ボタンを押せば、実行中の状態に遷移し、また 一行実行ボタンを押せば、プログラム一行を実行し 一時停止の状態に遷移する。状態遷移の例外として、プログラム実行エラーが発生すると、プログラムの実行停止処理を行い実行待ちの状態に遷移する。 図13 実行状態遷移図 17
  22. 22. 5 評価5.1 操作記録の解析と評価 プログラミング教育の入門用として、PENの有効性を検証するために、利用者の操作記録を記録再生できる機能をもつSOLAR-CATS[5]システムを利用した。SOLAR-CATSの作者である鹿児島大学の山之上先生の協力を得て、SOLAR-CATSにPENを組み込んで頂いた。これによって、PENの利用者のすべてのマウスおよびキーボード入力を時刻とともに記録することができ、利用者の挙動を把握できるようになった。 今回の実験は、PENの有効性を検証するための予備実験の位置づけであり、プログラミング、および、キーボード入力に習熟した被験者3人に対して、プログラムソースを与えて、入力支援ボタンを使った場合と、使わなかった場合で、プログラムの入力時間、打鍵数などを比較した。 表4 解析結果の平均値 プログラム Prog1 Prog2 支援ボタンの使用の有無 無し 有り 無し 有り 入力間違い箇所 2.67 1.33 0.33 0.33 全入力時間(s) 285 302 264 293 マウス操作時間(s) 3 55 0 33 キー操作時間(s) 216 120 200 148 キー入力総数 1,004 709 964 549 カーソル打鍵数 20 207 7 145 消去打鍵数 58 72 52 43 モディファイア打鍵数 38 26 39 26 [半角/全角]の切替数 55 26 49 19 漢字変換中の打鍵数 791 446 720 232 入力支援ボタン押回数 0 21 0 21 消去打鍵数:BackSpaceやDeleteキーの打鍵数 モディファイ打鍵数:Shift,Ctrl,Altの打鍵数 漢字キー打鍵数:半角/全角切り替えキーの打鍵数 18
  23. 23. 評価で使用したプログラムは、図2のプログラム(Prog1と呼ぶ) と、図2と同じステップ数の別のプログラム(Prog2)の2種類である。この2種類のプログラムを、入力支援ボタンを使用した場合と、使用しなかった場合で、被験者に入力してもらい、その操作を記録した。公平をきすため、入力支援ボタンを使用した場合と使用しなかった場合について、Prog1とProg2で実験の順序を入れ替えて、以下の順で実験を行った。(1)Prog1-ボタン使用、 (2)Prog1-ボタン使用せず、 (3)Prog2-ボタン使用せず、(4)Prog2-ボタン使用。 表4は実験時の操作記録を解析したものである。被験者全員がキーボードの入力に習熟していることもあり、入力支援ボタンを使用した時より使用しない方が、プログラムの記述を早く行える結果となった。しかし、キー入力総数は、入力支援ボタンを使うことにより、Prog1で 29.38%、Prog2で 43.05% 減少した。 入力支援ボタンの利用によって、利用者のキー入力数を大幅に減らすことができることが確認できたことから、初学者がプログラムを入力する際にタイプミスによる文法エラーの発生を抑えることができる可能性があることを示唆している。5.2 授業での利用5.2.1 大阪学院大学での使用例 大阪学院大学情報学部において、PENを2005年度前期1年生向けのプログラミング入門の講義(座学)および、演習(全13回, 90分/回)で利用した。PENは5月の各4回の講義、演習で利用し、C言語を学習する前に、プログラミングの基本として順次、選択、反復の各制御構造と配列の考え方を理解してもらうことを目的として授業を行った。教材は、22の例題とそれに対応して各1問の演習問題を提供し、講義では例題の解説と演習問題を考えるためのヒントとなるような説明などを行った。演習ではそれを受けてPENを実際に用いた例題の入力、検証と演習問題のプログラミングを行った。 講義最終日に学生から意見を得るため、アンケートによる調査を行った。アンケートには、「理解できるところは簡単に理解できました。、 」「初めて使いましたがなかなか面白いものだと思いました。、 」「一部わからなかった部分もありましたが、その次の授業で大体は分かりました。」など、プログラミングというものを理解してもらえているような感想があった。また、「日本語環境だったので、C言語よりわかりやすかった。、 」「日本語なのでわかりやすかった。」と、言語が理解しやすかったという感想もあった。しかし、一部の学生からは、 C言語をメインにやると思っていたため、つまらなかった」という意見が 「あった。 19
  24. 24. 5.2.2 大阪市立大学での使用例 大阪市立大学の2部の共通教育科目「情報処理I」(2005年度前期) の中で、PENを試用した。この授業は、いわゆるコンピュータリテラシーの習得を目的とするものであり、全13回(180分/回)の授業のうち、最後の3回(ただし、最後の1回は自習)の授業として実施した。 全授業終了後のアンケート調査として、「この授業で何を学んだか。もっとも興味深かったものは何か。」という質問をおこなった。そこでの回答の一部を以下に紹介する。 • 一番興味深かったのは、やはりプログラミング演習である。プログラミングをする ことで、自分の都合のいいように問題を処理することができる楽しさを学んだ。 • パソコンについて無知だったけれど、少しはわかるようになりました。特に、プロ グラミングが全く出来なかったのに先週メールで提出したプログラムの課題や、今 日のテストのプログラムが一人で出来て、エラーもなく実行できたので嬉しかった です。 • 興味深かったものは、プログラミングです。センター試験の数学IA の問題が解け るのかなと思えてきたからです。 • PENを使った作業は新鮮で面白かった。PENは本当におもしろかったと思う。パ ズルみたいだった。最も興味深かったものとして、プログラミングを挙げたものが、全34名中12名いたことは特筆に値する。 上記の意見の多くは、プログラミングそのものに対する興味を示すものであり、PENを使ったことが、直接的に影響しているとは必ずしも言えないが、プログラミングに興味を引き付ける役割りの一部を果たしているものと推測している。 20
  25. 25. 6 おわりに プログラム入力支援機能やプログラムの実行状況の表示機能などを備えた初学者向けプログラミング学習環境 PEN を作成した。SOLAR-CATSに組込んだPENを使用し、利用者の操作履歴を収集・解析し、PENの有効性についての評価実験を行った。今回の被験者は、いずれもプログラミング、および、キーボード入力に習熟しており、実際のプログラミング教育においての有効性を検証するまでには至っていない。今後、プログラミング初学者に対して、同様の実験を行い、PENの有効性を検証していく予定である。また、実際のプログラミング教育での使用経験を積み重ねて、PENの改良に努めたい。 21
  26. 26. 謝辞 本研究を行うにあたって、研究の方法、展開、論文の執筆に至るまで多大なるご指導とご協力を頂きました、大阪市立大学大学院創造都市研究科の松浦敏雄教授に心より感謝いたします。研究を進める上で、多くの有益な御助言と御支援を頂いた大阪市立大学大学院創造都市研究科の中野秀男教授、安倍広多助教授、石橋勇人助教授、大西克実助教授に感謝いたします。研究の方法、PENの実装・評価にご協力を頂きました、大阪学院大学情報学部の西田知博講師に感謝いたします。また、SOLAR–CATSへのPENの組み込みに御協力頂いた鹿児島大学総合情報処理センターの山之上卓教授に感謝いたします。 22
  27. 27. 参考文献 [1] 情報処理学会情報処理教育委員会 : “日本の情報教育・情報処理教育に関する提言 2005”, (2005-10). [2] 中村亮太, 松浦敏雄, 西田知博 : “初心者向きアルゴリズム学習環境の構築”, 2004 PC Conference, pp.102-103 (2004-08). [3] 中村亮太, 西田知博, 松浦敏雄:“プログラミング環境PEN−入試用言語TUATLEへ の対応”, 2005 PC Conference, pp. 343-344 (2005-08). [4] 西田 知博, 中村 亮太, 松浦 敏雄 : “入力支援機能を備えた初学者用プログラミング 環境PEN”, IPSJ SIGCE SSS2005, pp.155-156 (2005-08). [5] 中村亮太, 西田知博, 松浦敏雄:“プログラミング入門教育用学習環境PEN”, 情報処 理学会研究報告, 2005-CE-81 (2005-10). [6] 西田 知博, 中村 亮太, 松浦 敏雄 : “初学者用プログラミング環境PEN”, 情報処理教 育研究集会, pp.467-470 (2005-11). [7] 初 学 者 向 け プ ロ グ ラ ミ ン グ 学 習 環 境 PEN : http://www.media.osaka- cu.ac.jp/PEN/, (2006-02). [8] 兼宗進, 中谷多哉子, 御手洗理英, 福井眞吾, 久野靖 : “初中等教育におけるオブジェ クト指向プログラミングの実践と評価”, 情報処理学会論文誌, Vol.44, No.SIG13, pp58-71 (2003) . [9] 長慎也, 甲斐宗徳, 川合晶, 日野孝昭, 前島真一, 筧捷彦 : “Nigari - Java言語へも移行 しやすい初心者向けプログラミング言語”, 情報処理学会研究報告「コンピュータと 教育」, No.071 , pp.13-20 (2003) .[10] “一般情報処理教育の実態に関する調査研究”, (文部省委嘱調査研究) 情報処理学会, 一般情報処理教育の実態に関する調査研究委員会 (1992-03).[11] 原田 悦子: “文科系大学・学部における情報教育∼その目的と問題∼”, 情報処理, Vol.41, No.3, pp.227-233 (2000-03).[12] “大学等における一般情報処理教育の在り方に関する調査研究”, (文部科学省委嘱調 査研究) 情報処理学会, 大学等における一般情報処理教育の在り方に関する調査研究 委員会 (2002-03).[13] 大学入試センター: “センター試験用手順記述標準言語 —DNCL—”, 平成15年度セ ンター試験 試験問題評価委員会報告書, pp.258-259 (2003).[14] 中森眞理雄, 中條拓伯, 小谷善行, 辰己丈夫, 金子敬一, 並木美太郎, 品野勇治: “平成 18 年度入試に向けての「情報」試行試験の実施報告(2)”, 情報処理学会第46回プログ ラミングシンポジウム報告集, pp.173-180 (2005-01). 23
  28. 28. [15] 山之上 卓: “多数の端末上のアプリケーション操作の記録再生を行う教育支援システ ム”, IPSJ SIGCE SSS2005, pp.61-68 (2005-08).[16] JavaCC: https://javacc.dev.java.net/, (2006-01).[17] 五月女健治: JavaCC コンパイラ・コンパイラ for Java, テクノプレス, (2003). 24
  29. 29. 付録 A PEN クイックリファレンス1. 基本画面 (a) 編集画面 プログラムのソースコードを入力するエリアです。 (b) コンソール画面 プログラム中の出力はこの画面に表示されます。また、入力もこの画面から行います。 タブの操作により表示方法の異なる「実行画面」と「履歴」に切り替えられます。 • 実行画面 : 実行中もしくは実行直後のコンソールが表示されます。 • 履歴 : 今までの実行した結果の全てが表示されます。 (c) 変数表示画面 データ型、変数名と、変数に代入されている値が表示されます。 プログラム実行時に変数の値の変化を観察することができます。 (d) プログラム入力支援ボタン プログラムの入力を補助するためのボタンです。 「もし∼そうでなければ」のボタンで入力されるコード もし ≪条件式≫ ならば  | を実行し,そうでなければ  | を実行する ≪条件式≫など≪≫に囲まれた部分にカーソルを移動すると≪≫の部分全体が選択され、 そこに書くべき式などに簡単に書き換えることができます。 1
  30. 30. 2. 実行時の画面 (a) 実行制御ボタン 状態表 意味 実行 プログラムを実行する場合はこのボタンを押します。プログラム実行中は「一時停止」 ボタンに変化します。実行する速度は「実行速度調整スライダー」で変化させることが できます。 始めから実行 実行ボタンと同じ。 一時停止 プログラム実行中に押すと実行を一時停止することができます。一時停止時は、 「再開」 のボタンに変化します。 再開 一時停止状態から実行を再開したい場合に使用します。再開後は、「一時停止」のボタ ンに変化します。 一行実行 「実行箇所マーカー」のある行を実行し、その後、一時停止状態になります。 始めに戻る プログラムの実行を取り止め、プログラムの最初に戻ります。 (b) 実行速度調整スライダー プログラムの実行速度を変更するためのスライダーです。 バーをゲージの左側に移動すると実行速度が速くなり、右側に移動すると遅くなります。 (c) 状態表示 状態表 意味 実行待ち プログラムを実行していない状態。プログラムの編集が可能。 実行中 通常にプログラムを実行している状態。 一時停止中 「一時停止」や「一行実行」によって実行が停止されている状態。 入力待ち プログラム内の入力文による入力待ち状態。入力はコンソール画面に行う。 実行終了 プログラムの実行が終了した状態。再度、プログラムを実行する場合は「始めから実 行」で行う。また状態を「実行待ち」に初期化するには「始めに戻る」で行う。 (d) 実行箇所マーカー これから実行する行を指し示しています。 この場面では 7 行目を実行する直前の状態になります 2
  31. 31. 付録 B xDNCL 言語マニュアル xDNCL は大学入試センターの「情報関係基礎」で用いられている試験用手順記述標準言語 DNCL に準拠しており、一部拡張したものである。1 型宣言 • 変数を使用する場合は、前もって変数の型を宣言しなければならない。 • 使用できる変数の型は「整数」 「実数」「文字列」の 3 種類である。 • 変数名は半角英字から始まり、2 文字目からは半角英数字のみが使用できる。 • 整数型の定数は、少数点を含めてはいけない (例: 12, –4)。 • 実数型の定数は、少数点を含めなければならない (例: 12.0, –4.0)。 • 整数型の変数の初期値は 0, 実数型の場合は 0.0, 文字列型の場合は NULL(空の文字列) である。 整数 ≪変数≫ , ≪変数≫ , ... , ≪変数≫ 実数 ≪変数≫ , ≪変数≫ , ... , ≪変数≫ 文字列 ≪変数≫ , ≪変数≫ , ... , ≪変数≫ 使用例 整数 i, j, k /* 変数名 i, j, k は整数型の変数であると宣言 */ 実数 x, y /* 変数名 x, y は実数型の変数であると宣言 */ 文字列 str /* 変数名 str は文字列型の変数であると宣言 */ 2 配列 整数型 count, 実数型 pos という変数名の配列を宣言する例 整数 count[5] /* count[0]∼count[5] までの 6 つの変数領域を確保 */ 実数 pos[10]  /* pos[0]∼pos[10] まで 11 個の変数領域を確保 */ 次元以上の配列を宣言する例 2 整数 case[8, 8] /* 9 × 9 の変数領域を確保する */ 実数 real[2, 3, 5] /* 3 × 4 × 6 の変数領域を確保する */ 1
  32. 32. 3 演算子3.1 算術演算子 下記の算術演算子が利用できる。 演算子 意味 例 式の値 +, + 加算 8+3 8 に定数 3 を加えた値 ( =11) −, – 減算 x–2 変数 x の値から 2 を引いた値 ×, * 積算 y * 1.5 変数 y の値を 1.5 倍した値 ÷, / 除算 z/2 変数 z の値を 2 で割った値 %, % 剰余 z%5 変数 z の値を 5 で割った余りの値3.2 比較演算子 下記の比較演算子が利用できる。 演算子 意味 使用例 式の値 =, = 等しい x=0 x が 0 ならば真, それ以外ならば偽 >, より大きい y>5 y が 5 より大きければ真, 以下なら偽 ≧, = 以上 y≧5 y が 5 以上ならば真, ちいさければ偽 <, より小さい z < 1.2 z が 1.2 より小さければ真, 以上なら偽 ≦, = 以下 z ≦ 1.2 z が 1.2 以下ならば真, 大きければ偽 ≠, != 等しくない z≠6 z が 6 以外ならば真, 同じであれば偽3.3 論理演算子 下記の論理演算子が利用できる。 演算子 意味 使用例 式の値 かつ 積集合 a ≧ 0 かつ a ≦ 10 a が 0 以上 かつ 10 以下ならば真, そ れ以外は偽 または 和集合 b < 0 または b > 100 b が 0 未満 または 100 より大きけれ ば真, それ以外は偽 でない 否定 c = 5 でない c が 5 でないなら真, 5 ならば偽 2
  33. 33. 3.4 演算結果のデータ型について 演算結果のデータ型は演算対象のデータ型によって決まる。なお、演算前に演算結果のデータ型に変換してから、演算が行われる。 演算例 演算結果のデータ型 整数 + 整数 整数 実数 + 整数 実数 実数 + 実数 実数 文字列 + 整数 文字列として、文字列結合される 文字列 + 実数 文字列として、文字列結合される 文字列 + 文字列 文字列として、文字列結合される4 出力文4.1 改行あり出力 ≪出力文≫ を印刷する ≪出力文≫で指定された変数や文字列をコンソール画面に表示し、その後改行する。4.2 改行なし出力 ≪出力文≫ を改行なしで印刷する ≪出力文≫で指定された変数や文字列をコンソール画面に表示し、その後改行をしない。4.3 複数の変数・文字列の出力 変数や文字列を一緒に出力する場合、それらを「と」で結び列挙する。 使用例 変数 ans が 50 の場合の出力例 「答えは」 と ans と 「です」 を印刷する 答えは 50 です 5 代入文5.1 代入 ≪変数≫ ← ≪式≫ ≪式≫に書かれた定数や式の演算結果を≪変数≫に指定された変数へ代入する。なお、右辺の≪式≫の値の型のいかんに関わらず、代入によって、左辺の≪変数≫のデータ型に自動変換される。≪式≫の演算結果が実数型で、左辺の≪変数≫が整数型の場合、小数点以下は切り捨てられる。 3
  34. 34. 5.2 入力 ≪変数≫ ← input() input() で キーボードからの入力が文字列として代入される。左辺の≪変数≫のデータ型に合わせて型変換が行われる。6 組み込み関数6.1 文字列操作関数 書式 意味 使用例 戻り値 戻り値のデータ型 length(str) str の文字列の長さを length(”PEN”) 3 整数型 返す substring(str, i) str の i+1 文字目以降 substring(”smiles”, 3) les 文字列型 最後までの文字列を 返す substring(str, i, j) str の i+1 文字目から substring(”smiles”, 1, 5) mile 文字列型 j 文字目までの文字列 を返す insert(str1, i, str2) str1 の n 文字目に str2 insert(”abc”, 2, ”123”) ab123c 文字列型 を挿入 replace(str1, i, j, str2) str1 の i から j 文字目 replace(”abc”, 1, 2, ”123”) a123c 文字列型 を str2 で書き換え extract(str1, str2, i) str1 を str2 の文字列で extract(”a:b:c”, ”:”, 2) c 文字列型 区切り, i 個目の文字 を返す • 引数 str のデータ型は 文字列型 でなければならない • 引数 i, j のデータ型は 整数型 でなければならない 4
  35. 35. 6.2 数学関数 書式 意味 使用例 戻り値 戻り値のデータ型 random(x) 0∼x の乱数の値を返す random(10) 0∼10 の値を返す 整数型 floor(x) x の小数点以下 切り捨て floor(24.64) 24.0 実数型 ceil(x) x の小数点以下 切り上げ ceil(24.64) 25.0 実数型 round(x) x の小数点以下 四捨五入 round(24.64) 25 整数型 abs(x) x の絶対値 abs(-234) 234 引数と同じ int(x) x の型を「整数」に変換 int(10.2345) 10 整数型 sin(x) 角度 x の正弦を返す sin(95.0) 0.683261714736121 実数型 cos(x) 角度 x の余弦を返す cos(50) 0.15425144988758405 実数型 tan(x) 角度 x の正接を返す tan(70) 1.2219599181369434 実数型 sqrt(x) x の平方根の値を返す sqrt(5) 2.23606797749979 実数型 log(x) x の自然対数値 (底は e) log(2) 0.6931471805599453 実数型 を返す • 引数 x のデータ型は 実数型 であるが、 整数型 で渡した場合、 実数型 に型変換されて取り扱われる • abs(x) の戻り値のデータ型は、引数のデータ型によって決定される7 条件分岐7.1 1 分岐の条件文 (if∼then 文) もし ≪条件式≫ ならば | <処理> を実行する ≪条件式≫が成立した場合、<処理>を実行する。成立しない場合は「を実行する」の次の行へ進む。 使用例 もし x = 10 ならば | 「条件が成立しました」を印刷する を実行する 「終了」を印刷する 変数 x が 10 の場合の出力例 変数 x が 5 の場合の出力例 条件が成立しました 終了 終了 5
  36. 36. 7.2 2 分岐の条件文 (if∼then∼else 文) もし ≪条件式≫ ならば | <処理 1 > を実行し,そうでなければ | <処理 2 > を実行する ≪条件式≫が成立した場合、<処理 1 >を実行し、成立しない場合は<処理 2 >を実行する。 使用例 もし x = 20 ならば | 「条件が成立しました」を印刷する を実行し,そうでなければ | 「条件が成立しませんでした」を印刷する を実行する 変数 x が 20 の場合の出力例 変数 x が 10 の場合の出力例 条件が成立しました 条件が成立しませんでした 7.3 多分岐の条件文 (else∼if 文) もし ≪条件式 1 ≫ ならば | <処理 1 > を実行し,そうでなくもし ≪条件式 2 ≫ ならば | <処理 2 > を実行し,そうでなければ | <処理 3 > を実行する ≪条件式 1 ≫が成立した場合、<処理 1 >を実行し、成立しなくて≪条件式 2 ≫が成立した場合、<処理 2 >を実行し、成立しない場合は<処理 3 >を実行する。 使用例 1 もし x = 80 ならば | 「x は 80 以上です」を印刷する を実行し,そうでなくもし x = 60 ならば | 「x は 79∼60 の間です」を印刷する を実行し,そうでなければ | 「x は 59 以下です」を印刷する を実行する 変数 x が 95 の場合の出力例 変数 x が 70 の場合の出力例 変数 x が 30 の場合の出力例 x は 80 以上です x は 79∼60 の間です x は 59 以下です 6
  37. 37. 使用例 2 もし x = 80 ならば | 「x は 80 以上です」を印刷する を実行し,そうでなくもし x = 70 ならば | 「x は 79∼70 の間です」を印刷する を実行し,そうでなくもし x = 60 ならば | 「x は 69∼60 の間です」を印刷する を実行し,そうでなければ | 「x は 59 以下です」を印刷する を実行する 変数 x が 85 の場合の出力例 変数 x が 75 の場合の出力例 x は 80 以上です x は 79∼70 の間です 変数 x が 62 の場合の出力例 変数 x が 25 の場合の出力例 x は 69∼60 の間です x は 59 以下です 8 繰り返し8.1 前条件判定の繰り返し文 (while-do 文) ≪条件式≫ の間, | <処理> を繰り返す ≪条件式≫が成立していれば、<処理>を実行する。<処理>の実行終了後、再び≪条件式≫の判定を行い、成立すれば<処理>を再び実行し、これを繰り返す。≪条件式≫が成立しない場合は「を繰り返す」の次の行へ進む。 使用例 変数 x が 1 の場合の出力例 x 5 の間, 1 | x を印刷する 2 | x ← x + 1 3 を繰り返す 4 8.2 後条件判定の繰り返し文 (repeat-unil 文) 繰り返し, | <処理> を, ≪条件式≫ になるまで実行する <処理>を実行した後、≪条件式≫の判定を行う。条件式が成立していなければ、<処理>を再び実行し、成立した場合は次の行へ進む。 7
  38. 38. 変数 x が 1 の場合の出力例 使用例 1 繰り返し, 2 | x を印刷する 3 | x ← x + 1 4 を, x 5 になるまで実行する 5 8.3 範囲指定の加算型繰り返し文 (for 文) ≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪増加値≫ ずつ増やしながら, | <処理> を繰り返す ≪変数≫の部分に指定されたループ変数に≪数値 1 ≫の値を代入し<処理>を実行する。<処理>の実行後、ループ変数に≪増加値≫の値を加算し、ループ変数の値が≪数値 2 ≫になるまで繰り返す。 出力例 使用例 1 x を 1 から 5 まで 1 ずつ増やしながら, 2 | x を印刷する 3 を繰り返す 4 5 8.4 範囲指定の減算型繰り返し文 (for 文) ≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪減少値≫ ずつ減らしながら, | <処理> を繰り返す ≪変数≫の部分に指定されたループ変数に≪数値 1 ≫の値を代入し<処理>を実行する。<処理>の実行後、ループ変数から≪減少値≫の値を減算し、ループ変数の値が≪数値 2 ≫になるまで繰り返す。 出力例 使用例 5 x を 5 から 1 まで 1 ずつ減らしながら, 4 | x を印刷する 3 を繰り返す 2 1 8
  39. 39. 付録 C 付録:文法のゆらぎ初学者向けプログラミング学習環境 PEN では、よくある入力間違いによるプログラムの記述ミスを、文法エラーとせずに受理し、実行できるようにしています。 ( ) や [ ] の意味 • ( a | b ) : a または b を受理する • abc[ def ] : abc または abcdef を受理する 改行あり出力 ≪出力文≫ を ( 印刷 | 出力 ) する 改行なし出力 ≪出力文≫ を改行 ( なし | 無し ) で ( 印刷 | 出力 ) する 1 分岐の条件文 (if∼then 文) もし ≪条件式≫ ( ならば | なら ) | <処理> を実行 [する] 2 分岐の条件文 (if∼then∼else 文) もし ≪条件式≫ ( ならば | なら ) | <処理 1 > を実行し,そうで ( なければ | ないなら | ないならば ) | <処理 2 > を実行 [する] 多分岐の条件文 (else∼if 文) もし ≪条件式 1 ≫ ならば | <処理 1 > を実行し,( そうでなく | そうでなくて ) もし ≪条件式 2 ≫ ( ならば | なら ) | <処理 2 > を実行し,そうで ( なければ | ないなら | ないならば ) | <処理 3 > を実行 [する] 1
  40. 40. 前条件判定の繰り返し文 (while-do 文) ≪条件式≫ の間, | <処理>を ( 繰り返す | 繰返す ) 後条件判定の繰り返し文 (repeat-unil 文) ( 繰り返し | 繰返し ), | <処理>を, ≪条件式≫ になるまで実行 [する] 範囲指定の加算型繰り返し文 (for 文) ≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪増加値≫ ずつ増やし ( ながら | つつ ), | <処理>を ( 繰り返す | 繰返す ) 範囲指定の減算型繰り返し文 (for 文) ≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪減少値≫ ずつ減らし ( ながら | つつ ), | <処理>を ( 繰り返す | 繰返す ) 2
  41. 41. 付録D すべてのパッケージの すべてのパッケージの階層 パッケージクラス階層クラス階層 class java.lang.Object class BreakPointMouseListener (implements java.awt.event.MouseListener) class ButtonEdit - 入力支援ボタン定義ファイルから入力支援ボタンを配置するためのクラ ス class ClipBoard (implements java.awt.datatransfer.ClipboardOwner) - システムのクリップボードに渡された文字列を格納するクラス class java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable) class java.awt.Container class javax.swing.JComponent (implements java.io.Serializable) class javax.swing.AbstractButton (implements java.awt.ItemSelectable, javax.swing.SwingConstants) class javax.swing.JButton (implements javax.accessibility.Accessible) class EditButton class MenuButton class javax.swing.JMenuItem (implements javax.accessibility.Accessible, javax.swing.MenuElement) class javax.swing.JMenu (implements javax.accessibility.Accessible, javax.swing.MenuElement) class MyJMenu class MyJMenuItem class javax.swing.JLabel (implements javax.accessibility.Accessible, javax.swing.SwingConstants) class MyJLabel class javax.swing.JMenuBar (implements javax.accessibility.Accessible, javax.swing.MenuElement) class MyJMenuBar class javax.swing.JPanel (implements javax.accessibility.Accessible) class IntVgOutputWindow - さまざまな描画をおこなうJPanelを拡張したクラ ス class MyRunJLabel
  42. 42. - JLabelクラスを拡張した状態表示ラベルクラスclass ConsoleAppend- コンソール画面の「実行画面」と「履歴」に文字列を追加するクラスclass ConsoleCopyButtonListener (implementsjava.awt.event.ActionListener)- メニュー - 編集 - 実行画面をコピーを実現しているクラスclass EditAreaAddTab- インデントの個数を数え追加すべきインデントを返すクラスclass EditAreaMouseListener (implements java.awt.event.MouseListener)class EditAreaUndoableEditListener (implementsjava.awt.event.ActionListener, javax.swing.event.UndoableEditListener)class EditButtonListclass EditSelectionclass ExitButtonListener (implements java.awt.event.ActionListener)class FileDropOpen (implements java.awt.dnd.DropTargetListener)class javax.swing.filechooser.FileFilter class PenFileFilterclass FileOpenclass FileOpenButtonListener (implementsjava.awt.event.ActionListener)class FileSaveclass FileSaveButtonListener (implements java.awt.event.ActionListener)class HelpPenButtonListener (implements java.awt.event.ActionListener)class IntVExecuter (implements IntVParserVisitor)- IntVParserクラスによって生成した構文木の各ノードの処理を記述したクラスclass IntVFileIO- xDNCLのファイルI/Oの命令を処理や、ファイルIDの管理を行っているクラスclass IntVParser (implements IntVParserConstants,IntVParserTreeConstants)- xDNCL言語を入力とて字句解析と構文木生成をクラスclass IntVParserTokenManager (implements IntVParserConstants)class MainGUI- PENのGUIを配置するクラスclass MyRunnable (implements java.lang.Runnable)class PENclass RunCleanclass RunStopclass RunTimeChangeListener (implementsjavax.swing.event.ChangeListener)class RunTimeMouseListener (implements java.awt.event.MouseListener)class SimpleCharStreamclass SimpleNode (implements Node)- 構文木のノード(AST~クラス)のスーパークラス class ASTAbs class ASTAddNode class ASTANDNode class ASTArray
  43. 43. class ASTArrayNumclass ASTAssignStatclass ASTAssignStatsclass ASTASTAssignStatclass ASTBlockclass ASTCeilclass ASTCosineclass ASTDeclclass ASTDivNodeclass ASTDoWhileStatclass ASTDoWhileStat2class ASTElseIfStatclass ASTEOF_STRclass ASTEQNodeclass ASTErrorOccurclass ASTExtractclass ASTFile_closeclass ASTFile_flushclass ASTFile_getlineclass ASTFile_getstrclass ASTFile_isfileclass ASTFile_openaclass ASTFile_openrclass ASTFile_openwclass ASTFile_putlineclass ASTFile_putstrclass ASTFile_removeclass ASTFile_renameclass ASTFloatLiteralclass ASTFloorclass ASTForStatclass ASTForStatAddclass ASTFunctionclass ASTFunctionCallclass ASTFunctionVarclass ASTgColorclass ASTgDrawArcclass ASTgDrawBoxclass ASTgDrawLineclass ASTgDrawOvalclass ASTgDrawPointclass ASTGENodeclass ASTGetclass ASTGetStatclass ASTgFillArcclass ASTgFillBoxclass ASTgFillOvalclass ASTgFillPointclass ASTGTNode
  44. 44. class ASTgWindowClose class ASTgWindowOpen class ASTIdent class ASTIfStat class ASTInsert class ASTInt class ASTIntVUnit class ASTLength class ASTLENode class ASTLiteral class ASTLog class ASTLSNode class ASTMinNode class ASTMulNode class ASTNOTNode class ASTNTNode class ASTORNode class ASTPutStat class ASTRandom class ASTRepeatUntil class ASTReplace class ASTReturn class ASTRound class ASTSine class ASTSqrt class ASTStrlit class ASTSubNode class ASTSubstring class ASTSurNode class ASTTangent class ASTVarDecl class ASTWhileStat class java.lang.Throwable (implements java.io.Serializable) class java.lang.Error class ThreadRunStop class TokenMgrError class java.lang.Exception class ParseException class Token class VarCopyButtonListener (implements java.awt.event.ActionListener) class java.awt.event.WindowAdapter (implements java.awt.event.WindowFocusListener, java.awt.event.WindowListener, java.awt.event.WindowStateListener) class MyWindowAdapterインタフェース階層インタフェース階層 interface IntVParserConstants
  45. 45. interface IntVParserTreeConstantsinterface IntVParserVisitorinterface Node
  46. 46. 付録E BNF記法によるxDNCL言語の BNF記法によるxDNCL言語の文法定義 記法によるxDNCL言語 IntVUnit ::= ( ( VarDecl | Function | Stat | EOF | ErrorOccur ) )* ErrorOccur ::= java code Function ::= ( FUNCTION ( VARINT | VARFLOAT | VARSTRING ) IDENT LP ( FunctionVar )? RP ( VarDecl | Stat )* ENDFUNCTION | PROCEDURAL IDENT LP ( FunctionVar )? RP ( VarDecl | Stat )* ENDPROCEDURAL )FunctionVar ::= ( VARINT | VARFLOAT | VARSTRING ) Decl ( CM FunctionVar )? VarDecl ::= ( VARINT | VARFLOAT | VARSTRING ) Decl ( CM Decl )* Decl ::= IDENT ( LD Array RD )? Array ::= AddExpr ( CM Array )? Stat ::= AssignStats | IfStat | WhileStat | RepeatUntil | ForStat | PutStat | Return | gWindowOpen | gWindowClose | gColor | gDrawOval | gDrawPoint | gFillOval | gFillPoint | gDrawLine | gDrawBox | gFillBox | gDrawArc | gFillArc | File_close | File_putstr | File_putline | File_flush | File_rename
  47. 47. | File_remove | FunctionCall | SM AssignStats ::= AssignStat ( CM AssignStat )* AssignStat ::= Ident ASGNOP AddExpr IfStat ::= IF Cond ( AssignStats | PutStat | SM ( Stat )* ( ( ELSE ( Stat )* | ElseIfStat ) )? ENDIF ) ElseIfStat ::= ELSEIF IF Cond SM ( Stat )* ( ( ELSE ( Stat )* | ElseIfStat ) )? WhileStat ::= Cond WHILE ( Stat )* ENDLOOP RepeatUntil ::= DOWHILE ( Stat )* DOWHILE2 Cond DOWHILE3 ForStat ::= Ident FOR AddExpr FOR2 AddExpr FOR3 ForStatAdd ( Stat )* ENDLOOP ForStatAdd ::= ( AddExpr FOR4 )? ( FORADD | FORSUB ) GetStat ::= GET LP Ident RP PutStat ::= PutParam ( CM2 PutParam )* ( PUT | PUTLN ) PutParam ::= AddExpr Block ::= LC ( Stat )* RC Cond ::= ORExpr ORExpr ::= AndExpr ( OROP Cond )? AndExpr ::= NotExpr ( ANDOP AndExpr )? NotExpr ::= EqualityExpr ( NOTOP )? EqualityExpr ::= RelationalExpr ( EQOP EqualityExpr | NTOP EqualityExpr )?RelationalExpr ::= AddExpr ( LSOP RelationalExpr | GTOP RelationalExpr | LEOP RelationalExpr | GEOP RelationalExpr )? AddExpr ::= MulExpr ( ADDOP MulExpr | SUBOP MulExpr )* MulExpr ::= UnExpr ( MULOP UnExpr | DIVOP UnExpr | SUROP UnExpr )* UnExpr ::= PrimExpr | SUBOP UnExpr PrimExpr ::= Literal | FloatLiteral | Strlit | EOF_STR | FunctionExpr | Ident | LP Cond RP FunctionExpr ::= Get | Random | Sine | Cosine
  48. 48. | Tangent | Sqrt | Floor | Ceil | Round | Abs | Log | Int | Length | Substring | Insert | Replace | Extract | File_openr | File_openw | File_opena | File_getstr | File_getline | File_isfile Get ::= GET RP Random ::= RANDOM AddExpr RP Sine ::= SIN AddExpr RP Cosine ::= COS AddExpr RP Tangent ::= TAN AddExpr RP Sqrt ::= SQRT AddExpr RP Floor ::= FLOOR AddExpr RP Ceil ::= CEIL AddExpr RP Round ::= ROUND AddExpr RP Abs ::= ABS AddExpr RP Log ::= LOG AddExpr RP Int ::= INT AddExpr RP Length ::= LENGTH AddExpr RP Substring ::= SUBSTRING AddExpr CM AddExpr ( CM AddExpr )? RP Insert ::= INSERT AddExpr CM AddExpr CM AddExpr RP Replace ::= REPLACE AddExpr CM AddExpr CM AddExpr CM AddExpr RP Extract ::= EXTRACT AddExpr CM AddExpr CM AddExpr RPgWindowOpen ::= gWindowOpen AddExpr CM AddExpr RPgWindowClose ::= gWindowClose RP gColor ::= gColor AddExpr CM AddExpr CM AddExpr RP
  49. 49. gDrawOval ::= gDrawOval AddExpr CM AddExpr CM AddExpr CM AddExpr RP gDrawPoint ::= gDrawPoint AddExpr CM AddExpr RP gFillOval ::= gFillOval AddExpr CM AddExpr CM AddExpr CM AddExpr RP gFillPoint ::= gFillPoint AddExpr CM AddExpr RP gDrawLine ::= gDrawLine AddExpr CM AddExpr CM AddExpr CM AddExpr RP gDrawBox ::= gDrawBox AddExpr CM AddExpr CM AddExpr CM AddExpr RP gFillBox ::= gFillBox AddExpr CM AddExpr CM AddExpr CM AddExpr RP gDrawArc ::= gDrawArc AddExpr CM AddExpr CM AddExpr CM AddExpr CM AddExpr CM AddExpr CM AddExpr RP gFillArc ::= gFillArc AddExpr CM AddExpr CM AddExpr CM AddExpr CM AddExpr CM AddExpr CM AddExpr RP File_openr ::= OPENR AddExpr RP File_openw ::= OPENW AddExpr RP File_opena ::= OPENA AddExpr RP File_close ::= CLOSE AddExpr RP File_getstr ::= GETSTR AddExpr CM AddExpr RP File_getline ::= GETLINE AddExpr RP File_putstr ::= PUTSTR AddExpr CM AddExpr RP File_putline ::= PUTLINE AddExpr CM AddExpr RP File_flush ::= FLUSH AddExpr RP File_isfile ::= ISFILE AddExpr RP File_rename ::= RENAME AddExpr CM AddExpr RP File_remove ::= REMOVE AddExpr RP Ident ::= IDENT ( LD ArrayNum RD | LP ( AddExpr ( CM AddExpr )* )? RP )? ArrayNum ::= AddExpr ( CM ArrayNum )?FunctionCall ::= IDENT LP ( AddExpr ( CM AddExpr )* )? RP Return ::= AddExpr RETURN Literal ::= LITERAL FloatLiteral ::= FLOAT_LITERAL Strlit ::= STRLIT EOF_STR ::= ( EOF_STR | NULL_STR )
  50. 50. 付録 F xDNCL 言語の JJTree 形式による構文定義options { STATIC=false; UNICODE_INPUT=true; DEBUG_PARSER=true; MULTI=true; VISITOR=true;}PARSER_BEGIN(IntVParser)import java.util.Hashtable;public class IntVParser { Hashtable symTable = new Hashtable(); public int nParseErrors = 0;}PARSER_END(IntVParser)TOKEN_MGR_DECLS :{ public int nLexicalErrors = 0;}SKIP :{ | t// | n | r | f | | | | |  }TOKEN :{ ADDOP: + | + | SUBOP: - | - | MULOP: × | * | DIVOP: ÷ | / | SUROP: % | % | ASGNOP: ← | := | INOP: - | EQOP: = | = | GTOP: > | | GEOP: ≧ | = | LSOP: < | | LEOP: ≦ | = | NTOP: ≠ | != | ANDOP: かつ 付録 F -1/17-
  51. 51. | OROP: または | NOTOP: でない | LC: { | RC: } | LD: [ | RD: ] | LP: ( | RP: ) | SM: n | CM: , | , | 、 | CM2: と | PN: . | EOF_STR: EOF | NULL_STR: NULL }TOKEN [IGNORE_CASE] :{ VARINT: 整数 | VARFLOAT : 実数 | VARSTRING : 文字列 | PROCEDURAL : 手続き | ENDPROCEDURAL : 手続き終了 | FUNCTION : 関数 | ENDFUNCTION : 関数終了 | RETURN : を返す | IF : もし | ENDIF : を ( 実行する | 実行 ) | THEN : ( ならば | なら ) | ELSE : を実行し CM そうで ( なければ | ないなら | ないならば ) | ELSEIF : を実行し CM ( そうでなく | そうでなくて ) | WHILE : の間 CM | DOWHILE : ( 繰り返し | 繰返し ) CM | DOWHILE2 : を CM | DOWHILE3 : になるまで ( 実行する | 実行 ) | FOR : を | FOR2 : から | FOR3 : まで | FOR4 : ずつ | FORADD : 増やし ( ながら | つつ ) CM | FORSUB : 減らし ( ながら | つつ ) CM | ENDLOOP : を ( 繰り返す | 繰返す ) | PUTLN : を (印刷 | 出力 ) する | PUT : を改行 (なし | 無し) で (印刷 | 出力 ) する | GET : input LP | RANDOM : random LP | SIN : sin LP | COS : cos LP | TAN : tan LP | SQRT : sqrt LP | FLOOR : floor LP | CEIL : ceil LP 付録 F -2/17-
  52. 52. | ROUND : round LP | ABS : abs LP | INT : int LP | LOG : log LP | LENGTH : length LP | SUBSTRING : substring LP | INSERT : insert LP | REPLACE : replace LP | EXTRACT : extract LP | gWindowOpen : gWindowOpen LP | gWindowClose : gWindowCloseLP | gColor : gColor LP | gDrawOval : gDrawOval LP | gDrawPoint : gDrawPoint LP | gFillOval : gFillOval LP | gFillPoint : gFillPoint LP | gDrawLine : gDrawLine LP | gDrawBox : gDrawBox LP | gFillBox : gFillBox LP | gDrawArc : gDrawArc LP | gFillArc : gFillArc LP | OPENR : openr LP | OPENW : openw LP | OPENA : opena LP | CLOSE : close LP | GETSTR : getstr LP | GETLINE : getline LP | PUTSTR : putstr LP | PUTLINE : putline LP | FLUSH : flush LP | ISFILE : isfile LP | RENAME : rename LP | REMOVE : remove LP }TOKEN :{ #DIGIT: [ 0-9] | #LETTER: [ a-z, A-Z, _ ] }TOKEN :{ LITERAL: (DIGIT)+ | FLOAT_LITERAL: LITERAL (PN LITERAL) | IDENT: LETTER (LETTER|DIGIT)* { int idx; int len = image.length(); if (!Character.isJavaIdentifierStart(image.charAt(0))) { ++nLexicalErrors; new ConsoleAppend( ### + matchedToken.beginLine + 行目で + エラーです : + matchedToken.image.charAt(0) + ( + Integer.toHexString(matchedToken.image.charAt(0)) + )n 付録 F -3/17-
  53. 53. ); } for (idx = 1; idx len; ++idx) { if (!Character.isJavaIdentifierPart(image.charAt(idx))) { ++nLexicalErrors; new ConsoleAppend( ### + matchedToken.beginLine + 行目で + エラーです : + matchedToken.image.charAt(idx) + ( + Integer.toHexString(matchedToken.image.charAt(idx)) + )n ); } } }}MORE:{ | 「 :STR}STRTOKEN:{ STRLIT: | 」 |rn { if ( (image.charAt(0) == image.charAt(image.length()-1) == ) || (image.charAt(0) == 「 image.charAt(image.length()-1) == 」) ){ matchedToken.image = image.substring(1, image.length()-1); }else{ ++nLexicalErrors; matchedToken.image = image.substring(1, image.length()-2); new ConsoleAppend( ### + matchedToken.beginLine + 行目の + 出力文で[] か[ 」]を忘れていませんか?n ); } } :DEFAULT}STRMORE:{ | 」 | 「 { image.deleteCharAt(image.length() - 2); }}STRMORE:{ n { image.delete(image.length() - 2, image.length()); image.append(n); }}STRMORE:{ ~[] 付録 F -4/17-

×