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.