Я работаю с базой кода C ++. Прямо сейчас я использую код C ++, вызывающий скрипт lua, чтобы просмотреть всю базу кода и, надеюсь, вернуть список всех строк, которые используются в программе.
Рассматриваемым строкам всегда предшествует макрос JUCE с именем TRANS. Вот несколько примеров, которые должны извлечь строку
TRANS("Normal")
TRANS ( "With spaces" )
TRANS("")
TRANS("multiple"" ""quotations")
TRANS(")")
TRANS("spans \
multiple \
lines")
И я уверен, что вы можете представить некоторые другие возможные строковые переменные, которые могут встречаться в большой кодовой базе. Я делаю автоматический инструмент для генерации файлов формата JUCE-перевода, чтобы максимально автоматизировать процесс
Я дошел до такого уровня, когда соответствовал шаблону, чтобы найти эти строки. Я преобразовал исходный код в строку lua
path = ...
--Open file and read source into string
file = io.open(path, "r")
str = file:read("*all")
и называется
for word in string.gmatch(string, 'TRANS%s*%b()') do print(word) end
, который находит шаблон, который начинается с TRANS, имеет сбалансированные скобки. Это даст мне полный макрос, включая скобки, но оттуда я решил, что будет довольно легко отделить жир, который мне не нужен, и просто сохранить фактическое значение строки.
Однако это не работает для строк, которые вызывают дисбаланс в скобках.
например, TRANS(")")
вернет TRANS(")
вместо TRANS("(")
Я изменил свой шаблон на
for word in string.gmatch(string, 'TRANS%s*(%s*%b""%s*') do print(word) end
где шаблон должен начинаться с TRANS, затем с 0 или нескольких пробелов. Тогда он должен иметь (символ, за которым следует ноль или более пробелов. Теперь, когда мы находимся в скобках, у нас должно быть сбалансированное количество "" знаков, за которыми следуют еще 0 или много пробелов, и, наконец, заканчивается символом a). К сожалению, это не возвращает единственное значение при использовании. Но ... я думаю, что даже если бы это сработало так, как я ожидал ... Внутри может быть \"
, что вызывает дисбаланс скобок.
Какой-нибудь совет по извлечению этих строк? Должен ли я продолжать пытаться найти последовательность соответствия шаблону? или я должен попробовать прямой алгоритм ... Знаете ли вы, почему мой второй шаблон не вернул строки? Любой другой совет! Я не собираюсь покрывать 100% всех возможностей, но быть близким к 100% было бы здорово. Спасибо! : D