这篇博客也就简单记录一下。这两天有这样一个需求,将一行C++源代码变成按空格输出的Token Stream,例如将这一行:
ros::init(argc, argv);
变成:
ros :: init ( argc , argv ) ;
这个需求很简单,但是我尝试用了srcML和Antlr,都没有现成的实现,最后想到用Understand来实现,我之前也写过很多Understand相关的博客,有不了解的朋友可以简单翻翻。
最后直接贴一下代码,虽然还有很多格式、字符、换行上的小问题,但是基本功能就是这样了:
use Understand;
system( "und -quiet create -db temp.udb -languages c++ add " . $ARGV[0] . " analyze" );
$project_name=$ARGV[1];
( $db, $status ) = Understand::open("temp.udb");
die "Error status: ", $status, "\n" if $status;
$output_file=">Source2Plain".$project_name.".csv";
open( OUTFILE, $output_file );
@file_list=$db->ents("c file");
foreach $file (@file_list){
$loc=$file->metric("CountLineCode");
$lexer=$file->lexer();
@lexemes=$lexer->lexemes();
foreach $lexeme (@lexemes){
$text_content=$lexeme->text();
if($text_content eq " "){
next;
}
print OUTFILE $lexeme->text();
print $lexeme->text();
print OUTFILE " ";
print "|";
}
}