2013-06-29 2 views
1

Я новичок python. Моя цель - преобразовать файл include в C в 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 

Я пытался писать коды, используя словарь, чтобы держать набор шаблонов, которые будут заменены но это действительно не сработало. Любые идеи оцениваются.

ответ

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 
+0

Благодаря Martijn, я попытался запустить код. Я получаю сообщение об ошибке. line = tranform (строка) NameError: имя 'tranform' не определено – user2532296

1

Вы можете использовать на Linux и, возможно, Mac OS X некоторые другие инструменты для обработки текста

cat "<PATH TO YOUR FILE>" | awk '/^#define/ {printf("%s = %s",$2,$3)}' > "<PATH TO *.PY>"