Соответствие шаблону Lua для извлечения жестко закодированных строк в базе кода - PullRequest
2 голосов
/ 05 июля 2011

Я работаю с базой кода 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

Ответы [ 2 ]

1 голос
/ 05 июля 2011

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

0 голосов
/ 05 июля 2011

Во втором случае вы забыли экранировать скобки.Попробуйте

for word in string.gmatch(str, 'TRANS%s*%(%s*(%b"")%s*%)') do print(word) end
...