2007年12月19日

日本語プログラミング言語の仕様を考えてみる

前回作ってみたものをどう発展させようか。以前から考えていたものをまとめてみた。できる限り細かく考えてみたが、整合性がとれるかどうか作ってみないと分からないし、それをプログラムできるかどうか分からない。とにかく考えていることを言葉で表すとこんな感じになる。


■プログラムの構成要素についての定義

文字:
・プログラムの表記を構成する最小単位は文字である。
・文字のコードは16ビットユニコードである。
・エスケープコードによって表現されたものも一つの文字である。
・空白、タブ、改行も文字である。
・空白文字とは空白、タブ、改行である。
・空白文字をエスケープコードで表現したものは空白文字とは見なされない。
・空白文字の連続は一つの空白として扱われる。
・空白は空白文字以外の文字の連続を分割する。

記号:
・記号は一つの文字もしくは複数の文字の連続によって表され、それを構成する文字の列があらかじめ複数定義されている。
・記号は定義されているものの中で最も長いものとしてのみ解釈される。
・記号とそれに隣接する文字や記号とは間に空白が無くても分割されている。

数値:
・先頭から末尾までの文字が数値を表すものとして解釈されるもののみが数値である。
・数値には整数と実数がある。
・整数は小数点を含まない。

ワード(単語):
・分割されていない文字の一つ以上の連続をワードと呼ぶ。
・ワードには属性がある。
・記号は記号という属性をもったワードである。
・整数を表す文字の連続からなるワードは整数という属性をもつ。
・実数を表す文字の連続からなるワードは実数という属性を持つ。
・同一の引用符記号(”’"')に囲まれた文字の連続は、文字列という属性を持つワードである。
・文字列には空白も含めることができる。
・ワードには、言語仕様であらかじめ用意された手順によって値や手順を割り当てることができる。
・ワードに値を割り当てるということは、値を返す手順を割り当てることである。
・ワードは最初それ自身の文字の連続を値として返す手順が割り当てられている。
・数値は常にそれが表す数値を値として持つ。
・文字列は常にそれを構成する文字の並びを値として持つ。

ノード:
・ノードとはワードとリストをまとめて呼ぶための名前である。
・ワードはワードという属性を持ったノードと考えることもできる。
・リストはリストという属性を持ったノードと考えることもできる。

リスト:
・リストはノードによって構成される。
・そのリストを構成するノードを要素と呼ぶ。
・リストは別のリストの要素となるとき、対になるリスト引用符(「」[])で囲まれる。

プログラム:
・プログラムはリストである。
・リストの最初の要素から順に各要素が消費され、実行されていく。


■プログラムの解釈について
・プログラムは文の並びである。
・文は並んでいる順序で解釈される。
・文には単純文と式文がある。
・単純文はいくつかの目的語と述語からなる。
・句点(。)は文を区切る記号であり、それを越えて目的語の探索をしない。
・読点(、)は単なるワードを区切る記号である。
・述語には手順が割り当てられて、それに従って解釈される。
・述語は解釈され値を返すものと値を返さないものがある。
・値を返す述語は必ず値を返す。
・値を返さない述語は必ず値を返さない。
・述語の名前はそれを構成する文字そのものである。
・目的語を持たない単純文もある。
・後置詞は述語とともに定義される。
・述語は後置詞によって目的語の値を受け取り、手順の処理で利用する。
・目的語には後置詞が続いている。
・目的語と後置詞は連結されていてもよい。
・目的語と後置詞の間には空白文字があってもよい。
・後置詞を伴わない目的語も許される。
・後置詞の並びには順序がある。
・同じ名前の述語でも違う後置詞を伴う場合は別のものとみなされる。
・同じ名前の述語で同じ後置詞を伴う場合でも後置詞の順序が違うものは別のものとみなされる。
・目的語の解釈は、述語の解釈に先立っておこなわれる。
・値を返さない目的語があれば、その単純文の解釈は中止され例外が発生する。
・目的語は文である。
・目的語となれるものでもっとも単純なものは、目的語を持たない述語である。
・一つの文章に多くの述語が使われ、目的語の所属の判断が複雑になる場合は、括弧「()()」を使って優先順位を明確にする。
・目的語の探索は再帰的に右側の目的語から決定されていく。
・式文は式によって記述された文であり、必ず値を返す。
・式には単項式と二項式、そしてリスト式がある。
・単項式は単項演算子と項からなり、値を返す。
・二項式は項と二項演算子と項からなり、値を返す。
・演算子には結合順位と結合方向があり、それに従って解釈される。
・演算子は言語仕様に含まれ、新たに定義することはできない。
・演算子は記号であるものと記号でないものがある。
・演算子の項の属性が、演算子が要求するものではないときは例外が発生し、解釈が中止される。
・項は、より結合順位の高い式、もしくは述語のみからなる単純文、もしくは括弧で囲まれている値を返す文である。
・リスト式は、リスト引用符(「」)で囲まれたリストである。
・リスト式の値は、そのリストそのものである。
・述語には名詞形と動詞形がある。
・後置詞の直前には、動詞形の述語は直接置けない。
・動詞形は必要に応じて活用する。
・例外を発生させる述語、およびそれをとらえる述語がある。

将来的にはクラスが扱えるようにしてもいいが、とりあえずそれを考えない。作るとすればこんな感じになるだろう。

クラス(分類):
・インスタンス変数は、「(インスタンス名)の(変数)」で表記する。
・クラス変数は、「(クラス名)の(変数)」で表記する。
・インスタンスメソッドは、「(インスタンス名)を(メソッド)」で表記する。
・クラスメソッドは、「(クラス名)を(メソッド)」で表記する。


そしてこれらの規則に従って基本命令が定義されている。

繰り返し文:
<整数式>回 「<リスト>」を 繰り返す。
「<リスト>」を <整数式>回 繰り返す。
「<リスト>」を <論理式>になるまで 繰り返す。
「<リスト>」を <論理式>の間 繰り返す。
<論理式>になるまで 「<リスト>」を 繰り返す。
<論理式>の間 「<リスト>」を 繰り返す。
「<リスト>」の要素を順に<ワード>とおいて 「<リスト>」を 繰り返す。
「<リスト>」を 「<リスト>」の要素を順に<ワード>とおいて 繰り返す。

判断文:
<論理式>ならば 「<リスト>」を 実行する。
<論理式>でなければ 「<リスト>」を 実行する。
<論理式>ならば 「<リストA>」を、それ以外ならば 「<リストB>」を実行する。
<論理式>ならば 「<リストA>」を、<論理式>ならば 「<リストB>」を、<論理式>ならば 「<リストC>」を、それ以外ならば 「<リストZ>」を実行する。

定義文:
<文>を<ワード>とする。
<文>を<ワード>とおく。
<文>を<ワード>と呼ぶ。
<ワード>に<文>を代入する。
<ワード>←<文>
<ワード>:=<文>

手順の定義:
{<ワード>-<後置詞>} <ワード>の手順 <リスト> 手順終わり


これを一度に実現させることはできないだろうが、暇なときにちょっとずつ作ってみよう。


posted by takayan at 02:53 | Comment(0) | TrackBack(0) | 日本語プログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック