Как связать последовательность символов для подсчета как единое целое в шаблоне Lua?

Поэтому я пытаюсь разобрать #define операторы из файла C с использованием шаблонов Lua, но в многострочных определениях есть случай, когда вы можете экранировать символ новой строки с обратной косой чертой.

Чтобы я знал, где заканчивается определение, мне нужно уметь определять backslash + linebreak как если бы это был один символ, так что я могу получить дополнение этого, а затем использовать * квантификатор на нем, а затем считать до первого не экранированного перевода строки.

Как я могу это сделать?

1 ответ

Решение

Вы не можете просто заменить все вхождения "\\\n" с каким-то временным символом, потому что возникнет проблема с линией "c\\\\\n" в следующем примере.
Вместо этого вы должны реализовать мини-сканер для исходных файлов C:

local str = [[
#define x y
#define a b\
c\\
d();
#define z
]]

-- Print all #defines found in the text
local line = ""
for char in str:gmatch"\\?." do
   if char == "\n" then
      if line:sub(1, #"#define") == "#define" then
         print(line)
      end
      line = ""
   else
      line = line..char
   end
end

Выход:

#define x y
#define a b\
c\\
#define z
Другие вопросы по тегам