2015-08-26 3 views
0

Примечание: питон 3,2Python парсер C++ простых выражения

Я хочу сделать сценарий питона, который recieves C++ простых выражений в качестве входных данных, и выводит те же самые выражения, как лексемы.

Я смутно помню свой курс в компиляции, и мне нужно что-то гораздо менее сложное, чем компилятор.

Примеры

int& name1=arr1[place1]; 
int *name2= arr2[ place2]; 

должен вывести

[ "int", "&", "name1", "=", "arr1", "[", "place1", "]" ] 
[ "int", "*", "name2", "=", "arr2", "[", "place2", "]" ] 

Пространства не имеет значения, и я не хочу их на выходе.

Это похоже на очень простую задачу для тех, кто знает, что они делают, в то время как я продолжаю получать мусорные пробелы или получать разделение в неправильных местах.

Я был бы весьма признателен быстрое решение для этого - это действительно выглядит как однострочника мне

Заметим, что мне нужно только такие выражения, как я показал здесь. Ничего особенного.

Благодаря

+0

Как правило, рекомендуется показать код, который у вас уже есть. –

+1

@EliKorvigo Я в военной среде, которая закрыта для мировой сети. Не удается получить код. Во всяком случае, я думал, что это будет простой вопрос, который не нуждается в предварительной работе. Если это не так. – Gulzar

+0

Если эти предложения не работают, попробуйте описать свой алгоритм, поскольку вы не можете отправлять код. –

ответ

1

Первый шаг заключается в замене пространства с пустым. то есть «с». Затем используйте функцию split. Составьте список специальных символов или слов и замените их специальным символом и разделителем. Разделите линию с разделителем. Вот пример:

for line in sys.stdin: 
    line = line.replace(' ', '') 
    line = line.replace('&',',&,') 
    a = line.split(',') 
+0

Хотя примеры не показывают его, что-то вроде «int a = 1;» также является допустимым выражением, которое должно возвращать ['int', 'a', '=', '1'], но удаление пробела будет неправильно сливать «int» и «a». – chthonicdaemon

+0

идеи в этом примере были для меня наиболее полезными, и мне удалось что-то сделать. Благодаря! – Gulzar

0

Вот генератор, который может сделать трюк:

def parseCPP(line): 
    line=line.rstrip(";") 
    word="" 
    for i in line: 
     if i.isalnum(): 
      word+=i 
     else: 
      if word: 
       yield word 
       word="" 
      if i!=" ": 
       yield i 

Примечание это только поднимает последовательные строки алфавитно-цифровых символов. Любые непространственные символы считаются операторами/токенами сами по себе.

Надеется, что это помогает :)

2

кажется мне, как вам нужно определить список «специальный/оператор» символы. Замените любой из этих символов собой, а также пробел с обеих сторон. Используйте string.split(), чтобы превратить строку в список «слов». Если вам требуется строковое представление, закончите с string.join (wordlist, «','») и добавьте «['» в начало и «']» до конца.

Я почти наверняка пропустил несколько вещей, таких как поиск точек с запятой, чтобы снять или использовать в разрыве конкатенированных выражений. Вы не были конкретно о том, сколько выражений вы читали сразу. Если вы читаете по многим за раз, вы можете разделить на символ с запятой, а затем перебрать полученный результирующий список выражений.

+0

вы можете предположить, что у меня есть одно такое выражение для каждой строки. так же просто, как и получается – Gulzar

+0

. Возможно, для этого есть умное понимание списка - кажется, что есть одно для всего. Вместо этого это простое предложение, которое я всегда стараюсь в первую очередь. –

1

не слишком знакомы с C++, но вы могли бы, возможно, использовать re.findall со списком специальных символов:

lines="""int& name1=arr1[place1]; 
int *name2= arr2[ place2];""" 
import re 
for line in lines.splitlines(): 
    print(re.findall("[\*\$\[\]&=]|\w+",line)) 
['int', '&', 'name1', '=', 'arr1', '[', 'place1', ']'] 
['int', '*', 'name2', '=', 'arr2', '[', 'place2', ']']