Kodama's home / tips.
ここで, かなり期待した方にはお気の毒だが, 単にいくつかの単語をすり替えるだけだ. 完全な自動変換を目標にすると厄介だが, 手作業のための前処理という位置づけだと, 実現は簡単だ. これでも, 手作業での書き換えがかなり楽になる.
#!/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.