2016-07-25 13 views
2

は私が解析したい。この例のCファイルを持っている:pycparserを使ってCの構造体内で構造体を解析していますか?

StrcutWithinStruct.c 
// simple struct within a struct example 

struct A { 
int a; 
}; 

struct B { 
A a; 
int b; 
}; 

を、私は結果として次のコード

exploreStruct.py 
#parse StructWithinStruct 

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

と、それを解析するpcyparserを実行しています、私は次のように得た:

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内のstructを処理できますか、しませんか? 私は、これはいくつかの基本的な要件であると思ったので、私は、問題がどこかに私の構成で横たわっていることをかなり確信している...

もう一つ:私はEli Bendersky @ pcypareser作成者は、1がuse Clang to parse C++べきであると言うことを知っていますしかし、私は現在、C++(好ましくはPython以上)を解析するための別のオプションがあるかどうかを知りたいと思っており、使いやすいです。

ありがとうございました。

がさらにA自体だけでは十分であろうA C++ではCのタイプ名ではなく、Cで、あなたはstructキーワードを追加する必要があります。

答えて

4

あなた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

セミコロンは、ここでタイプミスです。元のコードに存在していました。 + CとC++の違いについて+1して、私はC++の解析についても尋ねたのですが...私はC++で作業していますが、構造体を型として宣言する方法に実際の違いがあるかどうかはわかりませんでしたname ... –

+2

@BakItzik Cでは、struct型は識別子の別の領域です。したがって、型を参照するときは明示的に記述する必要があります。しかし、C++では 'struct'は' class'に相当します。デフォルトの初期継承型 'private'は' public'に置き換えられています。したがって、C++で 'struct'キーワードで宣言された型は、' class'として宣言された型と同じように、グローバルに利用可能な型名になります。 – CiaPan

関連する問題