α置換
Posted feedbacks - Python
標準モジュールのtokenizeを使い実装しました。 トークンレベルで調べているのでクラス名かどうかの判断をすごく簡単に自前でやっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import tokenize
from StringIO import StringIO
def alpha(s, old_name, new_name):
result = []
before_tok = ()
for toknum, tokval, _, _, _ in tokenize.generate_tokens(StringIO(s).readline):
if toknum == tokenize.NAME and tokval == old_name \
and (not (before_tok[0] == tokenize.NAME and before_tok[1] == "class")):
result.append((toknum, new_name))
else:
result.append((toknum, tokval))
before_tok = (toknum, tokval)
return tokenize.untokenize(result)
print alpha("""
class a:
a = 3
pass
def foo():
a = 3
return 0
a = 0
c = a
""", "a", "b")
|

gandalf #6153() Rating-2/6=-0.33
標準入力から与えられたソースコードの変数名 を置換するプログラムを作ってください。 最近はリファクタリングツールなどの普及でこ のような需要は少ないかと思われますが、viな ど貧弱なエディタを使っているときに困る のが変数名の置換です。さすがに以下の例のよ うなプログラムは例としてしか書きませんが、 置換しようとしている変数名と同じ綴りの他の ものがプログラム中に出てくることはまれにあ ります。そこで、与えられたソースコードに現 れる変数だけを指定された名前に置換してくだ さい。 置換対象となるソースコードと使用言語は同じ ものを使ってください。与えられるソースコー ドは、完全なコンパイル単位、もしくはパース して意味が通る範囲のものどちらであってもか まいません。後者の場合、一番外側の変数だけ 置換できるようにしてください。 C言語での解答例をつけたかったのですが、と ても難しかったためまだ作成できていません。 ご容赦ください。 例 $ cat a.c /* a */ int foo() { struct a {int a;} a; #if FOO a.a = 1; #endif { int a; } return 0; } $ alpha -DFOO=1 b a < a.c /* a */ int foo() { struct a {int a;} b; #if FOO b.a = 1; #endif { int a; } return 0; }[ reply ]