2010-05-31 101 views
2

我遇到了Python的問題(對不起,我的個人感受之前..:P)。生成python文件

我有一個txt文件,它包含一個自定義語言,我必須將它翻譯成工作的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文件是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], 

有人能幫助我,好嗎? 在此先感謝!

+1

1.您還沒有發佈您的Python代碼,除了您想要的輸出示例。 2.你想責怪Python,但向那些欣賞Python的人尋求幫助?不,Python和它的圖書館對這個字符沒有特別的問題 - 你做錯了。 4.這顯然是功課;你應該添加「作業」標籤到你的問題。 – 2010-05-31 17:26:59

+3

當我上大學時,我的算法教授有一個嚴格的政策:如果你來到他的辦公室尋求幫助,而沒有你已經嘗試過的例子,我們會告訴學生走出去。以同樣的方式:走出去。 – 2010-05-31 17:30:10

回答

3

如果你改變你的程序的末尾:

# 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

非常感謝! 我改變了節目的結束,你說,並補充以下到開始: 進口SYS 名稱= STR(sys.argv中[1]) F =開放(姓名, 'R') 和現在它使用參數。再次感謝。 – 2010-05-31 18:09:41

+0

@fema,不客氣! (我忘了我還必須編輯txt文件來說CICKLUS而不是LOOP&c,但我想這是一個明顯的偶然的「半翻譯」,也就是說,你剛剛翻譯了txt文件中的單詞,而不是碼)。 – 2010-05-31 18:16:05

+1

是的,當我複製文本時,我忘了翻譯那個詞,對不起 – 2010-05-31 18:23:50

1

快速走在這個問題(如果你使用它的功課一定要了解發生了什麼;遵循一個好的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) 
+0

看起來不錯,謝謝! – 2010-05-31 19:37:24