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 - Other

文字列の処理がうまくいってませんでした。。。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
--- alpha.cs.release1   2008-04-09 01:11:32.000000000 +0900
+++ alpha.cs.release2   2008-04-09 01:14:15.000000000 +0900
@@ -65,13 +65,12 @@
       
       switch (st) {
       case State.InStr:  //文字列リテラルの中
+        buf.Append(c);
         if (c == '\\') {
-          buf.Append(c);
           if (++pos < strIn.Length) {
             buf.Append(strIn[pos]);
           }
         } else if (c == '"') {
-          buf.Append(c);
           this.state.Pop();
         }
         break;

Index

Feed

Other

Link

Pathtraq

loading...