2016-07-25 234 views
2

我有這個例子C文件我想分析:使用pycparser解析struct C中的struct?

StrcutWithinStruct.c 
// simple struct within a struct example 

struct A { 
int a; 
}; 

struct B { 
A a; 
int b; 
}; 

我跑pcyparser解析它,用下面的代碼

exploreStruct.py 
#parse StructWithinStruct 

from pycparser import parse_file 
ast = parse_file(filename='..\StructWithinStruct.c') 
ast.show() 

其結果是,我得到了以下內容:

Tracback (most recent call last): 
    File "exploreStruct.py", line 3, in <module> 
    ast = parse_file(filename='...\StructWithinStruct.c') 
    File "D:\...\pycparser\__init__.py", line 93, in parse_file 
    return parser.parse(text,filename) 
    File "D:\...\pycparser\c_parser.py", line 146, in parse 
    debug=debug_level) 
    File "D:\...\pycparser\yacc.py", line 331, in parse 
    return self.parseropt_notrack(input, lexer, debug, tracking, tokenfunc) 
    File "D:\...\pycparser\yacc.py", line 1181, in parseropt_notrack 
    tok=call_errorfunc(self.errorfunc, errtoken, self) 
    File "D:\...\pycparser\yacc.py", line 193, in call_errorfunc 
    r=errorfunc(token) 
    File "D:\...\pycparser\c_parser.py", line 1699, in p_error 
    column=self.clex.find_tok_column(p))) 
    File "D:\...\pycparser\plyparser.py", line 55, in _parse_error 
    raise ParseError("%s: %s % (coord, msg)) 
pycparser.plyparser.ParserError: D:...\StructWithinStruct.c:7:2: Before A 

那麼,pycparser是否可以處理結構體內的struct,或者不是? 我認爲這是一些基本的要求,所以我敢肯定,趴在我的配置某處的問題...

一兩件事:我知道pcypareser作者,@Eli Bendersky,說一個人應該use Clang to parse C++ ,但我想知道現在是否有另一種選擇來解析C++(最好是通過Python),並且用戶友好。

感謝。

回答

4

struct聲明沒有關閉分號:

此外A本身不是C中的類型名稱在C++ A僅此一項就足夠了,但在C你需要添加struct關鍵字。

struct A { 
int a; 
}; 

struct B { 
struct A a; 
int b; 
}; 

或者,你可以聲明的代名詞了typedef關鍵字:

struct A { 
int a; 
}; 

typedef struct A A; 

,或者更短:

typedef struct A { 
int a; 
} A; 

從這一點聲明

A a; 

應C妥善保存。

+0

分號在這裏是一個錯字。並存在於原始代碼中。 +1與C到C++之間的區別,我想這就是爲什麼我問及解析C++的原因......我正在使用C++,但不知道在將結構聲明爲類型的方式上存在實際差異名稱... –

+2

@BakItzik在C中,結構類型是一個單獨的標識符空間,所以您必須在引用某個類型時顯式聲明狀態。然而,在C++中,'struct'相當於一個'class',只是默認的初始繼承類型'private'替換爲'public'。因此,在C++中用'struct'關鍵字聲明的類型成爲全局可用的類型名稱,與聲明爲'class'的類型相同。 – CiaPan