Kodama's home / tips.

Modula2 から Sather への変換.

Modula2 から Sather へのプログラムの移植用に, 簡易変換子を作ってみた.

ここで, かなり期待した方にはお気の毒だが, 単にいくつかの単語をすり替えるだけだ. 完全な自動変換を目標にすると厄介だが, 手作業のための前処理という位置づけだと, 実現は簡単だ. これでも, 手作業での書き換えがかなり楽になる.

#!/usr/local/bin/ruby 

REPLACEID={
	"IMPLEMENTATION"=>"", "DEFINITION"=>"", "MODULE"=>"class",
	"PROCEDURE"=>"def",
	"END"=>"end", "BEGIN"=>"-- begin",
	"IF"=>"if", "ELSIF"=>"elsif", "ELSE"=>"else", "THEN"=>"then",
	"LOOP"=>"loop", "WHILE"=>"loop while!", "EXIT"=>"break!", 
	"REPEAT"=>"loop", "UNTIL"=>"until!",
	"FOR"=>"loop", "TO"=>".upto!", "DO"=>";",
	"RETURN"=>"return", "IN"=>".in",
	"AND"=>"and", "OR"=>"or", "NOT"=>"~",
	"TRUE"=>"true", "FALSE"=>"false",
	"INTEGER"=>"INT", "CARDINAL"=>"INT", "LONGINT"=>"INT", "LONGCARD"=>"INT",
	"BOOLEAN"=>"BOOL", "REAL"=>"FLT", "CHAR"=>"char", "ARRAY"=>"array",
	"VAR"=>"inout", "CONST"=>"const",	
	"VertexC"=>"VERTEXC"	
}

REPLACESYM={
	"#"=>"/=", "<>"=>"/=", "><"=>"\=", "=<"=>"<=", "=>"=>">=",
	";"=>"; "
}

def scan
r="";
if /\d/=~ $l[0,1] then # numeric
	while /\d/=~$l[0,1] do; r+=$l[0,1]; $l=$l[1..-1]; end;
	return r;
elsif /\w/=~ $l[0,1] then # id
	while /\w/=~$l[0,1] do; r+=$l[0,1]; $l=$l[1..-1]; end;
	if "POINTER"==r; # POINTER TO
		while /\s/=~$l[0,1] do; r+=$l[0,1]; $l=$l[1..-1]; end;
		while /\w/=~$l[0,1] do; r+=$l[0,1]; $l=$l[1..-1]; end;
	end;
	if REPLACEID.has_key?(r) ; r=REPLACEID[r]; end;
	return r;
else # symbol
	r+=$l[0,1]; $l=$l[1..-1];
	if (/[<>=]/=~r)&&(/[<>=]/=~$l[0,1]); r+=$l[0,1]; $l=$l[1..-1]; end;
	if REPLACESYM.has_key?(r) ; r=REPLACESYM[r]; end;
	return r;
end;
end;

$l=$stdin.read; lo=""
while $l.size>0 do; r=scan; lo+=r; end;
lo.gsub!(/; *;/,";");
print lo;
# end of the script

Kodama's home / tips.