字句解析

よし、大体できた。と。

var line = 0;

var table = [

		// 基本は ["パターン" : 値] のペア
		// マッチしたら next_token関数は
		// [値:マッチデータ] というペアを返してくる。
		["[a-zA-Z_][0-9a-zA-Z_]+":2],
		["=":4],
		["\\[":5],
		["\\]":6],
		["\"[^\"]*\"":7],
		["[0-9]+":8],
		["[;:]":9],
		[",":10],


		// null を指定すると無視してマッチングを続ける
		["[ \t]+":null],

		// 値に関数を指定するとマッチしたときに呼ばれるようになる
		// 値を返せば、それがnext_tokenの戻り値になる。
		// nullを返せば、無視してマッチングを続ける
		["\n": function(){ line = line+1; return null; } ]
];


var lexer = Lex.generate_lexer( table );
var f = file.open_rstream("file.ilog");

for ( var i=0; i<20; i=i+1 ) {
	print( (lexer.next_token(f)).chain[0] );
	print( "\n" );
}

print( "\n\nline = " );
print( line );
print("\n");

で、これで自分自身を字句解析した結果が、

var
line
=
0
;
var
table
=
[
[
"[a-zA-Z_][0-9a-zA-Z_]+"
:
2
]
,
[
"[ \t]+"
:
null
]


line = 4

こうなる。
このくらいやっておけば、定型処理は殆ど必要なくなるはず。


次はmatch文の類いだな。これができれば、字句解析〜構文解析機械語生成 までの一連の流れが実装できるようになるはずだ。それができたら、バージョン6.626E-34をリリースでいいか。
ここまでのソース


訂正: コンマの位置間違えてた。