SlideShare a Scribd company logo
1 of 72
Download to read offline
大阪市立大学大学院
      創造都市研究科 修士学位論文
                   修士論文
                        
                        
                        
入力支援機能を備えた日本語表記による
初学者向けプログラミング学習環境の構築
                        
Japanese-based Programming Environment for Novices
           with Coding Support Function
                         
                         
                         
                         



                    2006年1月
         大阪市立大学大学院 創造都市研究科
         都市情報学専攻 情報基盤研究分野
     M04UC507 中村亮太 (NAKAMURA,Ryota)
目次
1         はじめに                                                                                                                             1

2         プログラミング教育に必要な支援機能                                                                                                                2
    2.1   プログラミング演習の難しさ . . . . . . . . . . . . . . . . . . . . . . . .                                                                    2
    2.2   「プログラミング」入門教育の目標 . . . . . . . . . . . . . . . . . . . . .                                                                       2
    2.3   初学者用プログラミング環境として何が必要か . . . . . . . . . . . . . . .                                                                              3

3         初学者向けプログラミング学習環境 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 プログラム入力支援ボタンのカスタマイズ                                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11

4         PENの実装                                                                                                                          12
    4.1   構文定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                      13
    4.2   プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                            14
    4.3   実行制御/状態表示の遷移 . . . . . . . . . . . . . . . . . . . . . . . . . .                                                                17

5         評価                                                                                                                              18
    5.1 操作記録の解析と評価 . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
    5.2 授業での利用 . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
      5.2.1 大阪学院大学での使用例               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
      5.2.2 大阪市立大学での使用例               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20

6         おわりに                                                                                                                            21

謝辞                                                                                                                                        22

                                                  i
参考文献        23




       ii
図目次
1     PENの実行時の表示例 . . . . . . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
2     xDNCLの記述例(数当てゲーム) . . . .                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    5
3     入力支援ボタンによるプログラミング例 . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
4     インデントの自動挿入 . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
5     実行箇所マーカー . . . . . . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
6     実行速度調節バー . . . . . . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
7     プログラム入力支援ボタンのカスタマイズ例                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
8     プログラム実行系の概略 . . . . . . . . . . .                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
9     JJTreeの記述例(加算・減算) . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
10    プログラムの実行 . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
11    パーサクラスへの入力するプログラム .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
12    パーサクラス内に生成される構文木 . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
13    実行状態遷移図 . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   17


表目次
1     実行制御ボタンの一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . .                                               8
2     実行状態の一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                          9
3     JavaCCとJJTreeで使用できる正規表現の一覧 . . . . . . . . . . . . . .                                                        13
4     解析結果の平均値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                            18




                                     iii
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
2 プログラミング教育に必要な支援機能
 ここではまず、2.1において従来のプログラミング演習で初学者が直面する問題を挙げ
る。2.2では、本研究で考えるプログラミング教育の目標を明白にし、2.3では、その教育
目標を達成するためのプログラミング環境としてどのような機能が必要かについて考察
する。


2.1 プログラミング演習の難しさ
 初学者は、プログラミング演習の初期の段階でつまずくことが多い。演習初期段階では
タイプミスに起因する文法エラーが多く発生し、意味の理解できないコンパイルエラー
メッセージを(多くの場合英語で)突き付けられ、それだけで自信をなくす者も少なくない。
文法エラーの修正ばかりに気を取られていると、プログラムの構造をどのように組み立て
るかといった、全体への配慮ができず、プログラミングの力がなかなか身につかないこと
が多い。また、コンパイルエラーがなくなっても、論理的なエラーのために予想していた
のと違う結果が返ってくると対処することが難しい。論理的なエラーはエラーメッセージ
が表示されないので、間違い箇所をみつけるためには、変数に何が代入されているかを逐
次チェックしていかなければならない。デバッガを用いれば、このようなチェックは比較
的容易に行うことができるが、多くのデバッガは初学者が使うことを考慮しておらず、使
いにくいことが多い。


2.2 「プログラミング」入門教育の目標
 1にで述べたように、ここで想定している「プログラミング入門」は、大岩レポート[10]
でいうところの「プログラミング」を目指すものであり、職業技能としてのプログラミン
グ言語の習得を目的とするものではない。「プログラミング」習得の目的は、文献[11]に示
されている通りであり、要約すると次の通りである。

      プログラミングを、決まった正解を求める機械的な作業のようにとらえるのは、
      まったくの間違いである。プログラミングは、無限の解法が存在する、まさに創造
      的な作業というべきであり、その過程そのものが教育的に有益である。自分が考え
      たことを決められたルールに従って、きちんと記述するという訓練は、自分の知識
      状態や考え方を明確にする力を養える。また、プログラムのデバッグは、間違い発
      見のプロセスであり、自ら発見するという学習そのものであり、自立的な思考力を
      養える。このような効果を得るためには、プログラムを書いて、実際に動かしてみ


                      2
るということを自ら体験する必要がある。

 さらに、プログラミングを体験することで、コンピュータというものの本質を理解でき
るようになる。すなわち、コンピュータは、プログラムに書かれたことを忠実に実行する
だけの機械であって、それ以上でもそれ以下でもないことを実感できる。また、考えたこ
とをプログラムに書き表すのは容易ではないことや、コンピュータのプログラムからバグ
を取り去るのは容易でないことなども自分の経験として理解できるようになる[12]。
 このように「プログラミング」の習得は、上記のような体験にもとづいて、コンピュー
タの本質を理解することを目標としている。


2.3 初学者用プログラミング環境として何が必要か
 2.2で示したプログラミング入門を、なるべく短時間に習得するために必要なプログラ
ミング環境について考える。
 まず、プログラミング言語としてどのようなものを選ぶかが重要な問題である。読んで
分かりやすい言語であることが第一の条件であろう。そこで、大学入試センターの「情報
関係基礎」で用いられている手順記述言語DNCL[13]、および、DNCLをもとに作られ
た東京農工大の入試用手順記述言語TUATLE[14]に注目した。これらの言語は日本語を
ベースとした記述言語であり、特別な説明なしで入試で用いられているということから
も、分かりやすさの点では問題ないと思われる。
 DNCLおよびTUATLEは、読みやすさの点では、初学者に十分受け入れられるレベル
であるが、書くのは必ずしも容易ではない。日本語をベースとしていることから、キー
ワードなども長めであり、入力において、文法エラーが入り込む余地は大きい。そこでプ
ログラムを書く際の何らかの入力支援機能が必要となる。
 また、2.2で述べたように、プログラミングは自分で書いて実際に動かしてみることが
重要である。そのためには、言語処理系が必要であり、さらに、論理的な間違いを発見し
やすいように、初学者がプログラムの実行状況を観察できる機能等が必要である。




                     3
3 初学者向けプログラミング学習環境 PEN




               図1 PENの実行時の表示例



 図1はPENの実行時のスナップショットである。PENはプログラムの入力/編集を行う
ためのエディタ機能、プログラムの実行・一時停止・一行実行などの実行制御機能、実行
結果とその履歴を表示するコンソール機能、実行中の各変数の値を表示する機能等をもつ
(付録A)。
  PENで動作するプログラム言語は、DNCLおよびTUATLEを拡張した言語を用いた。
これをxDNCL(付録B)とよぶ。図2にxDNCLによるプログラムの記述例を示す。言語仕
様はDNCLに、変数宣言の追加と演算子の定義で若干の変更を行っているが、基本的には
ほとんど同じである。また、よくある入力間違いによるプログラムの記述ミスを、文法エ
ラーとせずに受理し、実行できるようにしている(付録C)。



                     4
図2 xDNCLの記述例(数当てゲーム)




3.1 プログラム入力支援機能

3.1.1   プログラム入力支援ボタン
  上述したように、xDNCLで記述されたプログラムは読みやすいが、日本語で記述され
ているので、プログラム作成時は文法通りに間違わず入力することは必ずしも容易ではな
い。また、キーボードに慣れていない初学者にとっては、かな漢字変換の操作も煩雑で
ある。
  キー入力の操作を減らし、補助するための機能として、図1の下部のようなプログラム
入力支援ボタンを用意した。
  以下に、プログラム入力支援ボタンの使用例を示す(図3)。

   1. 図3 (a)の状態で入力支援ボタン [ ∼の間、繰り返す ] をクリックすると、図3 (b)
        のように制御構造のテンプレートが編集画面に挿入される。


                          5
図3   入力支援ボタンによるプログラミング例




 2. 次に≪条件式≫など、≪と≫で囲まれた部分(この部分全体で一つの文字として扱
    われる)をマウスでクリックするか、その位置にカーソルを移動することにより、図
    3 (c)のように≪と≫で囲まれた部分が選択される。
 3. 選択された部分を実際の条件式等に書き換えて、さらに4行目以降に命令を挿入し
   ていくことにより、プログラムを作成することが可能である。



3.1.2 インデントの自動挿入
  DNCL等では、インデントを縦棒記号(|)で表している。PENでは、インデントの縦棒
記号を自動で挿入するようにした(図4)。


                       6
図4   インデントの自動挿入




 図4 (a)の状態で、 [ もし∼そうでなければ ] の入力支援ボタンを押すと、インデントを
付加した制御構造のテンプレートが図4 (b)のように挿入される。インデントを自動的に
付加することにより、プログラムの記述を助けるだけではなく、プログラムの構造を明確
に意識する手助けにもなる。




                        7
3.2 プログラムの実行状態表示機能
 プログラムの実行状態の表示機能について、図1 を用いて説明する。
 プログラムの実行は図1上部中央にある実行制御ボタン群の実行ボタンにより行う。ま
た、プログラム実行の流れを理解できるよう、1行ずつ実行できるステップ実行や、実行
速度を調節し実行できるスロー実行の機能を持つ。
 実行時には、どの行が実行されているかを実行箇所マーカーで常に明示している。変数
表示画面では、実行中のプログラムで用いているすべての変数の値を常に表示している。
これらの情報を提示することで、プログラムがどのように実行されているかなどの状況を
把握しやすくしている。また、実行状態表示ラベルでプログラムの実行時の状態を明示し
ている。


3.2.1 実行制御ボタン
  図1の上部中央に実行制御ボタンがあり、プログラムの実行や一時停止などの実行状態
の制御が行える。表1に、個々の実行制御ボタン名と押した時にどのような状態に遷移す
るかを示す。

                  表1   実行制御ボタンの一覧

 実行制御ボタン名   意味
 実行         プログラムの実行を開始する。プログラム実行中は「一時停
            止」ボタンに変化する。実行する速度は「実行速度調整スライ
            ダー」で変化させることができる。
 始めから実行     実行ボタンと同じ。
 一時停止       実行を一時停止する。一時停止時は、「再開」のボタンに変化
            する。
 再開         一時停止中のプログラムの実行を再開する。再開後は、「一時
            停止」のボタンに変化する。
 一行実行       「実行箇所マーカー」のある行のみを実行し、その後、一時停
            止状態になる。
 始めに戻る      プログラムの実行を取り止め、プログラムの最初に戻ります。




                          8
図5    実行箇所マーカー




3.2.2 実行箇所マーカー
  図5にある「●」は、次に実行するプログラムの行を指し示した実行箇所マーカーであ
る。また、スロー実行やステップ実行と組み合わせて用いると、トレース作業を容易に行
える。


3.2.3 実行状態表示ラベル
  図1の右上に実行状態表示ラベルがあり、プログラムの実行状態を把握できるようにし
ている。プログラムの状態としては、表2に示すように、5つの状態がある。プログラムの
実行状態を表示することにより、プログラムが途中でが停止しているのか動いているの
か、入力を求められて停止しているかなどが、一目でわかる。

                 表2   実行状態の一覧

 実行状態    意味
 実行待ち    プログラムを実行していない状態。プログラムの編集が可能。
 実行中     通常にプログラムを実行している状態。
 一時停止中   「一時停止」や「一行実行」によって実行が停止されている状態。
 入力待ち    プログラム内の入力文による入力待ち状態。入力はコンソール画面
         に行う。
 実行終了    プログラムの実行が終了した状態。再度、プログラムを実行する場
         合は「始めから実行」で行う。また状態を「実行待ち」に初期化する
         には「始めに戻る」で行う。




                        9
3.2.4   スロー実行




                 図6   実行速度調節バー



  プログラムを実行しながら観察できるよう、実行速度を調節できる機能を実装した。実
行速度の調節は図6の実行速度調節バーにて行う。実行速度調節バーのツマミをドラッグ
&ドロップし、右へ動かすと実行速度が遅くなり、逆に左に動かすと速くなる。実行速度
の調節はプログラムの実行中でも変更できるので、注目してみたい箇所で実行速度を遅く
し、じっくりと観察するといった使い方も可能である。


3.2.5   ステップ実行
  プログラムの実行過程を詳しく観察できるよう、ステップ実行を用意している。ステッ
プ実行は、図1上部中央にある実行制御ボタン群の一行実行ボタンで実行できる。一行実
行ボタンを押すと、実行箇所マーカーの指し示している行を実行し、次の命令に実行箇所
マーカーが移り、プログラム実行状態が一時停止状態になる。


3.2.6   変数表示画面
  プログラムの実行過程を観察する際、変数にどのような値が代入されているかなどの情
報が必要になる。変数に関する情報は、図1の右下にある変数表示画面に表示される。表
示される項目は「データ型」「変数名」
             、    、および「変数の値」である。




                        10
3.3 プログラム入力支援ボタンのカスタマイズ
 プログラム入力支援ボタンは外部ファイルによって定義されており、ボタンの表示名や
サイズ、色、押した時に入力される文字列をカスタマイズできるようにしている。カスタ
マイズすることにより、教員が授業の進行状況に合わせて、必要なボタンのみを表示させ
ておくことも可能である。また、個々の入力支援ボタンには任意の文字列を対応付けてお
くことができるので、不等号など入力しづらい文字をボタンに割り当てることもできる。
 ボタンの定義方法は、入力支援ボタン定義ファイルに、1行につきボタン1つを記述す
る。フォーマットは「ボタン名@ボタンサイズ@ボタン色(R,G,B)[@挿入文字列]」であ
る。ボタン名とは、ボタンに表示される文字列で、ボタン名は最大48文字表示できる。ボ
タンサイズはボタンの横幅で、例えばボタン名10文字分の幅をとりたい場合は、 10」と
                                     「
記述する。挿入文字列は、ボタンを押したときに編集画面に入力される文字列である。ま
た、挿入文字列を記述しなかった場合、ボタンではなくラベルとして表示される。図7に、
初学者向けの入力支援ボタンの定義ファイルと、その入力支援ボタンの表示例を示す。




          図7 プログラム入力支援ボタンのカスタマイズ例




                     11
4 PENの実装
 PENは多くの環境で動作できるようJava言語で記述した。付録Dにすべてのパッケー
ジ階層を掲載している。インタフェースには、動作環境にあまり影響されることなく、一
貫したユーザインターフェイスを提供できる、Swingパッケージを用いた。
 字句解析や構文木を生成するパーザの作成には、Javaで記述されたコンパイラ・コン
パイラのJavaCC[16][17]と、そのプリプロセッサであるJJTreeを用いた。パーザを作成
するまでの流れを簡単に説明すると、まずJJTreeに構文定義ファイルを入力として渡す。
JJTreeは構文定義ファイルをJavaCC形式に変換し、また構文木を生成するためのJava
ソースファイルなどを出力する。次に、JavaCC形式の構文定義ファイルをJavaCCに入
力として渡すと、パーザクラス、例外処理クラスやトークンを扱うクラスファイルなどが
出力される。xDNCL言語で記述したプログラムを実行するには、JJTreeとJavaCCを用
いて作成したパーザクラスへプログラムを入力として渡す。パーザクラスは入力されたプ
ログラムの字句解析を行い、インスタンス内に構文木を生成する。生成した構文木を格納
したインスタンスに、各ノードで行う処理を記述したクラスを渡すと、xDNCL言語で記
述したプログラムが実行される。




                 図8 プログラム実行系の概略




                       12
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
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
6. 構文木のノードをすべて実行すると、プログラムの終了処理を行いスレッドを停止
   する(図10 (g))。実行時エラーによりプログラムが停止した場合、構文エラーが発
 生した時同様にコンソール画面へエラー文を出力し、スレッドを停止する。




               図10 プログラムの実行




                    15
図11 パーサクラスへの入力するプログラム




図12   パーサクラス内に生成される構文木




           16
4.3 実行制御/状態表示の遷移
 プログラムの実行状態は状態表示ラベルに表示しており、表2のように5状態ある。PEN
は起動すると実行待ちの状態にセットされる。実行状態は実行制御ボタン(表1)の操作や、
プログラムの命令によって図13のように遷移する。例えば実行状態が実行待ちの時、実行
ボタンを押せば、実行中の状態に遷移し、また 一行実行ボタンを押せば、プログラム一行
を実行し 一時停止の状態に遷移する。状態遷移の例外として、プログラム実行エラーが
発生すると、プログラムの実行停止処理を行い実行待ちの状態に遷移する。




                図13   実行状態遷移図




                       17
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
評価で使用したプログラムは、図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
5.2.2   大阪市立大学での使用例
  大阪市立大学の2部の共通教育科目「情報処理I」(2005年度前期) の中で、PENを試用し
た。この授業は、いわゆるコンピュータリテラシーの習得を目的とするものであり、全13
回(180分/回)の授業のうち、最後の3回(ただし、最後の1回は自習)の授業として実施した。
  全授業終了後のアンケート調査として、「この授業で何を学んだか。もっとも興味深
かったものは何か。」という質問をおこなった。そこでの回答の一部を以下に紹介する。

    • 一番興味深かったのは、やはりプログラミング演習である。プログラミングをする
        ことで、自分の都合のいいように問題を処理することができる楽しさを学んだ。
    • パソコンについて無知だったけれど、少しはわかるようになりました。特に、プロ
        グラミングが全く出来なかったのに先週メールで提出したプログラムの課題や、今
        日のテストのプログラムが一人で出来て、エラーもなく実行できたので嬉しかった
        です。
    • 興味深かったものは、プログラミングです。センター試験の数学IA の問題が解け
        るのかなと思えてきたからです。
    • PENを使った作業は新鮮で面白かった。PENは本当におもしろかったと思う。パ
        ズルみたいだった。

最も興味深かったものとして、プログラミングを挙げたものが、全34名中12名いたことは
特筆に値する。
  上記の意見の多くは、プログラミングそのものに対する興味を示すものであり、PENを
使ったことが、直接的に影響しているとは必ずしも言えないが、プログラミングに興味を
引き付ける役割りの一部を果たしているものと推測している。




                          20
6 おわりに
 プログラム入力支援機能やプログラムの実行状況の表示機能などを備えた初学者向けプ
ログラミング学習環境 PEN を作成した。SOLAR-CATSに組込んだPENを使用し、利用
者の操作履歴を収集・解析し、PENの有効性についての評価実験を行った。今回の被験者
は、いずれもプログラミング、および、キーボード入力に習熟しており、実際のプログラ
ミング教育においての有効性を検証するまでには至っていない。今後、プログラミング初
学者に対して、同様の実験を行い、PENの有効性を検証していく予定である。また、実際
のプログラミング教育での使用経験を積み重ねて、PENの改良に努めたい。




                      21
謝辞
 本研究を行うにあたって、研究の方法、展開、論文の執筆に至るまで多大なるご指導と
ご協力を頂きました、大阪市立大学大学院創造都市研究科の松浦敏雄教授に心より感謝い
たします。研究を進める上で、多くの有益な御助言と御支援を頂いた大阪市立大学大学院
創造都市研究科の中野秀男教授、安倍広多助教授、石橋勇人助教授、大西克実助教授に感
謝いたします。研究の方法、PENの実装・評価にご協力を頂きました、大阪学院大学情報
学部の西田知博講師に感謝いたします。また、SOLAR–CATSへのPENの組み込みに御
協力頂いた鹿児島大学総合情報処理センターの山之上卓教授に感謝いたします。




                    22
参考文献
 [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
[15] 山之上 卓: “多数の端末上のアプリケーション操作の記録再生を行う教育支援システ
     ム”, IPSJ SIGCE SSS2005, pp.61-68 (2005-08).
[16] JavaCC: https://javacc.dev.java.net/, (2006-01).
[17] 五月女健治: JavaCC コンパイラ・コンパイラ for Java, テクノプレス, (2003).




                           24
付録 A
                     PEN クイックリファレンス

1. 基本画面




  (a) 編集画面
      プログラムのソースコードを入力するエリアです。
  (b) コンソール画面
      プログラム中の出力はこの画面に表示されます。また、入力もこの画面から行います。
      タブの操作により表示方法の異なる「実行画面」と「履歴」に切り替えられます。
     • 実行画面 : 実行中もしくは実行直後のコンソールが表示されます。
     • 履歴 : 今までの実行した結果の全てが表示されます。
  (c) 変数表示画面
      データ型、変数名と、変数に代入されている値が表示されます。
      プログラム実行時に変数の値の変化を観察することができます。
  (d) プログラム入力支援ボタン
      プログラムの入力を補助するためのボタンです。
      「もし∼そうでなければ」のボタンで入力されるコード                

      もし ≪条件式≫ ならば
           |
      を実行し,そうでなければ
           |
     を実行する
                                               
    ≪条件式≫など≪≫に囲まれた部分にカーソルを移動すると≪≫の部分全体が選択され、
    そこに書くべき式などに簡単に書き換えることができます。




                             1
2. 実行時の画面




  (a) 実行制御ボタン
    状態表         意味
    実行          プログラムを実行する場合はこのボタンを押します。プログラム実行中は「一時停止」
                ボタンに変化します。実行する速度は「実行速度調整スライダー」で変化させることが
                できます。
    始めから実行      実行ボタンと同じ。
    一時停止        プログラム実行中に押すと実行を一時停止することができます。一時停止時は、
                                                   「再開」
                のボタンに変化します。
    再開          一時停止状態から実行を再開したい場合に使用します。再開後は、「一時停止」のボタ
                ンに変化します。
    一行実行        「実行箇所マーカー」のある行を実行し、その後、一時停止状態になります。
    始めに戻る       プログラムの実行を取り止め、プログラムの最初に戻ります。
  (b) 実行速度調整スライダー
      プログラムの実行速度を変更するためのスライダーです。
      バーをゲージの左側に移動すると実行速度が速くなり、右側に移動すると遅くなります。
  (c) 状態表示
     状態表        意味
     実行待ち       プログラムを実行していない状態。プログラムの編集が可能。
     実行中        通常にプログラムを実行している状態。
     一時停止中      「一時停止」や「一行実行」によって実行が停止されている状態。
     入力待ち       プログラム内の入力文による入力待ち状態。入力はコンソール画面に行う。
     実行終了       プログラムの実行が終了した状態。再度、プログラムを実行する場合は「始めから実
                行」で行う。また状態を「実行待ち」に初期化するには「始めに戻る」で行う。
  (d) 実行箇所マーカー
      これから実行する行を指し示しています。
      この場面では 7 行目を実行する直前の状態になります



                               2
付録 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
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
3.4   演算結果のデータ型について

 演算結果のデータ型は演算対象のデータ型によって決まる。
なお、演算前に演算結果のデータ型に変換してから、演算が行われる。

               演算例         演算結果のデータ型
               整数 + 整数     整数
               実数 + 整数     実数
               実数 + 実数     実数
               文字列 + 整数    文字列として、文字列結合される
               文字列 + 実数    文字列として、文字列結合される
               文字列 + 文字列   文字列として、文字列結合される



4 出力文
4.1   改行あり出力
                                                          
      ≪出力文≫ を印刷する
                                                          
≪出力文≫で指定された変数や文字列をコンソール画面に表示し、その後改行する。


4.2   改行なし出力
                                                          
      ≪出力文≫ を改行なしで印刷する
                                                          
≪出力文≫で指定された変数や文字列をコンソール画面に表示し、その後改行をしない。


4.3   複数の変数・文字列の出力

  変数や文字列を一緒に出力する場合、それらを「と」で結び列挙する。

      使用例                          
                                    変数 ans が 50 の場合の出力例   

       「答えは」 と ans と 「です」 を印刷する      答えは 50 です
                                   
                                                          


5 代入文
5.1   代入
                                                          
      ≪変数≫ ← ≪式≫
                                                          
≪式≫に書かれた定数や式の演算結果を≪変数≫に指定された変数へ代入する。
なお、右辺の≪式≫の値の型のいかんに関わらず、代入によって、
左辺の≪変数≫のデータ型に自動変換される。
≪式≫の演算結果が実数型で、左辺の≪変数≫が整数型の場合、小数点以下は切り捨てられる。




                                3
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
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
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
使用例 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
変数 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
付録 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
前条件判定の繰り返し文 (while-do 文)
                                                        
≪条件式≫ の間,
 | <処理>
を ( 繰り返す | 繰返す )
                                                        


後条件判定の繰り返し文 (repeat-unil 文)
                                                        
( 繰り返し | 繰返し ),
  | <処理>
を, ≪条件式≫ になるまで実行 [する]
                                                        


範囲指定の加算型繰り返し文 (for 文)
                                                        
≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪増加値≫ ずつ増やし ( ながら | つつ ),
 | <処理>
を ( 繰り返す | 繰返す )
                                                        


範囲指定の減算型繰り返し文 (for 文)
                                                        
≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪減少値≫ ずつ減らし ( ながら | つつ ),
 | <処理>
を ( 繰り返す | 繰返す )
                                                        




                              2
付録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
- JLabelクラスを拡張した状態表示ラベルクラス
class ConsoleAppend
- コンソール画面の「実行画面」と「履歴」に文字列を追加するクラス
class ConsoleCopyButtonListener (implements
java.awt.event.ActionListener)
- メニュー - 編集 - 実行画面をコピーを実現しているクラス
class EditAreaAddTab
- インデントの個数を数え追加すべきインデントを返すクラス
class EditAreaMouseListener (implements java.awt.event.MouseListener)
class EditAreaUndoableEditListener (implements
java.awt.event.ActionListener, javax.swing.event.UndoableEditListener)
class EditButtonList
class EditSelection
class ExitButtonListener (implements java.awt.event.ActionListener)
class FileDropOpen (implements java.awt.dnd.DropTargetListener)
class javax.swing.filechooser.FileFilter
      class PenFileFilter
class FileOpen
class FileOpenButtonListener (implements
java.awt.event.ActionListener)
class FileSave
class 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 PEN
class RunClean
class RunStop
class RunTimeChangeListener (implements
javax.swing.event.ChangeListener)
class RunTimeMouseListener (implements java.awt.event.MouseListener)
class SimpleCharStream
class SimpleNode (implements Node)
- 構文木のノード(AST~クラス)のスーパークラス
      class ASTAbs
      class ASTAddNode
      class ASTANDNode
      class ASTArray
class   ASTArrayNum
class   ASTAssignStat
class   ASTAssignStats
class   ASTASTAssignStat
class   ASTBlock
class   ASTCeil
class   ASTCosine
class   ASTDecl
class   ASTDivNode
class   ASTDoWhileStat
class   ASTDoWhileStat2
class   ASTElseIfStat
class   ASTEOF_STR
class   ASTEQNode
class   ASTErrorOccur
class   ASTExtract
class   ASTFile_close
class   ASTFile_flush
class   ASTFile_getline
class   ASTFile_getstr
class   ASTFile_isfile
class   ASTFile_opena
class   ASTFile_openr
class   ASTFile_openw
class   ASTFile_putline
class   ASTFile_putstr
class   ASTFile_remove
class   ASTFile_rename
class   ASTFloatLiteral
class   ASTFloor
class   ASTForStat
class   ASTForStatAdd
class   ASTFunction
class   ASTFunctionCall
class   ASTFunctionVar
class   ASTgColor
class   ASTgDrawArc
class   ASTgDrawBox
class   ASTgDrawLine
class   ASTgDrawOval
class   ASTgDrawPoint
class   ASTGENode
class   ASTGet
class   ASTGetStat
class   ASTgFillArc
class   ASTgFillBox
class   ASTgFillOval
class   ASTgFillPoint
class   ASTGTNode
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
interface IntVParserTreeConstants
interface IntVParserVisitor
interface Node
付録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
| 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
| 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 RP
gWindowOpen ::= gWindowOpen AddExpr CM AddExpr RP
gWindowClose ::= gWindowClose RP
       gColor ::= gColor AddExpr CM AddExpr CM AddExpr RP
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 )
付録 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-
|      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-
|        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-
);
                          }
                          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-
}

MORE:
{
     /* :COMM
}
COMMSPECIAL_TOKEN:
{
      COMMENT: */  :DEFAULT
}
COMMMORE:
{
      ~[] 
}

SKIP :
{
          ~[] 
                   {
                           ++nLexicalErrors;
                           new ConsoleAppend(
                                  ###  + input_stream.getBeginLine() + 行目で
                                  + エラーです : ' + image + 'n
                           );
                   }
}

void IntVUnit() :
{       Token t; }
{
        (
                 try {
                            VarDecl()
                            |        Function()
                            |        Stat()
                            |        EOF
                                     { return; }
                            |        ErrorOccur()
                   } catch (ParseException e) {
                            ++nParseErrors;
                            new ConsoleAppend(###  + e.getMessage() + n);
                            throw new ParseException();
                            do {
                                     t = getNextToken();
                            } while (t.kind != SM  t.kind != RC  t.kind != EOF);
                   }
         )*
}

JAVACODE
void ErrorOccur() {
        ParseException e = generateParseException();
        throw e;
}

void Function() :
{ Token t; }


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

More Related Content

Viewers also liked

[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PEN[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PENRyota Nakamura
 
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いてRyota Nakamura
 
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)Ryota Nakamura
 
[CE81] プログラミング入門教育用学習環境PEN (発表資料)
[CE81] プログラミング入門教育用学習環境PEN (発表資料)[CE81] プログラミング入門教育用学習環境PEN (発表資料)
[CE81] プログラミング入門教育用学習環境PEN (発表資料)Ryota Nakamura
 
социальные сервисы для 226
социальные сервисы для 226социальные сервисы для 226
социальные сервисы для 226nikulina13
 
You are here, content strategy
You are here, content strategy You are here, content strategy
You are here, content strategy Misty Weaver
 
Collaboration of the Masses: Crowdsourcing & Crowdfunding
Collaboration of the Masses: Crowdsourcing & CrowdfundingCollaboration of the Masses: Crowdsourcing & Crowdfunding
Collaboration of the Masses: Crowdsourcing & CrowdfundingLaura Amole
 
наталья никулина екатеринбург
наталья никулина екатеринбургнаталья никулина екатеринбург
наталья никулина екатеринбургnikulina13
 
Tiacalapowerpoint
TiacalapowerpointTiacalapowerpoint
Tiacalapowerpointklopez305
 
Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1
Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1
Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1Fatimah Noor Zainal
 
Retrometabolic drug design
Retrometabolic drug designRetrometabolic drug design
Retrometabolic drug designreem tawfeek
 
Misty Weaver Content Strategy in the Bush - CS Seattle
Misty Weaver Content Strategy in the Bush - CS SeattleMisty Weaver Content Strategy in the Bush - CS Seattle
Misty Weaver Content Strategy in the Bush - CS SeattleMisty Weaver
 

Viewers also liked (20)

[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PEN[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PEN
 
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて
 
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
 
[Basic] 提示資料
[Basic] 提示資料[Basic] 提示資料
[Basic] 提示資料
 
文書処理
文書処理文書処理
文書処理
 
[CE81] プログラミング入門教育用学習環境PEN (発表資料)
[CE81] プログラミング入門教育用学習環境PEN (発表資料)[CE81] プログラミング入門教育用学習環境PEN (発表資料)
[CE81] プログラミング入門教育用学習環境PEN (発表資料)
 
социальные сервисы для 226
социальные сервисы для 226социальные сервисы для 226
социальные сервисы для 226
 
You are here, content strategy
You are here, content strategy You are here, content strategy
You are here, content strategy
 
ковка4
ковка4ковка4
ковка4
 
Collaboration of the Masses: Crowdsourcing & Crowdfunding
Collaboration of the Masses: Crowdsourcing & CrowdfundingCollaboration of the Masses: Crowdsourcing & Crowdfunding
Collaboration of the Masses: Crowdsourcing & Crowdfunding
 
表計算
表計算表計算
表計算
 
наталья никулина екатеринбург
наталья никулина екатеринбургнаталья никулина екатеринбург
наталья никулина екатеринбург
 
Tiacalapowerpoint
TiacalapowerpointTiacalapowerpoint
Tiacalapowerpoint
 
Global issues bio
Global issues bioGlobal issues bio
Global issues bio
 
[xDNCL] 導入資料
[xDNCL] 導入資料[xDNCL] 導入資料
[xDNCL] 導入資料
 
[Basic] 導入資料
[Basic] 導入資料[Basic] 導入資料
[Basic] 導入資料
 
Pelan strategik lengkap
Pelan strategik lengkapPelan strategik lengkap
Pelan strategik lengkap
 
Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1
Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1
Percubaan Prinsip Perakaunan SPM 2011 - Kertas 1
 
Retrometabolic drug design
Retrometabolic drug designRetrometabolic drug design
Retrometabolic drug design
 
Misty Weaver Content Strategy in the Bush - CS Seattle
Misty Weaver Content Strategy in the Bush - CS SeattleMisty Weaver Content Strategy in the Bush - CS Seattle
Misty Weaver Content Strategy in the Bush - CS Seattle
 

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

2..nakamura thesis(2)
2..nakamura thesis(2)2..nakamura thesis(2)
2..nakamura thesis(2)Ravi Teja
 
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版Hiroyuki Ohnaka
 
Rの拡張を書く (R 2.15.2)
Rの拡張を書く (R 2.15.2)Rの拡張を書く (R 2.15.2)
Rの拡張を書く (R 2.15.2)itoyan110
 
Linux+PHPを学んで日程調整アプリを作ろう①
Linux+PHPを学んで日程調整アプリを作ろう①Linux+PHPを学んで日程調整アプリを作ろう①
Linux+PHPを学んで日程調整アプリを作ろう①Aina Hara
 
Windows azure stepbystep_tutorialguide
Windows azure stepbystep_tutorialguideWindows azure stepbystep_tutorialguide
Windows azure stepbystep_tutorialguideYoshida Yuri
 
ワンストップ技術書を書こう おためし版
ワンストップ技術書を書こう おためし版ワンストップ技術書を書こう おためし版
ワンストップ技術書を書こう おためし版親方 親方
 
Appmethod でカメラアプリ作成体験
Appmethod でカメラアプリ作成体験Appmethod でカメラアプリ作成体験
Appmethod でカメラアプリ作成体験Toshiki Iga
 
Ecodesigner Userguide(Jp)
Ecodesigner Userguide(Jp)Ecodesigner Userguide(Jp)
Ecodesigner Userguide(Jp)guestf4ca97c
 
コーディング規約「Scratch編」v1.0
コーディング規約「Scratch編」v1.0コーディング規約「Scratch編」v1.0
コーディング規約「Scratch編」v1.0satoshi59
 
コーディング規約_Scratch編_v1.1
コーディング規約_Scratch編_v1.1コーディング規約_Scratch編_v1.1
コーディング規約_Scratch編_v1.1satoshi59
 
B 64014 ja-04
B 64014 ja-04B 64014 ja-04
B 64014 ja-04mt7038
 
Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介
Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介
Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介Kohei Nishikawa
 
Datalink Manual 1.6.0.1
Datalink Manual 1.6.0.1Datalink Manual 1.6.0.1
Datalink Manual 1.6.0.1guest9f8fb4aa
 
学部卒業論文
学部卒業論文学部卒業論文
学部卒業論文n-yuki
 
Instalaciones de servidores ejemplo
Instalaciones de servidores ejemploInstalaciones de servidores ejemplo
Instalaciones de servidores ejemploGary Flores Marcos
 

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

Tour
TourTour
Tour
 
Tour
TourTour
Tour
 
2..nakamura thesis(2)
2..nakamura thesis(2)2..nakamura thesis(2)
2..nakamura thesis(2)
 
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
 
Rの拡張を書く (R 2.15.2)
Rの拡張を書く (R 2.15.2)Rの拡張を書く (R 2.15.2)
Rの拡張を書く (R 2.15.2)
 
Linux+PHPを学んで日程調整アプリを作ろう①
Linux+PHPを学んで日程調整アプリを作ろう①Linux+PHPを学んで日程調整アプリを作ろう①
Linux+PHPを学んで日程調整アプリを作ろう①
 
Windows azure stepbystep_tutorialguide
Windows azure stepbystep_tutorialguideWindows azure stepbystep_tutorialguide
Windows azure stepbystep_tutorialguide
 
Hi1
Hi1Hi1
Hi1
 
ワンストップ技術書を書こう おためし版
ワンストップ技術書を書こう おためし版ワンストップ技術書を書こう おためし版
ワンストップ技術書を書こう おためし版
 
Appmethod でカメラアプリ作成体験
Appmethod でカメラアプリ作成体験Appmethod でカメラアプリ作成体験
Appmethod でカメラアプリ作成体験
 
Thes qpsk
Thes qpskThes qpsk
Thes qpsk
 
Ecodesigner Userguide(Jp)
Ecodesigner Userguide(Jp)Ecodesigner Userguide(Jp)
Ecodesigner Userguide(Jp)
 
コーディング規約「Scratch編」v1.0
コーディング規約「Scratch編」v1.0コーディング規約「Scratch編」v1.0
コーディング規約「Scratch編」v1.0
 
コーディング規約_Scratch編_v1.1
コーディング規約_Scratch編_v1.1コーディング規約_Scratch編_v1.1
コーディング規約_Scratch編_v1.1
 
B 64014 ja-04
B 64014 ja-04B 64014 ja-04
B 64014 ja-04
 
Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介
Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介
Bluemixモバイルのテンプレートを用いたチャットボットアプリ動作確認手順の紹介
 
RODEM-G 取扱説明書 v1.2 r2
RODEM-G 取扱説明書 v1.2 r2RODEM-G 取扱説明書 v1.2 r2
RODEM-G 取扱説明書 v1.2 r2
 
Datalink Manual 1.6.0.1
Datalink Manual 1.6.0.1Datalink Manual 1.6.0.1
Datalink Manual 1.6.0.1
 
学部卒業論文
学部卒業論文学部卒業論文
学部卒業論文
 
Instalaciones de servidores ejemplo
Instalaciones de servidores ejemploInstalaciones de servidores ejemplo
Instalaciones de servidores ejemplo
 

Recently uploaded

リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slidessusere0a682
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」inspirehighstaff03
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfinspirehighstaff03
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」inspirehighstaff03
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」inspirehighstaff03
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドKen Fukui
 
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」inspirehighstaff03
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」inspirehighstaff03
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」inspirehighstaff03
 
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」inspirehighstaff03
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」inspirehighstaff03
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」inspirehighstaff03
 
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」inspirehighstaff03
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」inspirehighstaff03
 

Recently uploaded (20)

リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
 
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」
 
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」
 
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」
 

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

  • 1. 大阪市立大学大学院 創造都市研究科 修士学位論文 修士論文       入力支援機能を備えた日本語表記による 初学者向けプログラミング学習環境の構築   Japanese-based Programming Environment for Novices with Coding Support Function         2006年1月 大阪市立大学大学院 創造都市研究科 都市情報学専攻 情報基盤研究分野 M04UC507 中村亮太 (NAKAMURA,Ryota)
  • 2. 目次 1 はじめに 1 2 プログラミング教育に必要な支援機能 2 2.1 プログラミング演習の難しさ . . . . . . . . . . . . . . . . . . . . . . . . 2 2.2 「プログラミング」入門教育の目標 . . . . . . . . . . . . . . . . . . . . . 2 2.3 初学者用プログラミング環境として何が必要か . . . . . . . . . . . . . . . 3 3 初学者向けプログラミング学習環境 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 プログラム入力支援ボタンのカスタマイズ . . . . . . . . . . . . . . . . . 11 4 PENの実装 12 4.1 構文定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2 プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.3 実行制御/状態表示の遷移 . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5 評価 18 5.1 操作記録の解析と評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.2 授業での利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.2.1 大阪学院大学での使用例 . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.2.2 大阪市立大学での使用例 . . . . . . . . . . . . . . . . . . . . . . . . . 20 6 おわりに 21 謝辞 22 i
  • 3. 参考文献 23 ii
  • 4. 図目次 1 PENの実行時の表示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 xDNCLの記述例(数当てゲーム) . . . . . . . . . . . . . . . . . . . . 5 3 入力支援ボタンによるプログラミング例 . . . . . . . . . . . . . . . . . . 6 4 インデントの自動挿入 . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5 実行箇所マーカー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 6 実行速度調節バー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 7 プログラム入力支援ボタンのカスタマイズ例 . . . . . . . . . . . . . . . 11 8 プログラム実行系の概略 . . . . . . . . . . . . . . . . . . . . . . . . . . 12 9 JJTreeの記述例(加算・減算) . . . . . . . . . . . . . . . . . . . . . . 14 10 プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 11 パーサクラスへの入力するプログラム . . . . . . . . . . . . . . . . . . . 16 12 パーサクラス内に生成される構文木 . . . . . . . . . . . . . . . . . . . . 16 13 実行状態遷移図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 表目次 1 実行制御ボタンの一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2 実行状態の一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3 JavaCCとJJTreeで使用できる正規表現の一覧 . . . . . . . . . . . . . . 13 4 解析結果の平均値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 iii
  • 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. 2 プログラミング教育に必要な支援機能 ここではまず、2.1において従来のプログラミング演習で初学者が直面する問題を挙げ る。2.2では、本研究で考えるプログラミング教育の目標を明白にし、2.3では、その教育 目標を達成するためのプログラミング環境としてどのような機能が必要かについて考察 する。 2.1 プログラミング演習の難しさ 初学者は、プログラミング演習の初期の段階でつまずくことが多い。演習初期段階では タイプミスに起因する文法エラーが多く発生し、意味の理解できないコンパイルエラー メッセージを(多くの場合英語で)突き付けられ、それだけで自信をなくす者も少なくない。 文法エラーの修正ばかりに気を取られていると、プログラムの構造をどのように組み立て るかといった、全体への配慮ができず、プログラミングの力がなかなか身につかないこと が多い。また、コンパイルエラーがなくなっても、論理的なエラーのために予想していた のと違う結果が返ってくると対処することが難しい。論理的なエラーはエラーメッセージ が表示されないので、間違い箇所をみつけるためには、変数に何が代入されているかを逐 次チェックしていかなければならない。デバッガを用いれば、このようなチェックは比較 的容易に行うことができるが、多くのデバッガは初学者が使うことを考慮しておらず、使 いにくいことが多い。 2.2 「プログラミング」入門教育の目標 1にで述べたように、ここで想定している「プログラミング入門」は、大岩レポート[10] でいうところの「プログラミング」を目指すものであり、職業技能としてのプログラミン グ言語の習得を目的とするものではない。「プログラミング」習得の目的は、文献[11]に示 されている通りであり、要約すると次の通りである。 プログラミングを、決まった正解を求める機械的な作業のようにとらえるのは、 まったくの間違いである。プログラミングは、無限の解法が存在する、まさに創造 的な作業というべきであり、その過程そのものが教育的に有益である。自分が考え たことを決められたルールに従って、きちんと記述するという訓練は、自分の知識 状態や考え方を明確にする力を養える。また、プログラムのデバッグは、間違い発 見のプロセスであり、自ら発見するという学習そのものであり、自立的な思考力を 養える。このような効果を得るためには、プログラムを書いて、実際に動かしてみ 2
  • 7. るということを自ら体験する必要がある。 さらに、プログラミングを体験することで、コンピュータというものの本質を理解でき るようになる。すなわち、コンピュータは、プログラムに書かれたことを忠実に実行する だけの機械であって、それ以上でもそれ以下でもないことを実感できる。また、考えたこ とをプログラムに書き表すのは容易ではないことや、コンピュータのプログラムからバグ を取り去るのは容易でないことなども自分の経験として理解できるようになる[12]。 このように「プログラミング」の習得は、上記のような体験にもとづいて、コンピュー タの本質を理解することを目標としている。 2.3 初学者用プログラミング環境として何が必要か 2.2で示したプログラミング入門を、なるべく短時間に習得するために必要なプログラ ミング環境について考える。 まず、プログラミング言語としてどのようなものを選ぶかが重要な問題である。読んで 分かりやすい言語であることが第一の条件であろう。そこで、大学入試センターの「情報 関係基礎」で用いられている手順記述言語DNCL[13]、および、DNCLをもとに作られ た東京農工大の入試用手順記述言語TUATLE[14]に注目した。これらの言語は日本語を ベースとした記述言語であり、特別な説明なしで入試で用いられているということから も、分かりやすさの点では問題ないと思われる。 DNCLおよびTUATLEは、読みやすさの点では、初学者に十分受け入れられるレベル であるが、書くのは必ずしも容易ではない。日本語をベースとしていることから、キー ワードなども長めであり、入力において、文法エラーが入り込む余地は大きい。そこでプ ログラムを書く際の何らかの入力支援機能が必要となる。 また、2.2で述べたように、プログラミングは自分で書いて実際に動かしてみることが 重要である。そのためには、言語処理系が必要であり、さらに、論理的な間違いを発見し やすいように、初学者がプログラムの実行状況を観察できる機能等が必要である。 3
  • 8. 3 初学者向けプログラミング学習環境 PEN 図1 PENの実行時の表示例 図1はPENの実行時のスナップショットである。PENはプログラムの入力/編集を行う ためのエディタ機能、プログラムの実行・一時停止・一行実行などの実行制御機能、実行 結果とその履歴を表示するコンソール機能、実行中の各変数の値を表示する機能等をもつ (付録A)。 PENで動作するプログラム言語は、DNCLおよびTUATLEを拡張した言語を用いた。 これをxDNCL(付録B)とよぶ。図2にxDNCLによるプログラムの記述例を示す。言語仕 様はDNCLに、変数宣言の追加と演算子の定義で若干の変更を行っているが、基本的には ほとんど同じである。また、よくある入力間違いによるプログラムの記述ミスを、文法エ ラーとせずに受理し、実行できるようにしている(付録C)。 4
  • 9. 図2 xDNCLの記述例(数当てゲーム) 3.1 プログラム入力支援機能 3.1.1 プログラム入力支援ボタン 上述したように、xDNCLで記述されたプログラムは読みやすいが、日本語で記述され ているので、プログラム作成時は文法通りに間違わず入力することは必ずしも容易ではな い。また、キーボードに慣れていない初学者にとっては、かな漢字変換の操作も煩雑で ある。 キー入力の操作を減らし、補助するための機能として、図1の下部のようなプログラム 入力支援ボタンを用意した。 以下に、プログラム入力支援ボタンの使用例を示す(図3)。 1. 図3 (a)の状態で入力支援ボタン [ ∼の間、繰り返す ] をクリックすると、図3 (b) のように制御構造のテンプレートが編集画面に挿入される。 5
  • 10. 図3 入力支援ボタンによるプログラミング例 2. 次に≪条件式≫など、≪と≫で囲まれた部分(この部分全体で一つの文字として扱 われる)をマウスでクリックするか、その位置にカーソルを移動することにより、図 3 (c)のように≪と≫で囲まれた部分が選択される。 3. 選択された部分を実際の条件式等に書き換えて、さらに4行目以降に命令を挿入し ていくことにより、プログラムを作成することが可能である。 3.1.2 インデントの自動挿入 DNCL等では、インデントを縦棒記号(|)で表している。PENでは、インデントの縦棒 記号を自動で挿入するようにした(図4)。 6
  • 11. 図4 インデントの自動挿入 図4 (a)の状態で、 [ もし∼そうでなければ ] の入力支援ボタンを押すと、インデントを 付加した制御構造のテンプレートが図4 (b)のように挿入される。インデントを自動的に 付加することにより、プログラムの記述を助けるだけではなく、プログラムの構造を明確 に意識する手助けにもなる。 7
  • 12. 3.2 プログラムの実行状態表示機能 プログラムの実行状態の表示機能について、図1 を用いて説明する。 プログラムの実行は図1上部中央にある実行制御ボタン群の実行ボタンにより行う。ま た、プログラム実行の流れを理解できるよう、1行ずつ実行できるステップ実行や、実行 速度を調節し実行できるスロー実行の機能を持つ。 実行時には、どの行が実行されているかを実行箇所マーカーで常に明示している。変数 表示画面では、実行中のプログラムで用いているすべての変数の値を常に表示している。 これらの情報を提示することで、プログラムがどのように実行されているかなどの状況を 把握しやすくしている。また、実行状態表示ラベルでプログラムの実行時の状態を明示し ている。 3.2.1 実行制御ボタン 図1の上部中央に実行制御ボタンがあり、プログラムの実行や一時停止などの実行状態 の制御が行える。表1に、個々の実行制御ボタン名と押した時にどのような状態に遷移す るかを示す。 表1 実行制御ボタンの一覧 実行制御ボタン名 意味 実行 プログラムの実行を開始する。プログラム実行中は「一時停 止」ボタンに変化する。実行する速度は「実行速度調整スライ ダー」で変化させることができる。 始めから実行 実行ボタンと同じ。 一時停止 実行を一時停止する。一時停止時は、「再開」のボタンに変化 する。 再開 一時停止中のプログラムの実行を再開する。再開後は、「一時 停止」のボタンに変化する。 一行実行 「実行箇所マーカー」のある行のみを実行し、その後、一時停 止状態になる。 始めに戻る プログラムの実行を取り止め、プログラムの最初に戻ります。 8
  • 13. 図5 実行箇所マーカー 3.2.2 実行箇所マーカー 図5にある「●」は、次に実行するプログラムの行を指し示した実行箇所マーカーであ る。また、スロー実行やステップ実行と組み合わせて用いると、トレース作業を容易に行 える。 3.2.3 実行状態表示ラベル 図1の右上に実行状態表示ラベルがあり、プログラムの実行状態を把握できるようにし ている。プログラムの状態としては、表2に示すように、5つの状態がある。プログラムの 実行状態を表示することにより、プログラムが途中でが停止しているのか動いているの か、入力を求められて停止しているかなどが、一目でわかる。 表2 実行状態の一覧 実行状態 意味 実行待ち プログラムを実行していない状態。プログラムの編集が可能。 実行中 通常にプログラムを実行している状態。 一時停止中 「一時停止」や「一行実行」によって実行が停止されている状態。 入力待ち プログラム内の入力文による入力待ち状態。入力はコンソール画面 に行う。 実行終了 プログラムの実行が終了した状態。再度、プログラムを実行する場 合は「始めから実行」で行う。また状態を「実行待ち」に初期化する には「始めに戻る」で行う。 9
  • 14. 3.2.4 スロー実行 図6 実行速度調節バー プログラムを実行しながら観察できるよう、実行速度を調節できる機能を実装した。実 行速度の調節は図6の実行速度調節バーにて行う。実行速度調節バーのツマミをドラッグ &ドロップし、右へ動かすと実行速度が遅くなり、逆に左に動かすと速くなる。実行速度 の調節はプログラムの実行中でも変更できるので、注目してみたい箇所で実行速度を遅く し、じっくりと観察するといった使い方も可能である。 3.2.5 ステップ実行 プログラムの実行過程を詳しく観察できるよう、ステップ実行を用意している。ステッ プ実行は、図1上部中央にある実行制御ボタン群の一行実行ボタンで実行できる。一行実 行ボタンを押すと、実行箇所マーカーの指し示している行を実行し、次の命令に実行箇所 マーカーが移り、プログラム実行状態が一時停止状態になる。 3.2.6 変数表示画面 プログラムの実行過程を観察する際、変数にどのような値が代入されているかなどの情 報が必要になる。変数に関する情報は、図1の右下にある変数表示画面に表示される。表 示される項目は「データ型」「変数名」 、 、および「変数の値」である。 10
  • 15. 3.3 プログラム入力支援ボタンのカスタマイズ プログラム入力支援ボタンは外部ファイルによって定義されており、ボタンの表示名や サイズ、色、押した時に入力される文字列をカスタマイズできるようにしている。カスタ マイズすることにより、教員が授業の進行状況に合わせて、必要なボタンのみを表示させ ておくことも可能である。また、個々の入力支援ボタンには任意の文字列を対応付けてお くことができるので、不等号など入力しづらい文字をボタンに割り当てることもできる。 ボタンの定義方法は、入力支援ボタン定義ファイルに、1行につきボタン1つを記述す る。フォーマットは「ボタン名@ボタンサイズ@ボタン色(R,G,B)[@挿入文字列]」であ る。ボタン名とは、ボタンに表示される文字列で、ボタン名は最大48文字表示できる。ボ タンサイズはボタンの横幅で、例えばボタン名10文字分の幅をとりたい場合は、 10」と 「 記述する。挿入文字列は、ボタンを押したときに編集画面に入力される文字列である。ま た、挿入文字列を記述しなかった場合、ボタンではなくラベルとして表示される。図7に、 初学者向けの入力支援ボタンの定義ファイルと、その入力支援ボタンの表示例を示す。 図7 プログラム入力支援ボタンのカスタマイズ例 11
  • 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. 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. 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. 6. 構文木のノードをすべて実行すると、プログラムの終了処理を行いスレッドを停止 する(図10 (g))。実行時エラーによりプログラムが停止した場合、構文エラーが発 生した時同様にコンソール画面へエラー文を出力し、スレッドを停止する。 図10 プログラムの実行 15
  • 20. 図11 パーサクラスへの入力するプログラム 図12 パーサクラス内に生成される構文木 16
  • 21. 4.3 実行制御/状態表示の遷移 プログラムの実行状態は状態表示ラベルに表示しており、表2のように5状態ある。PEN は起動すると実行待ちの状態にセットされる。実行状態は実行制御ボタン(表1)の操作や、 プログラムの命令によって図13のように遷移する。例えば実行状態が実行待ちの時、実行 ボタンを押せば、実行中の状態に遷移し、また 一行実行ボタンを押せば、プログラム一行 を実行し 一時停止の状態に遷移する。状態遷移の例外として、プログラム実行エラーが 発生すると、プログラムの実行停止処理を行い実行待ちの状態に遷移する。 図13 実行状態遷移図 17
  • 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. 評価で使用したプログラムは、図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. 5.2.2 大阪市立大学での使用例 大阪市立大学の2部の共通教育科目「情報処理I」(2005年度前期) の中で、PENを試用し た。この授業は、いわゆるコンピュータリテラシーの習得を目的とするものであり、全13 回(180分/回)の授業のうち、最後の3回(ただし、最後の1回は自習)の授業として実施した。 全授業終了後のアンケート調査として、「この授業で何を学んだか。もっとも興味深 かったものは何か。」という質問をおこなった。そこでの回答の一部を以下に紹介する。 • 一番興味深かったのは、やはりプログラミング演習である。プログラミングをする ことで、自分の都合のいいように問題を処理することができる楽しさを学んだ。 • パソコンについて無知だったけれど、少しはわかるようになりました。特に、プロ グラミングが全く出来なかったのに先週メールで提出したプログラムの課題や、今 日のテストのプログラムが一人で出来て、エラーもなく実行できたので嬉しかった です。 • 興味深かったものは、プログラミングです。センター試験の数学IA の問題が解け るのかなと思えてきたからです。 • PENを使った作業は新鮮で面白かった。PENは本当におもしろかったと思う。パ ズルみたいだった。 最も興味深かったものとして、プログラミングを挙げたものが、全34名中12名いたことは 特筆に値する。 上記の意見の多くは、プログラミングそのものに対する興味を示すものであり、PENを 使ったことが、直接的に影響しているとは必ずしも言えないが、プログラミングに興味を 引き付ける役割りの一部を果たしているものと推測している。 20
  • 25. 6 おわりに プログラム入力支援機能やプログラムの実行状況の表示機能などを備えた初学者向けプ ログラミング学習環境 PEN を作成した。SOLAR-CATSに組込んだPENを使用し、利用 者の操作履歴を収集・解析し、PENの有効性についての評価実験を行った。今回の被験者 は、いずれもプログラミング、および、キーボード入力に習熟しており、実際のプログラ ミング教育においての有効性を検証するまでには至っていない。今後、プログラミング初 学者に対して、同様の実験を行い、PENの有効性を検証していく予定である。また、実際 のプログラミング教育での使用経験を積み重ねて、PENの改良に努めたい。 21
  • 26. 謝辞 本研究を行うにあたって、研究の方法、展開、論文の執筆に至るまで多大なるご指導と ご協力を頂きました、大阪市立大学大学院創造都市研究科の松浦敏雄教授に心より感謝い たします。研究を進める上で、多くの有益な御助言と御支援を頂いた大阪市立大学大学院 創造都市研究科の中野秀男教授、安倍広多助教授、石橋勇人助教授、大西克実助教授に感 謝いたします。研究の方法、PENの実装・評価にご協力を頂きました、大阪学院大学情報 学部の西田知博講師に感謝いたします。また、SOLAR–CATSへのPENの組み込みに御 協力頂いた鹿児島大学総合情報処理センターの山之上卓教授に感謝いたします。 22
  • 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. [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. 付録 A PEN クイックリファレンス 1. 基本画面 (a) 編集画面 プログラムのソースコードを入力するエリアです。 (b) コンソール画面 プログラム中の出力はこの画面に表示されます。また、入力もこの画面から行います。 タブの操作により表示方法の異なる「実行画面」と「履歴」に切り替えられます。 • 実行画面 : 実行中もしくは実行直後のコンソールが表示されます。 • 履歴 : 今までの実行した結果の全てが表示されます。 (c) 変数表示画面 データ型、変数名と、変数に代入されている値が表示されます。 プログラム実行時に変数の値の変化を観察することができます。 (d) プログラム入力支援ボタン プログラムの入力を補助するためのボタンです。 「もし∼そうでなければ」のボタンで入力されるコード もし ≪条件式≫ ならば  | を実行し,そうでなければ  | を実行する ≪条件式≫など≪≫に囲まれた部分にカーソルを移動すると≪≫の部分全体が選択され、 そこに書くべき式などに簡単に書き換えることができます。 1
  • 30. 2. 実行時の画面 (a) 実行制御ボタン 状態表 意味 実行 プログラムを実行する場合はこのボタンを押します。プログラム実行中は「一時停止」 ボタンに変化します。実行する速度は「実行速度調整スライダー」で変化させることが できます。 始めから実行 実行ボタンと同じ。 一時停止 プログラム実行中に押すと実行を一時停止することができます。一時停止時は、 「再開」 のボタンに変化します。 再開 一時停止状態から実行を再開したい場合に使用します。再開後は、「一時停止」のボタ ンに変化します。 一行実行 「実行箇所マーカー」のある行を実行し、その後、一時停止状態になります。 始めに戻る プログラムの実行を取り止め、プログラムの最初に戻ります。 (b) 実行速度調整スライダー プログラムの実行速度を変更するためのスライダーです。 バーをゲージの左側に移動すると実行速度が速くなり、右側に移動すると遅くなります。 (c) 状態表示 状態表 意味 実行待ち プログラムを実行していない状態。プログラムの編集が可能。 実行中 通常にプログラムを実行している状態。 一時停止中 「一時停止」や「一行実行」によって実行が停止されている状態。 入力待ち プログラム内の入力文による入力待ち状態。入力はコンソール画面に行う。 実行終了 プログラムの実行が終了した状態。再度、プログラムを実行する場合は「始めから実 行」で行う。また状態を「実行待ち」に初期化するには「始めに戻る」で行う。 (d) 実行箇所マーカー これから実行する行を指し示しています。 この場面では 7 行目を実行する直前の状態になります 2
  • 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. 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. 3.4 演算結果のデータ型について 演算結果のデータ型は演算対象のデータ型によって決まる。 なお、演算前に演算結果のデータ型に変換してから、演算が行われる。 演算例 演算結果のデータ型 整数 + 整数 整数 実数 + 整数 実数 実数 + 実数 実数 文字列 + 整数 文字列として、文字列結合される 文字列 + 実数 文字列として、文字列結合される 文字列 + 文字列 文字列として、文字列結合される 4 出力文 4.1 改行あり出力 ≪出力文≫ を印刷する ≪出力文≫で指定された変数や文字列をコンソール画面に表示し、その後改行する。 4.2 改行なし出力 ≪出力文≫ を改行なしで印刷する ≪出力文≫で指定された変数や文字列をコンソール画面に表示し、その後改行をしない。 4.3 複数の変数・文字列の出力 変数や文字列を一緒に出力する場合、それらを「と」で結び列挙する。 使用例 変数 ans が 50 の場合の出力例 「答えは」 と ans と 「です」 を印刷する 答えは 50 です 5 代入文 5.1 代入 ≪変数≫ ← ≪式≫ ≪式≫に書かれた定数や式の演算結果を≪変数≫に指定された変数へ代入する。 なお、右辺の≪式≫の値の型のいかんに関わらず、代入によって、 左辺の≪変数≫のデータ型に自動変換される。 ≪式≫の演算結果が実数型で、左辺の≪変数≫が整数型の場合、小数点以下は切り捨てられる。 3
  • 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. 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. 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. 使用例 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. 変数 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. 付録 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. 前条件判定の繰り返し文 (while-do 文) ≪条件式≫ の間, | <処理> を ( 繰り返す | 繰返す ) 後条件判定の繰り返し文 (repeat-unil 文) ( 繰り返し | 繰返し ), | <処理> を, ≪条件式≫ になるまで実行 [する] 範囲指定の加算型繰り返し文 (for 文) ≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪増加値≫ ずつ増やし ( ながら | つつ ), | <処理> を ( 繰り返す | 繰返す ) 範囲指定の減算型繰り返し文 (for 文) ≪変数≫ を ≪数値 1 ≫ から ≪数値 2 ≫ まで ≪減少値≫ ずつ減らし ( ながら | つつ ), | <処理> を ( 繰り返す | 繰返す ) 2
  • 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. - JLabelクラスを拡張した状態表示ラベルクラス class ConsoleAppend - コンソール画面の「実行画面」と「履歴」に文字列を追加するクラス class ConsoleCopyButtonListener (implements java.awt.event.ActionListener) - メニュー - 編集 - 実行画面をコピーを実現しているクラス class EditAreaAddTab - インデントの個数を数え追加すべきインデントを返すクラス class EditAreaMouseListener (implements java.awt.event.MouseListener) class EditAreaUndoableEditListener (implements java.awt.event.ActionListener, javax.swing.event.UndoableEditListener) class EditButtonList class EditSelection class ExitButtonListener (implements java.awt.event.ActionListener) class FileDropOpen (implements java.awt.dnd.DropTargetListener) class javax.swing.filechooser.FileFilter class PenFileFilter class FileOpen class FileOpenButtonListener (implements java.awt.event.ActionListener) class FileSave class 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 PEN class RunClean class RunStop class RunTimeChangeListener (implements javax.swing.event.ChangeListener) class RunTimeMouseListener (implements java.awt.event.MouseListener) class SimpleCharStream class SimpleNode (implements Node) - 構文木のノード(AST~クラス)のスーパークラス class ASTAbs class ASTAddNode class ASTANDNode class ASTArray
  • 43. class ASTArrayNum class ASTAssignStat class ASTAssignStats class ASTASTAssignStat class ASTBlock class ASTCeil class ASTCosine class ASTDecl class ASTDivNode class ASTDoWhileStat class ASTDoWhileStat2 class ASTElseIfStat class ASTEOF_STR class ASTEQNode class ASTErrorOccur class ASTExtract class ASTFile_close class ASTFile_flush class ASTFile_getline class ASTFile_getstr class ASTFile_isfile class ASTFile_opena class ASTFile_openr class ASTFile_openw class ASTFile_putline class ASTFile_putstr class ASTFile_remove class ASTFile_rename class ASTFloatLiteral class ASTFloor class ASTForStat class ASTForStatAdd class ASTFunction class ASTFunctionCall class ASTFunctionVar class ASTgColor class ASTgDrawArc class ASTgDrawBox class ASTgDrawLine class ASTgDrawOval class ASTgDrawPoint class ASTGENode class ASTGet class ASTGetStat class ASTgFillArc class ASTgFillBox class ASTgFillOval class ASTgFillPoint class ASTGTNode
  • 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
  • 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. | 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. | 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 RP gWindowOpen ::= gWindowOpen AddExpr CM AddExpr RP gWindowClose ::= gWindowClose RP gColor ::= gColor AddExpr CM AddExpr CM AddExpr RP
  • 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. 付録 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. | 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. | 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. ); } 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-
  • 54. } MORE: { /* :COMM } COMMSPECIAL_TOKEN: { COMMENT: */ :DEFAULT } COMMMORE: { ~[] } SKIP : { ~[] { ++nLexicalErrors; new ConsoleAppend( ### + input_stream.getBeginLine() + 行目で + エラーです : ' + image + 'n ); } } void IntVUnit() : { Token t; } { ( try { VarDecl() | Function() | Stat() | EOF { return; } | ErrorOccur() } catch (ParseException e) { ++nParseErrors; new ConsoleAppend(### + e.getMessage() + n); throw new ParseException(); do { t = getNextToken(); } while (t.kind != SM t.kind != RC t.kind != EOF); } )* } JAVACODE void ErrorOccur() { ParseException e = generateParseException(); throw e; } void Function() : { Token t; } 付録 F -5/17-