●実現方式(言語処理)について
スクリプトの文字列を分解して、コマンドに合わせて適切な処理をする必要があります.
通常、インタプリタ・コンパイラを作成するには、次の概念・処理が必要になります.
字句解析(Lexical
Analizer)
与えられた文字列(ソースコード)を字句(Token)に分解し識別する処理です.
例. 代入文 set a = 0 の場合
set 予約語、 a 文字列、 = 予約語、 0 数値
のように解析します.
構文解析(Syntax
Analizer)
字句解析から受け渡された字句の組合せを文法の意味にマッチさせる処理です.
例. 上記 set a = 0 の場合
setコマンドは、 set 変数名 = 数値 ですから構文にマッチします.
(文法エラーなし)
実行(Execute)
各コマンドに応じて処理を行います.(スクリプトの実行
- 文字表示、キー入力、メニュー選択など)
今回のスクリプトの文法はかなり単純なのであまり複雑なものにはならないでしょう? (でも、結構たいへん)
※Visual Basic、Visual C++などの本格的な言語などは、yacc(bison)、lex(flex)などのツールを利用することに
なります.(たぶん (^ ^; )
●実用性への考察
インタプリタは処理時間に難点があります. これを回避することを考えましょう.
スクリプトファイルを予め、コンパイラで中間コードに変換(コンパイル)しておき、それを解釈・実行します.
コンパイラ作業は次の処理を行います.
・コメント行の削除
・ラベル番号の割付け
・コマンドなどのコード化、順番の組替え
・ファイルのバイナリ化(ゲーム内容を非公開にできる)
余力があればぜひ挑戦してみよう!
はみ出しコーナー -
より深く理解するために
●インタプリタの概要
インタプリタの形態には以下のものがあります.
@ソースプログラムを読みながら逐次実行
A構文木などの中間形式にコンパイルしてそれを実行
B仮想マシンのためのコードを生成して仮想マシン上で実行
将来、本格的な言語を作成するにあたって知っておくべきことをまとめておきます.
たとえば、オリジナルなゲーム開発向け言語をつくるとか
......
参考文献などを読んで次の内容をおさえておきましょう.
正規表現(regular expression)
BNF(Backus-Naur Form) バッカス記法
構文規則を記述するための形式. ほとんどの言語(C、BASICなど)の構文を表現できる,
例. 四則演算とカッコからなる定数式の構文規則 100
+ 150、70 - 130 * 65、(45 + 13) * 95 など
<定数式> ::= <定数式> + <項>
| <定数式> - <項> | <項>
<項> ::= <項> * <因子> | <項>
/ <因子> | <因子>
<因子> ::= (<定数式>) | +<定数式>
| -<定数式> | <数>
<数> ::= <数><数字> | <数字>