Полнофункциональная библиотека регулярных выражений в чистом Lua - PullRequest
0 голосов
/ 08 января 2019

Я пишу аддон Elder Scrolls Online, который поддерживается слегка модифицированным движком Lua 5.1 под названием Havok Script . Эта среда Lua не разрешает доступ к модулям os, io, package, debug или любым привязкам собственной платформы, и нет способа обойти это ограничение, поскольку ESO является проприетарным программным обеспечением.

В этой ограниченной среде мне нужен полнофункциональный движок регулярных выражений с обходной функциональностью (отрицательный и положительный взгляд вперед и назад). Производительность почти не имеет значения, но удобство - главная проблема (у меня нет времени или возможности написать свой собственный движок регулярных выражений).

Фактический синтаксис движка регулярных выражений менее важен, чем набор функций. Так что PCRE, JS regex, Java regex или .NET regex engine, любой из вышеперечисленных или даже что-то немного другое, вероятно, будет в порядке. POSIX слишком прост, потому что он не поддерживает обходное поведение.

Регулярные выражения будут непроверенными пользовательским вводом, но среда, по сути, является песочницей, поэтому пользователь не может сделать с ними ничего вредоносного. Поскольку ввод является вводом пользователя, я не могу просто использовать что-то вроде LPEG; пользовательская база будет абсолютно возражать против необходимости изучать совершенно новую концепцию, такую ​​как LPEG, вместо относительно знакомого синтаксиса регулярных выражений.

При поиске двигателей регулярных выражений Lua я исчерпал несколько вариантов:

  • Привязки к нативной платформе, такие как lregexp и другие привязки libpcre Lua. Это категорически не будет и никогда не будет работать для моего варианта использования, потому что среда не может получить доступ к собственной платформе, поэтому они отсутствуют.
  • reLua , который поддерживает базовые «обычные» паттерны, такие как чередование и жадные замыкания, но абсолютно не ищет обходного поведения. У меня нет возможности добавить lookaround к этому проекту, поэтому, если не существует форка с этим добавлением, я не могу его использовать.
  • Транспортировка полного движка регулярных выражений, реализованного в чистом JavaScript (без использования встроенных функций регулярных выражений JS), в Lua с использованием castl. Это было несколько многообещающе, но я столкнулся с роковым недостатком в замке и, по-видимому, также тесселем , в том, что Lua имеет искусственно низкий переменный предел на область действия 200, и эти транспортеры не у меня нет никакого способа обойти это (то, что они должны были бы сделать, это объявить одну локальную переменную в виде таблицы и поместить все данные в эту таблицу, а затем изменить все ссылки в исходном JS из локальных переменных в доступы к таблицам в Lua) , Поскольку это такая фундаментальная проблема, я не уверен, что это может сработать, но, возможно, самое близкое решение - попытаться решить эту проблему, решив ее каким-либо образом?
  • Я искал транспортеры с других языков, кроме JS, но не нашел ни одного. По сути, единственные компиляторы «X language in pure Lua», которые я смог найти, были castl и tessel.
  • Я также (в отчаянии) попытался передать обновленную версию, , расшифровав libpcre (для непосвященного: код C, скомпилированный в JS), а затем перенес , что в Lua, используя castl. Это приводит к еще более странной ошибке Lua при запуске кода, когда интерпретатор Lua не может найти метку, к которой его просили goto, несмотря на то, что эта метка явно присутствует в коде. Я могу только предположить, что это потому, что сгенерированный код настолько огромен, что Lua просто перестает пытаться его искать.

В данный момент я зашел в тупик; Я не знаю, как поступить, чтобы получить функциональность, которую я хочу. Есть ли библиотека, которая предоставляет чистый Lua, полнофункциональный движок регулярных выражений для Lua, которого я еще не нашел? Я сдался на седьмой или восьмой странице Google.

1 Ответ

0 голосов
/ 12 января 2019

В зависимости от ваших точных требований, вы можете попробовать re модуль LPEG. Очевидным преимуществом является то, что это доступно практически везде, где доступен Lua. С другой стороны, вы должны иметь в виду, что это независимая реализация регулярного выражения и поэтому не совместима, например, с. POSIX. Однако, пока выражение достаточно простое, вы не должны замечать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...