zoukankan      html  css  js  c++  java
  • Python编程实现对CodeSys中ST代码的自动排版(二)

    由于刚学Python,对很多知识都还是一知半解,欢迎各位大侠给出宝贵意见。

    上篇随笔中的代码基础上,又做了一些修改,完善了一些功能。

    (1)能够缩进IF..ELSIF..ELSE..END_IF语句

    (2)能够缩进WHILE....END_WHILE语句

    (3)能够缩进FOR...END_FOR语句

    (4)能够简单的缩进CASE...END_CASE语句,由于没有很好的办法判断CASE项,就暂时对CASE之后的代码进行了4个字符的缩进,以上三条都是缩进2个字符。

    (5)对输入输出的文件名进行了判断。测试方法是把源文件和生成的文件都放在了Python文件的同一目录下。

    上代码(每行代码写的太长了,好像需要滚动条.... :(  )

    1 #FormatCodeSysST.py
    2 #coding:gb2312
    3  import string
    4 getFile = raw_input("请输入要转换的文件名称(包括后缀名):")
    5  try:
    6 file_in= open(getFile,'r')
    7 Get_Flag = True
    8  except IOError:
    9 print "★文件读取失败★"
    10 raw_input("按回车键返回...")
    11 Get_Flag = False
    12
    13  if Get_Flag:
    14 outputFile = raw_input("请输入转换后保存的文件名称(包括后缀名):")
    15 try:
    16 file_out = open(outputFile,'w')
    17 Out_Flag = True
    18 except:
    19 print "★文件保存失败★"
    20 raw_input("按回车键返回...")
    21 Out_Flag = False
    22
    23  if Out_Flag:
    24 print "正在处理中,请稍候...."
    25 text1 = file_in.readline()
    26 lst1 = []
    27 #-----------------------------------------------------------------------------
    28   #删除行首和行末的空格
    29   while (text1 != ''):
    30 lst1.append(string.strip(text1))
    31 text1 = file_in.readline()
    32 indent = 0
    33 #-----------------------------------------------------------------------------
    34 #判断每一行的开头字符串,并根据不同的字符串进行不同的缩进
    35 for i in lst1:
    36 if (i[:3] == 'IF ') or (i[:3] == 'IF(') or (i[:len(i)]=='IF'): #if开头的行
    37 i = ' '*indent + i
    38 indent += 2
    39 elif (i[:5] == 'ELSE ')or (i[:len(i)] == 'ELSE') or (i[:5] == 'ELSE(') : #else开头的行
    40 indent -= 2
    41 i = ' '*indent + i
    42 indent += 2
    43 elif (i[:len(i)] == 'ELSIF')or (i[:6] == 'ELSIF ') or (i[:6] == 'ELSIF('): #elsif 开头的行
    44 indent -= 2
    45 i = ' '*indent + i
    46 indent += 2
    47 elif (i[:7] =='END_IF ') or (i[:len(i)] =='END_IF') or (i[:7] =='END_IF('): #end_if开头的行
    48 indent -= 2
    49 i = ' '*indent + i
    50 elif i[:6] == 'WHILE ' or i[:len(i)] == 'WHILE': #while开头的行
    51 i = ' '*indent + i
    52 indent += 2
    53 elif (i[:len(i)] == 'END_WHILE') or i[:10] == 'END_WHILE(' or i[:10] == 'END_WHILE ' :#end_while开头的行
    54 indent -= 2
    55 i = ' '*indent + i
    56 elif i[:4] == 'FOR ': #for开头的行
    57 i = ' '*indent + i
    58 indent += 2
    59 elif (i[:len(i)] == 'END_FOR') or (i[:8] == 'END_FOR(')or (i[:8] == 'END_FOR '): #end_for开头的行
    60 indent -= 2
    61 i = ' '*indent + i
    62 elif (i[:5]=='CASE '): #CASE开头的行
    63 i = ' '*indent + i
    64 indent += 4
    65 elif (i[:len(i)]=='END_CASE') or (i[:9]=='END_CASE(') or (i[:9]=='END_CASE '):#END_CASE开头的行
    66 indent -= 4
    67 i = ' '*indent + i
    68 else:
    69 i = ' '*indent + i
    70 file_out.write(i + '\n')
    71 print '转换完成!'
    72 file_in.close()
    73 file_out.close()
    74 raw_input("按回车键返回...")
  • 相关阅读:
    各种骚操作线段树
    CCPC qinhuangdao
    ACM ICPC 2017 Warmup Contest 3
    ACM ICPC 2017 Warmup Contest 2[菜鸡选手的成长]
    树状数组总结篇
    XDOJ 1152: 数据库查询
    POJ 1511Invitation Cards
    React非受控组件
    React 组件优化之函数防抖节流---使用 debounce +throttle 函数
    React脚手架工程化项目里ServiceWorker.js文件作用
  • 原文地址:https://www.cnblogs.com/dabiao/p/1694105.html
Copyright © 2011-2022 走看看