まとまってきた。※module直後の改行がある場合には非対応
※「module」直後の改行に続けての「モジュール名」や
「MODULE名直後に改行してのインスタンス名」
となっている場合には、まだまだ非対応。
<解説>
test13.pl では、
[a-zA-Z0-9_]+
や
[a-zA-Z0-9\\\.\/_]+
という表現をやめて、
[^ \t\n\r\f]+ :[^ \t\n\r\f] は「空白文字以外の文字」なので、
こちらが意識して「この文字とこの文字と・・・」と指定しなくても
空白以外なら何でも表してくれるので好都合。
を積極的に使ってみた。
→思いのほか、いい感じに仕上がったかもしれない。
【その他】
10 $line =~ s#\(# \(#;
も新しく導入したもので、
module MODULE名(
と
module MODULE名 (
など、MODULE名やインスタンス名との境界に「空白」を必ず入れる処理を
予め施してから、マッチングを実施するようにして、
分かり易くした。
※一応 \s* (0個以上の空白)で正規表現入れてはいるが、
今回やりたいのは、
置換とかではなく
MODULE名と
や
INSTANCE名
の取得
が主なので元のテキストに操作を加えたものが表示されようが構わない。
※元のテキストにも書き込むわけでもない(open処理などしてない)
test13.pl
----------------------------------------------
1 #!usr/bin/env perl
2
3
4 $i= 0;
5
6
7 while($line = <>){
8
9 $i=$i+1;
10 $line =~ s#\(# \(#;
11
12 # if ( $line =~ m/^\s*module\s*([a-zA-Z0-9_]+)/ ) {
13 if ( $line =~ m/^\s*module\s*([^ \t\n\r\f]+)\b/ ) {
14 printf ("%4d ", $i);
15 print "module : ";
16 print $line;
17 $modulename = $1; #()内をキャプチャして変数へ
18 # } elsif ( $line =~ m/^\s*([a-zA-Z0-9_]+)\s+([a-zA-Z0-9\\\.\/_]+)\s*\(/ && $line !~ m/^\s*module/) {
19 } elsif ( $line =~ m/^\s*([^ \t\n\r\f]+)\s+([^ \t\n\r\f]+)\s*\(/ && $line !~ m/^\s*module/) {
20 printf ("%4d ", $i);
21 print "instance: ";
22 print "$modulename,";
23 print $line;
24 }
25
26 }
-----------------------------------------------
<実行結果>
---------------------------------------------
shin@ubuntu:~/TEXToperation$ perl5.10.1 test13.pl test001.v
1 module : module HOGEMODULE ( // No space
16 instance: HOGEMODULE,DUMMY Instance ();
18 instance: HOGEMODULE,INST instance1 ( );
19 instance: HOGEMODULE,INST instance2 ( );
20 instance: HOGEMODULE,INST \instance3 ( );
21 instance: HOGEMODULE,INST \insta/nce4 ( );
22 instance: HOGEMODULE,INST \insta_nce5 ( );
23 instance: HOGEMODULE,INST \insta7nce6 ( );
24 instance: HOGEMODULE,INST insta.7nce7 ( );
29 instance: HOGEMODULE,INST instance9 ( )
30 instance: HOGEMODULE, INST insta10 ( );
32 instance: HOGEMODULE,INSTout inStance01 ( );
38 module : module HOGE2 ( // space x 1
46 module : module HOGE3 ( // tab x 1
48 instance: HOGE3, INST instance1 ( );
49 instance: HOGE3, INST instance2 ( );
50 instance: HOGE3, INST \instance3 ( );
51 instance: HOGE3, INST \insta/nce4 ( );
52 instance: HOGE3, INST \insta_nce5 ( );
53 instance: HOGE3, INST \insta7nce6 ( );
58 module : module HOGE4 ( // tab x 1 + space x 2
60 instance: HOGE4, INST \insta/nce4 ( );
61 instance: HOGE4, INST \insta_nce5 ( );
66 module : module HOGEreg001 (
69 instance: HOGEreg001, INST \insta/nce4 ( );
70 instance: HOGEreg001, INST \insta_nce5 ( );
--------------------------------------------------------
<test001.v>
**********************************
module HOGEMODULE ( // No space
input hoge ;
output hogege;
reg aaa ;
reg aaa ; // hoge hoge hoge
for ( i=0 ; i<0 ; i++ ) begin
end
DUMMY Instance ();
INST instance1 ( );
INST instance2( );
INST \instance3 ( );
INST \insta/nce4 ( );
INST \insta_nce5 ( );
INST \insta7nce6 ( );
INST insta.7nce7 ( );
INST
instance8 ( );
INST instance9 ( )
INST insta10 ( );
INSTout inStance01 ( );
**********************************
参考文献)
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm