1

私はpython初心者です。私の目的は、C のインクルード ファイルを Python に変換することです。例えば。

入力ファイル (stdincl.c)

#define STDIN_BASEADDRESS 0x40600000
#define STDOUT_BASEADDRESS 0x40600000

/******************************************************************/

/* Definitions for driver UARTLITE */
#define XPAR_XUARTLITE_NUM_INSTANCES 1

期待される出力ファイル (reg.py)

def STDIN_BASEADDRESS ():
    return 0x40600000
def STDOUT_BASEADDRESS ():
    return 0x40600000
# Definitions for driver UARTLITE 
def XPAR_XUARTLITE_NUM_INSTANCES ():
    return 1

置換するパターンのセットを保持するために辞書を使用してコードを記述しようとしましたが、実際には機能しませんでした。どんなアイデアでも大歓迎です..

4

2 に答える 2

1

#define行は定数を作成します。それらのためにPythonで変数を作成するだけです:

STDIN_BASEADDRESS = 0x40600000
STDOUT_BASEADDRESS = 0x40600000

# ******************************************************************

# Definitions for driver UARTLITE
XPAR_XUARTLITE_NUM_INSTANCES = 1

したがって、その部分を削除して、等号#defineを挿入するだけです。=正規表現のセットがその仕事をします:

import re
from functools import partial

replacements = (
    partial(re.compile(r'\s*#define ([A-Z_]+) (.*)').sub, r'\1 = \2'),
    partial(re.compile(r'\s*/\*\s*(.*?)\s*\*/').sub, r'# \1'),
)   

for line in inputsequence:
    for transform in replacements:
        line = transform(line)
    print line

デモ:

>>> import re
>>> from functools import partial
>>> replacements = (
...     partial(re.compile(r'\s*#define ([A-Z_]+) (.*)').sub, r'\1 = \2'),
...     partial(re.compile(r'\s*/\*\s*(.*?)\s*\*/').sub, r'# \1'),
... )   
>>> for line in inputsequence:
...     for transform in replacements:
...         line = transform(line)
...     print line
... 
STDIN_BASEADDRESS = 0x40600000
STDOUT_BASEADDRESS = 0x40600000

# ****************************************************************

# Definitions for driver UARTLITE
XPAR_XUARTLITE_NUM_INSTANCES = 1

それでも定義を関数に変換したい場合は、置換パターンを調整するだけです:

partial(re.compile(r'\s*#define ([A-Z_]+) (.*)').sub, r'def \1():\n    return \2'),

その結果:

def STDIN_BASEADDRESS():
    return 0x40600000
def STDOUT_BASEADDRESS():
    return 0x40600000

# ****************************************************************

# Definitions for driver UARTLITE
def XPAR_XUARTLITE_NUM_INSTANCES():
    return 1
于 2013-06-29T09:40:47.090 に答える