搜索并替换字符串,如下所示

时间:2013-05-06 13:24:54

标签: c string replace yacc lex

我正在读一个文件说x.c,我必须找到字符串“shared”。一旦找到类似的字符串,就必须完成以下操作。

示例:

shared(x,n)

输出必须是

*var = &x;
*var1 = &n;

指针可以是任何名称。输出必须写入不同的文件。怎么做?

我正在使用lex和yacc为并发平台开发源代码编译器。这可以是用C编写的例程,或者如果你可以使用lex和yacc。有人可以帮忙吗? 感谢。

3 个答案:

答案 0 :(得分:1)

如果你声明,参数只能是变量而不是任何其他表达式,那么有几个简单的解决方案。

一种是使用正则表达式,并使用非常简单的正则表达式对整个文件进行简单的搜索/替换。

另一个是简单地将整个源文件加载到内存中,使用strstr搜索"shared(",并使用例如strtok获取参数。将所有其他内容逐字复制到目的地。

答案 1 :(得分:0)

利用C预处理器。

将它放在文件的顶部

#define shared(x,n) { *var = &(x); *var1 = &(n); }

并通过cpp运行。这也将包括外部资源并替换所有宏,但您只需从代码中删除所有#something行,使用注入的预处理器规则进行转换,然后重新添加它们。

顺便说一句,为什么不在头文件中设置一个简单的宏来供开发人员使用?

有疑问:varvar1来自哪里?

编辑:如johnchen902所示更正

答案 2 :(得分:0)

说到预处理器,我会这样做:

#define shared(x,n) (*var=&(x),*var1=&(n))

为什么我认为它比esseks的答案更好? 假设这种情况:

if( someBool )
    shared(x,n);
else { /* something else */ }

在esseks的回答中,它将成为:

if( someBool )
    { *var = &x; *var1 = &n; }; // compile error
else { /* something else */ }

在我的回答中,它将成为:

if( someBool )
    (*var=&(x),*var1=&(n)); // good!
else { /* something else */ }