我只是试图编写一个伸缩代码,该代码将在扩展宏之后读取C文件并将其写入另一个文件。我的想法是将在程序开头声明的宏定义存储在(键,值)对数组中。因此,用于检测宏定义的正则表达式可以是(到目前为止,仅考虑#define语句):
%x DEFINE
%x DEFINE2
"#define" {BEGIN DEFINE};
<DEFINE>[a-zA-Z]+ {/* key = yytext*/}
<DEFINE>[ ] { BEGIN DEFINE2;/* begin the second state when a whitespace is encountered, it means the second part of the definition*/}
<DEFINE2>[a-zA-Z]+ { /* arr[key] = yytext; (storing the key value pair) */}
<DEFINE2> [ \t\n]+ {BEGIN INITIAL;}
这些表达方式是不言自明的。我在扩展宏时面临的主要挑战是检测是否存在存储在这些语句中的宏键。如何处理这种宏语句?:
#define square(x) ((x)*(x))
...
int a,b = 4;
a = square(b);
最好的方法可能是在遇到#define
语句时向flex规范添加新的正则表达式。但是我认为这是不可能的。
那么,有什么解决方案可以有效地扩展宏?在实践中如何完成?