プログラミング言語 PG0
言語仕様
--
■はじめに
プログラミング学習を目的としたプログラミング言語です。

プログラミングに最低限必要となる基本構造(順次、分岐、反復)の理解を目的としています。
そのため非常に割り切った言語仕様となっています。
分岐や反復の方式は一種類ずつとし、扱える型は整数のみとしています。

■型
型は整数型のみです。
整数型は4バイト(-2,147,483,648~2,147,483,647)の数値が扱えます。
小数は扱えません。
	a = 1234 //10進数
	a = -123 //負の数

■変数
変数は数値を代入するための入れ物です。
変数は使用した時点で自動的に確保されます。
最初に代入がない場合は整数の 0 で初期化されます。
var を使って変数を明示的に宣言することもできます。
	var i, j = 100 //「,」で複数指定可能

ブロック内で確保された変数はブロック内でのみ有効です。
同一ブロック内で同一変数を確保した場合はエラーとなります。
	var x
	{
		var x //内側のブロックでのみ有効な変数xを確保
		x = 100
	}
	y = x //xの値は 0

変数名に使える文字は英数字と_(アンダーバー)です。ただし先頭に数値は使えません。
変数名の大文字小文字は同一視して扱われます。

数値のみの記載は定数となります。

■配列
配列は変数を連続的に並べた入れ物です。
配列を扱うには変数の後に[]を指定します。
	a[0] = 100 //先頭
	a[1] = 200 //2番目
	b[i] = 10 //インデックスに変数を指定
[]内に数値を指定すると配列のインデックスとしてアクセスします。
インデックスは 0 から始まる正の値となります。
配列の大きさは自動的に拡張されます。
	a[100]   //101個の配列を用意
多次元配列にするには、配列の各次元の後ろに[]を付加します。
	a[1][0] = 300 //2次元配列

インデックスを空にすると配列そのものを表し配列の代入や連結を行えます。
	a[] = b[]       //bの配列をaにコピー
	a[] = b[] + c[] //bとcの配列を連結してaにコピー
整数型に配列を代入すると配列となり、配列に整数型を代入すると整数型となります。
	a = b[]   //a[] = b[] と等価
	a[] = 0   //a = 0 と等価

配列の初期化を行うには {値1,値2,値3,...} を代入します。
	a[] = {1,2,3} //a[0] = 1;a[1] = 2;a[2] = 3; と等価
	a[] = {1,2,{10,20,{100,200,300}},3} //多次元の初期化
	b = {100, 200}[1] //b に 200 が入る

空の配列初期化 {} は使えません。

■式
変数、定数の計算や比較の条件などを式で表します。
全ての式は実行した結果を値として返します。

式の結果について真偽は以下のように定義しています。
	真: 0以外
	偽: 0

・算術演算子
	-------+-----+---------------------
	a + b   加算  a と b の合計
	a - b   減算  a から b を引いた残り
	a * b   乗算  a と b の積
	a / b   割算  a と b の商
	a % b   剰余  a を b で割った余り
	-------+-----+---------------------

・単項演算子
	----+----------------------------------------------
	+a   正の値
	-a   負の値
	!a   a が 0 なら 1 にして 0 ではない場合に 0 にする
	----+----------------------------------------------

・代入演算子
	左の変数に右式の値を設定します。
		a = 5 //a は 5 になります。
		b = a + 5 //b は 9 になります。

・関係演算子
	比較を行い 1 か 0 を返します。
	-------+------------------+-----------------------------------------
	a == b  等しい             a と b が等しい時に 1
	a != b  等しくない         a と b が等しくない場合に 1
	a < b   より少ない         a が b より少ない時に 1
	a > b   より多い           a が b より多い時に 1
	a <= b  より少ないか等しい a が b より少ないか等しい時に 1
	a >= b  より多いか等しい   a が b より多いか等しい時に 1
	-------+------------------+-----------------------------------------
	※ 配列同士の比較の場合は配列内のデータを比較します。
	   配列の比較は == と != のみが使えます。

・論理演算子
	------+------+------------------------------------------
	a && b 論理積 a と b が真の場合に 1、それ以外は 0
	a || b 論理和 a または b のどちらかが真の場合に 1、それ以外は 0
	------+------+------------------------------------------
	※ 論理演算子は短絡評価となります。

・演算子の優先順位
	高
		() []
		! + -
		* / %
		+ -
		< > <= >=
		== !=
		&&
		||
		=
		,
	低

■基本構造
[順次]
・文
	一つの文は改行もしくは「;」で区切って記述します。
	文は上から順番に実行されます。
		a = 1 //1番目に実行、a に 1 を代入
		b = 2 //2番目に実行、b に 2 を代入
		
	複数行に文を記述するには継続する行の末尾を演算子で終わるように記述します。
	以下は「a = 1 + 2」を2行で記述した例です。
		a = 1 + //次の行に継続
		    2
・ブロック
	ブロックは {~} で括って複数の文をまとめて一つの文として扱います。
		{
			a = 1
			b = 2
		}
[分岐]
・if
	if文は条件により文の実行を制御します。
	if文に続く文はブロックで記載する必要があります。
		if (式) {
			文
		}
	式の結果が真の場合に文を実行し、偽の場合は文を実行しません。
		if (a > b) {
			b = a //a が b より大きい場合に b に a を代入
			a = 0
		}
	式の中での代入「=」は構文エラーとなります。
・else
	if文で式が偽になり文が実行されない場合の文を指定します。
	if文で文が実行された場合はelse文に続く文は実行されません。
	else文に続く文はブロックで記載する必要があります。
		if (a > b) {
			b = a
		} else {
			a = b
		}
[反復]
・while
	while文は式によりループを行います。
	while文に続く文はブロックで記載する必要があります。
		while (式) {
			文
		}
	式の結果が真の間、文を実行し続けます。
		i = 1
		while (i <= 10) { //1から10までループ
			i = i + 1
		}
	式の中での代入「=」は構文エラーとなります。

■その他
コメントは // ~ 行末 です。

実行中の処理を強制終了する場合は exit を呼びます。
	exit
exit には戻り値を設定できます。
	exit i

--
Copyright (C) 1996-2018 by Ohno Tomoaki. All rights reserved.
    WEB SITE: https://www.nakka.com/
    E-MAIL: nakka@nakka.com