我正在使用 pycparser 解析一些在解析之前无法使用 cpp 编译的 C 代码,因此我使用以下函数手动剥离所有注释和预处理器指令:
def remove_comments(text):
def replacer(match):
s = match.group(0)
if s.startswith('/') or s.startswith('#'):
return ""
else:
return s
pattern = re.compile(
r'#.*?$|//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
re.DOTALL | re.MULTILINE
)
return re.sub(pattern, replacer, text)
这是示例中memmgr.c文件中此函数的输出:
typedef ulong Align;
union mem_header_union
{
struct
{
union mem_header_union* next;
ulong size;
} s;
Align align_dummy;
};
typedef union mem_header_union mem_header_t;
static mem_header_t base;
static mem_header_t* freep = 0;
static byte pool[POOL_SIZE] = {0};
static ulong pool_free_pos = 0;
void memmgr_init()
{
base.s.next = 0;
base.s.size = 0;
freep = 0;
pool_free_pos = 0;
}
static mem_header_t* get_mem_from_pool(ulong nquantas)
{
ulong total_req_size;
mem_header_t* h;
if (nquantas < MIN_POOL_ALLOC_QUANTAS)
nquantas = MIN_POOL_ALLOC_QUANTAS;
total_req_size = nquantas * sizeof(mem_header_t);
if (pool_free_pos + total_req_size <= POOL_SIZE)
{
h = (mem_header_t*) (pool + pool_free_pos);
h->s.size = nquantas;
memmgr_free((void*) (h + 1));
pool_free_pos += total_req_size;
}
else
{
return 0;
}
return freep;
}
void* memmgr_alloc(ulong nbytes)
{
mem_header_t* p;
mem_header_t* prevp;
ulong nquantas = (nbytes + sizeof(mem_header_t) - 1) / sizeof(mem_header_t) + 1;
if ((prevp = freep) == 0)
{
base.s.next = freep = prevp = &base;
base.s.size = 0;
}
for (p = prevp->s.next; ; prevp = p, p = p->s.next)
{
if (p->s.size >= nquantas)
{
if (p->s.size == nquantas)
{
prevp->s.next = p->s.next;
}
else
{
p->s.size -= nquantas;
p += p->s.size;
p->s.size = nquantas;
}
freep = prevp;
return (void*) (p + 1);
}
else if (p == freep)
{
if ((p = get_mem_from_pool(nquantas)) == 0)
{
printf("!! Memory allocation failed !!\n");
return 0;
}
}
}
}
但我得到了这个 ParseError:
pycparser.plyparser.ParseError: :1:15: before: Align
pycparser 有什么问题?