Для удаления комментария в Lua


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

Поэтому я сделал один. Этот скрипт распознает все типы комментариев, таких как одно-и многострочные комментарии.

Мне хотелось бы услышать Ваше мнение.

# written in Python 3.2

import codecs
import re

inputFilePath = 'testfile.lua'
inputLuaFile = codecs.open( inputFilePath, 'r', encoding = 'utf-8-sig' )
inputLuaFileDataList = inputLuaFile.read().split( "\r\n" )
inputLuaFile.close()

outputFilePath = 'testfile_out.lua'
outputLuaFile = codecs.open( outputFilePath, 'w', encoding = 'utf-8' )
outputLuaFile.write( codecs.BOM_UTF8.decode( "utf-8" ) )

def create_compile( patterns ):
    compStr = '|'.join( '(?P<%s>%s)' % pair for pair in patterns )
    regexp = re.compile( compStr )

    return regexp

comRegexpPatt = [( "oneLineS", r"--[^\[\]]*?$" ),
                 ( "oneLine", r"--(?!(-|\[|\]))[^\[\]]*?$" ),
                 ( "oneLineBlock", r"(?<!-)(--\[\[.*?\]\])" ),
                 ( "blockS", r"(?<!-)--(?=(\[\[)).*?$" ),
                 ( "blockE", r".*?\]\]" ),
                 ( "offBlockS", r"---+\[\[.*?$" ),
                 ( "offBlockE", r".*?--\]\]" ),
                 ]

comRegexp = create_compile( comRegexpPatt )

comBlockState = False

for i in inputLuaFileDataList:
    res = comRegexp.search( i )
    if res:
        typ = res.lastgroup
        if comBlockState:
            if typ == "blockE":
                comBlockState = False
                i = res.re.sub( "", i )
            else:
                i = ""
        else:
            if typ == "blockS":
                comBlockState = True
                i = res.re.sub( "", i )
            else:
                comBlockState = False
                i = res.re.sub( "", i )
    elif comBlockState:
        i = ""

    if not i == "":
        outputLuaFile.write( "{}\n".format( i ) )


1101
4
задан 1 апреля 2011 в 09:04 Источник Поделиться
Комментарии
1 ответ

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


  • Что если ... появляется внутри строки?
    В этом случае он не должен быть
    комментарий.

  • Что, если кто-то заканчивается и начинается еще один на ту же линию: --]] --[[

  • Разделить на значение '\R\n', если вы запустите это на Linux-системе вы не будете иметь тех сепараторы линии

Во-вторых, некоторые ваши имена переменных могут использовать помощь.


  • Руководство по стилю Python recommonds
    underscore_style не верблюжьего для
    имена локальных переменных.

  • Вы используете некоторые аббревиатуры в названиях, я не думаю, что это хорошая идея. например, РЭС или comRegexPatt

  • У вас есть я, имя, которое дает очень маленький намек, что он делает

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

Как мне решить эту проблему: я мог бы написать CodeText класс, который содержит фактический код в вопрос, а затем написать код вроде этого:

def handle_code(code_text):
while code_text.text_remaining:
if code_text.matches('--'):
handle_comment(code_text)
elif code_text.matches('"'):
handle_string(code_text)
else:
code_text.accept()

def handle_string(code_text):
while not code_text.matches('"'):
code_text.accept()

def handle_comment(code_text):
if code_text.matches('[['):
handle_block_comment(code_text)
else:
while not code_text.matches('\n'):
code_text.reject()

def handle_comment_block(code_text):
while not code_text.match("--]]"):
code_text.reject()

6
ответ дан 1 апреля 2011 в 02:04 Источник Поделиться