SNOBOL

出典: フリー百科事典『ウィキペディア(Wikipedia)』

2021年11月22日 (月) 12:46; Slappi (会話 | 投稿記録) による版 (→‎概要)(日時は個人設定で未設定ならUTC

(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

SNOBOLは、米国AT&Tベル研究所のグリスウォルド(Ralph Griswold)らにより開発されたプログラミング言語である。

概要[編集]

テキスト処理を目的として1960年代に作られた。欧州を中心に、言語処理のツールとして普及し、現在でも使われている[要出典]。名前「SNOBOL」は「文字列指向の記号言語」を意味する英語「string oriented symbolic language」に由来するとされることがあるが(バクロニム)、実際には英語の「snowball's chance in hell」(地獄に雪玉がある可能性、まったく見込みがないこと)という言い回しに由来する[1]

SNOBOLの初版は1962年に作られた。最新版のSNOBOL4は1966年以降に開発された[1]

言語の特徴としては table と呼ばれる機能を実装していることである、これは後に連想配列として発達し多くの言語で採用されるに至っている。ゆえに SNOBOL は連想配列の祖といえる。また記述された文字列のパターンを認識し、分割することができる。この機能により文字列の解析を得意としている。

GriswoldはSNOBOLの後継としてIconを開発している。

基本的な構文[編集]

SNOBOL の構文は以下のようになっている(ラベルと次に処理する行のラベルは省略可能である)。

 ラベル   式  :(次に処理する行のラベル)

SNOBOLは構造化プログラミングが提唱される以前の言語であるため、ループは基本的に無条件分岐(goto文)で行われる。全ての式は実行後、次に処理する行のラベルを選択でき、省略時は次の行が実行される。標準入出力はINPUT/OUTPUTという変数に代入処理を行うことで実行される。if文に相当する物は無く、代わりに式を実行後、成功か失敗かで次に処理する行を変更することができる。これは具体的には

	LINE = INPUT :S(LABEL1) F(LABEL2)

のような場合(これは標準入力から1行読み込み変数 LINEに代入している)、その処理が成功した場合は LABEL1の行の処理へ、失敗した場合は LABEL2の行の処理へ遷移することを表している。

SNOBOLでは基本的な集合があらかじめキーワードとして定義されている。例えば小文字の集合("abcdefghijklmnopqrstuvwxyz")は &LCASE というキーワードで表す事ができる、同様に大文字の集合である &UCASEというキーワードもある。

連想配列[編集]

SNOBOL の特徴としてテーブル型という連想配列の原型のデータ構造の存在がある。これは

 	変数名 = TABLE()

という形で定義し、変数名[文字列] というように使用することができる。

パターンマッチング[編集]

SNOBOLではパターンマッチングの処理が存在する。これは以下のように行われる

	WORD = "abc123defABCgh"
* パターンの定義
	PAT = SPAN(&LCASE) . ITEM

* パターンマッチング
	WORD PAT =
* "abc" と表示される
	OUTPUT = ITEM

	WORD PAT =
* "def" と表示される
	OUTPUT = ITEM

変数 PAT は &LCASE(アルファベットの小文字)のパターンである。上記処理では文字列の変数 WORD とパターンマッチングを行い、PATに無いパターンが来たら、そこまでの結果を ITEMに格納する。次に同様の処理を始めるときは ITEM 以降の文字列がパターンマッチングされる。

サンプルコード[編集]

次のサンプルコードは標準入力されたファイルの内容を読み込み、各単語毎にカウントして出力するプログラムの一例である。

	&TRIM = 1
	WORD = "'-" '0123456789' &LCASE
	PAT = SPAN(WORD) . ITEM
	DATA = TABLE()
READ	LINE = REPLACE(INPUT, &UCASE, &LCASE) :F(DONE)
DIV	LINE PAT = :F(READ)
	DATA[ITEM] = DATA[ITEM] + 1 :(DIV)
DONE	A = CONVERT(DATA, 'ARRAY') :F(EMPTY)
	I = 0
PRINT	I = I + 1
	OUTPUT = A[I,1] '=' A[I,2] :S(PRINT) F(END)
EMPTY	OUTPUT = 'This file have no words'
END

脚注[編集]

関連項目[編集]

外部リンク[編集]