challenge α置換

標準入力から与えられたソースコードの変数名
を置換するプログラムを作ってください。
最近はリファクタリングツールなどの普及でこ
のような需要は少ないかと思われますが、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;
}

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")

Index

Feed

Other

Link

Pathtraq

loading...