3

pycparserこのCコードを解析するために使用しようとしています:

https://github.com/nbeaver/mx-trunk/blob/0b80678773582babcd56fe959d5cfbb776cc0004/libMx/d_adsc_two_theta.c

最小限の例と Makefile を含むリポジトリは次のとおりです。

https://github.com/nbeaver/pycparser-problem

pycparserDebian Jessie で v2.14 (pip から) と gcc 4.9.2 を使用。

私が試したこと:

  • -nostdincフラグをgccフォルダーfake_libc_includeに渡します。
  • -D'__attribute__(x)='GCC エクステンションの取り出しに使用
  • たとえば、偽のヘッダーを使用します<sys/param.h>
  • -std=c99コードが C99 互換でない場合に使用します。
  • 私のマシンに異常がある場合に備えて、 redis の例を再現します。

トレースバックは次のようになります。

Traceback (most recent call last):
  File "just_parse.py", line 21, in <module>
    parse(path)
  File "just_parse.py", line 9, in parse
    ast = pycparser.parse_file(filename)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/__init__.py", line 93, in parse_file
    return parser.parse(text, filename)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/c_parser.py", line 146, in parse
    debug=debuglevel)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/ply/yacc.py", line 265, in parse
    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/ply/yacc.py", line 1047, in parseopt_notrack
    tok = self.errorfunc(errtoken)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/c_parser.py", line 1680, in p_error
    column=self.clex.find_tok_column(p)))
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/plyparser.py", line 55, in _parse_error
    raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: in/d_adsc_two_theta.c:63:82: before: .

トレースバックは次の行を指しています。

https://github.com/nbeaver/mx-trunk/blob/0b80678773582babcd56fe959d5cfbb776cc0004/libMx/d_adsc_two_theta.c#L63

次に、この#defineマクロを指します。

https://github.com/nbeaver/mx-trunk/blob/0b80678773582babcd56fe959d5cfbb776cc0004/libMx/mx_motor.h#L484

4

1 に答える 1

0

原因はoffsetof()機能にあるようです。ただし、最小限の作業例は最近のコミットによって修正されています。

https://github.com/eliben/pycparser/issues/87

于 2016-09-14T18:09:13.770 に答える