More Related Content Similar to [修士論文] 入力支援機能を備えた日本語表記による初学者向けプログラミング学習環境の構築 Similar to [修士論文] 入力支援機能を備えた日本語表記による初学者向けプログラミング学習環境の構築 (20) [修士論文] 入力支援機能を備えた日本語表記による初学者向けプログラミング学習環境の構築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
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
6. 2 プログラミング教育に必要な支援機能
ここではまず、2.1において従来のプログラミング演習で初学者が直面する問題を挙げ
る。2.2では、本研究で考えるプログラミング教育の目標を明白にし、2.3では、その教育
目標を達成するためのプログラミング環境としてどのような機能が必要かについて考察
する。
2.1 プログラミング演習の難しさ
初学者は、プログラミング演習の初期の段階でつまずくことが多い。演習初期段階では
タイプミスに起因する文法エラーが多く発生し、意味の理解できないコンパイルエラー
メッセージを(多くの場合英語で)突き付けられ、それだけで自信をなくす者も少なくない。
文法エラーの修正ばかりに気を取られていると、プログラムの構造をどのように組み立て
るかといった、全体への配慮ができず、プログラミングの力がなかなか身につかないこと
が多い。また、コンパイルエラーがなくなっても、論理的なエラーのために予想していた
のと違う結果が返ってくると対処することが難しい。論理的なエラーはエラーメッセージ
が表示されないので、間違い箇所をみつけるためには、変数に何が代入されているかを逐
次チェックしていかなければならない。デバッガを用いれば、このようなチェックは比較
的容易に行うことができるが、多くのデバッガは初学者が使うことを考慮しておらず、使
いにくいことが多い。
2.2 「プログラミング」入門教育の目標
1にで述べたように、ここで想定している「プログラミング入門」は、大岩レポート[10]
でいうところの「プログラミング」を目指すものであり、職業技能としてのプログラミン
グ言語の習得を目的とするものではない。「プログラミング」習得の目的は、文献[11]に示
されている通りであり、要約すると次の通りである。
プログラミングを、決まった正解を求める機械的な作業のようにとらえるのは、
まったくの間違いである。プログラミングは、無限の解法が存在する、まさに創造
的な作業というべきであり、その過程そのものが教育的に有益である。自分が考え
たことを決められたルールに従って、きちんと記述するという訓練は、自分の知識
状態や考え方を明確にする力を養える。また、プログラムのデバッグは、間違い発
見のプロセスであり、自ら発見するという学習そのものであり、自立的な思考力を
養える。このような効果を得るためには、プログラムを書いて、実際に動かしてみ
2
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
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
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
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
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-