Генерация файла Python - PullRequest
2 голосов
/ 31 мая 2010

У меня проблемы с питоном (извините за мои личные чувства перед ..: P).

У меня есть текстовый файл, он содержит собственный язык, и я должен перевести его в рабочий код Python.

Ввод:

import sys  

n = int(sys.argv[1]) ;;print "Beginning of the program!"

LOOP i in range(1,n) {print "The number:";;print i}

BRANCH n < 5 {print n ;;print "less than 5"}  

Требуемый вывод выглядит в точности так:

import sys  

n = int(sys.argv[1])   
print "Beginning of the program!"

for i in range(1,n) :  
    print "The number:"  
    print i  

if n < 5 :  
    print n   
    print "less than 5"    

Имя входного файла читается из параметра. Выходной файл out.py. В случае неправильного параметра выдает сообщение об ошибке. ;; означает новую строку.

Когда я попытался это сделать, я создал массив, прочитал все строки в нем, разделив их на "". Тогда я хотел убрать это из отметок, которые мне не нужны. Я сделал 2 петли, один для строк, один для слов. И тогда я начал заменять вещи. Все шло хорошо, пока не дошло до отметки}. Он находит его, но не может заменить или лишить его. Я понятия не имею, что делать.

Мой код (он грязный, и в данный момент у меня нет записи в файл):

f = open('test.txt', 'r')
#g = open('out.py', 'w')
allWords = map(lambda l: l.split(" "), f.readlines())
for i in range(len(allWords)):
    vanfor = -1
    vanif = -1
    for j in range(len(allWords[i])):
        a=allWords[i][j]
        a=a.replace(";;","\n")
        a=a.replace("CIKLUS","for")
        a=a.replace("ELAGAZAS","if")
        if a == "for":
            allWords[i][j+3] = str(allWords[i][j+3])+" :\n"
        if a == "if":
            allWords[i][j+3] = str(allWords[i][j+3])+" :\n"
        zarojel=a.find('}')
        if zarojel>-1:
            a=a.rstrip('}')
        a=a.replace("}","")
        a=a.replace("{","")
        if vanfor == -1:
            vanfor=a.find("for")
        if vanif == -1:
            vanif=a.find("if")
        if (vanfor > -1) or (vanif > -1):
            a=a.replace("print","   print")
        if j != (len(allWords[i]))-1:
            allWords[i][j]=a+" "
        print allWords[i][j],

Может кто-нибудь помочь мне, пожалуйста? Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 31 мая 2010

Если вы измените самый конец вашей программы:

    # print allWords[i][j],
    print a,

вывод становится:

import sys  

n = int(sys.argv[1]) 
print "Beginning of the program!"

for i in range(1,n) :
   print "The number:"
   print i

if n < 5 :
   print n 
   print "less than 5"  

Выглядит довольно близко к тому, что вы хотите. Для вывода в открытый файл объекта g вместо стандартного вывода, просто еще одно крошечное изменение в самом конце программы ...:

    # print allWords[i][j],
    print>>g, a,
1 голос
/ 31 мая 2010

Быстрое решение проблемы (если вы используете ее для домашней работы, убедитесь, что понимаете, что происходит; может помочь следующее хорошее руководство по языку Python):

import sys
filename = sys.argv[1]

replace_dict = { ";;": "\n", "LOOP": "for", "BRANCH": "if", "{": ":{" }
indent_dict = { "{": 1, "}": -1, "\n": 0 }

lines = open(filename).readlines()
indent, output, pop_next_newline = 0, [], False

for line in lines:
    for key, value in replace_dict.iteritems():
        line = line.replace(key, value)
    for char in line:
        if char in indent_dict:
            indent += indent_dict[char]
            if pop_next_newline and char == "\n":
                pop_next_newline = False
            else:
                output.append("\n%s" % ("    " * indent))
            if char == "}": 
                pop_next_newline = True
        else:
            output.append(char)

print ''.join(output)  
...