我正在尝试从C源代码中提取特定的硬编码变量。我剩下的问题是我想解析数组初始化,例如:
#define SOMEVAR { {T_X, {1, 2}}, {T_Y, {3, 4}} }
将此示例解析为“{T_X,{1,2}}”和“{T_Y,{3,4}}”就足够了,因为这样可以递归以获得完整的结构。但是,它需要足够通用,以便能够解析任何用户定义的类型。
更好的是正则表达式列表,可用于从#define
,枚举和全局变量等常规C代码构造中获取额外值。
C代码是提供给我的,所以我无法控制它。我宁愿不写一个一次解析一个字符的函数。但是,有一系列正则表达式是可以的。
这不是将文件导入MATLAB或基本正则表达式的问题。我正在使用特定的正则表达式来保留括号中的分组。
编辑:看起来正则表达式不会进行递归或任意深度匹配。根据{{3}}和here。
答案 0 :(得分:1)
您是否查看了以下网站,该网站提供了有关正则表达式的大量教程和示例: -
答案 1 :(得分:1)
也许vim的语法文件会对此有所帮助。我不确定它是否有你寻找的那些元素(我不做C),但它有很多元素,所以它绝对是一个起点。下载vim(www.vim.org),并在vim / syntax / c.vim中查看一下。
答案 2 :(得分:1)
我认为正则表达式不适用于任意C代码。 Clang允许您从C代码构建语法树并以编程方式使用它。
可以很容易地用于全局变量,但#defines由预处理器处理,所以我不确定它们是如何工作的。
cristi:tmp diciu$ cat test.c
#define t 1
int m=5;
int fun(char * y)
{
float g;
return t;
}
int main()
{
int g=7;
return t;
}
cristi:tmp diciu$ ~/Downloads/checker-137/clang -ast-dump test.c
(CompoundStmt 0xc01ec0 <test.c:6:1, line:10:1>
(DeclStmt 0xc01e70 <line:7:2>
0xc01e30 "float g"
(ReturnStmt 0xc01eb0 <line:9:2, line:1:11>
(IntegerLiteral 0xc01e90 <col:11> 'int' 1)))
(CompoundStmt 0xc020a0 <test.c:13:1, line:16:1>
(DeclStmt 0xc02060 <line:14:2>
0xc02010 "int g =
(IntegerLiteral 0xc02040 <col:8> 'int' 7)"
(ReturnStmt 0xc01b50 <line:15:2, line:1:11>
(IntegerLiteral 0xc02080 <col:11> 'int' 1)))
typedef char *__builtin_va_list;
Read top-level variable decl: 'm'
int fun(char *y)
int main()
答案 3 :(得分:1)
我假设您有权访问相关的C代码。如果是,则定义两个宏:
#define BEGIN_MATLAB_DATA
#define END_MATLAB_DATA
包装要在这些宏之间提取的所有数据。编译C代码时,它们会扩展为空,所以它们不会在那里造成伤害。
现在,您可以使用非常简单的正则表达式来获取数据。
答案 4 :(得分:1)
答案 5 :(得分:1)
这个正则表达式:
(\{\s*[A-Za-z_]+)\s*,\s*\{\s*\d+\s*,\s*\d+\s*\}\s*\}
似乎很合理,但我不知道这对你来说是否足够。它充斥着\ s *以允许令牌之间的任意空格,从C的角度来看是允许的。它会匹配看起来或多或少只是你的例子;某种标识符后跟两个数字字符串。
答案 6 :(得分:1)
定义大括号匹配的formal language不是常规语言。因此,您无法使用正则表达式来解决问题。
问题是你需要一些方法来计算你已经遇到的开口支撑的数量。一些正则表达式引擎支持扩展功能,例如偷看,可用于解决您的问题,但这些可能很难处理。你可能最好为这项任务编写一个简单的解析器。