【问题标题】:Generating a python file生成一个python文件
【发布时间】:2010-05-31 17:22:38
【问题描述】:

我遇到了 python 的问题(对不起,我之前的个人感受......:P)。

我有一个 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.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.除了您想要的输出示例之外,您还没有发布您的 Python 代码。 2. 想责怪 Python 却向欣赏 Python 的人求助? 3. 不,Python 和它的 re 库没有 } 字符的特殊问题——你做错了。 4.这显然是功课;您应该在问题中添加“作业”标签。
  • 在我上大学的时候,我的算法教授有一个严格的政策:如果你到他的办公室寻求帮助,但没有你已经尝试过的例子,我们会告诉学生们离开。同样的道理:出去。

标签: python compiler-construction programming-languages


【解决方案1】:

如果您更改程序的最后:

    # 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,

【讨论】:

  • 非常感谢!正如你所说,我更改了程序的结尾,并在开头添加了以下内容: import sys name = str(sys.argv[1]) f = open(name, 'r') 现在它使用参数。再次感谢。
  • @fema,不客气! (我忘了我还必须编辑 txt 文件以说 CICKLUS 而不是 LOOP &c,但我想这显然是您的意外“半翻译”,即您刚刚翻译了 txt 文件中的单词,但没有翻译代码)。
  • 是的,我复制文本时忘记翻译那个词了,对不起
【解决方案2】:

快速解决问题(如果您将它用于家庭作业,请确保您了解发生了什么;遵循良好的 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)  

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 2018-04-21
    • 2015-02-13
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多