Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lua
Войти
Регистрация
Восстановить пароль
 
lia_
0 / 0 / 0
Регистрация: 25.03.2018
Сообщений: 2
1

Необязательные блоки в регулярных выражениях Lua

25.03.2018, 20:07. Просмотров 296. Ответов 3

Йоханга!

Задача: на Lua хочется из строк "typedef struct", "typedef union", "typedef enum _dcodes" и т.п. вытащить:
1. typedef чего производится: "struct"/"union"/"enum"
2. имя структурной единицы, если оно есть: например, "_dcodes" из примеров выше

Возник вопрос, возможно ли это сделать в одном шаблоне?
Шаблон 1 из программы ниже подходит, если структура неименованная
Шаблон 3 подходит, если именованная

Возможно ли модифицировать 3 шаблон, чтобы всё после первого захвата было необязательным?
(Пример аналогичного требуемому регулярного выражения в Python приведен ниже)

-- Для экспериментов: прогон нескольких строк на нескольких шаблонах
rtypeDefArr = {
"typedef%s+(%w+)", -- 1
"typedef%s+(%w+)%s+", -- 2
"typedef%s+(%w+)%s+([_%w]+)", -- 3

"typedef%s+(%w+)%s+([_%w]+)?", -- 4 ??
}
lineArr = {
"typedef struct",
"typedef union",
"typedef enum _dcodes"
}
for n, rtypeDef in pairs(rtypeDefArr) do
print(string.format("\n\n\n pattern %u: "%s"", n, rtypeDef))
for m, line in pairs(lineArr) do
mn, ms = string.match(line, rtypeDef)
print(string.format("\n%d: "%25s" "%s" -> "%s" ", m, line, mn or "-", ms or ""))
end
end
Вывод программы:
pattern 1: "typedef%s+(%w+)"
1: " typedef struct " "struct" -> ""
2: " typedef union" "union" -> ""
3: " typedef enum _dcodes" "enum" -> ""

pattern 2: "typedef%s+(%w+)%s+"
1: " typedef struct " "struct" -> ""
2: " typedef union" "-" -> ""
3: " typedef enum _dcodes" "enum" -> ""

pattern 3: "typedef%s+(%w+)%s+([_%w]+)"
1: " typedef struct " "-" -> ""
2: " typedef union" "-" -> ""
3: " typedef enum _dcodes" "enum" -> "_dcodes"

pattern 4: "typedef%s+(%w+)%s+([_%w]+)?"
1: " typedef struct " "-" -> ""
2: " typedef union" "-" -> ""
3: " typedef enum _dcodes" "-" -> ""
Пример требуемого регулярного выражения на Python:
Python
1
2
3
4
5
6
7
rtypeDef = re.compile(r"""
    typedef\ +
    (\w+)           # 1 struct/union/enum
    \s*
    (\w*)?          # 2 Name of struct
    (//.*)?         # 3 Comment
    """, re.VERBOSE)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2018, 20:07
Ответы с готовыми решениями:

LUA + C++
Привет всем :) я чото не понимаю чо у меня выевляется ошибки luaavg.obj...

Установка Lua
Здравствуйте! Подскажите, пожалуйста как это сделать: Что бы вы могли...

Изучение Lua
Добрый день. Хочу начать изучать язык Lua но не знаю с чего начать. Может кто...

Lua script
Расшифруйте пожалуйста

Скрипты lua
Вопрос: вот я у себя на хабе (дсс) настроил викторину, а как мне сделать чтобы...

3
vantfiles
115 / 47 / 23
Регистрация: 07.05.2013
Сообщений: 167
27.03.2018, 23:39 2
Знаете, возможности шаблонов Луа сильно ограничены по сравнению с регулярными выражениями...
У меня сложилось впечатление, что вы пытаетесь втиснуть достаточно широкую задачу в рамки стандартных возможностей Луа...
Если не сложно, поясните, какую именно задачу вы решаете, я, честно говоря, этого не понял даже из столь развернутого объяснения...
0
lia_
0 / 0 / 0
Регистрация: 25.03.2018
Сообщений: 2
28.03.2018, 00:33  [ТС] 3
Конкретно в этом примере - искать в строке соответствие шаблону "typdef name1 name2" и получать найденные значения name1 и name2. Причем имя name2 - не обязательное. т.е. должно быть следующее соответствие строка-результат:
"typedef struct" -> "struct", Nil
"typedef union" -> "union", Nil
"typedef enum _dcodes" -> "enum", "_dcodes"

А более глобально, - имея файл с описанием структур на языке Си сгенерировать код для распечатки всех полей заданной структуры ("разбирая" структуру до базовых типов.) Например из файла
C
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct S_
{
    int a; 
    char b;  
} S;
 
typedef struct 
{
    S k; 
    int m[3];  
} B;
 
B sample;
получить для структуры sample:
C
1
2
3
4
5
    printf("\n    sample.k.a = %8.8x", sample.k.a);
    printf("\n    sample.k.b = %8.8x", sample.k.b);
    printf("\n  sample.m[0] = %8.8x", sample.m[0]);
    printf("\n  sample.m[1] = %8.8x", sample.m[1]);
    printf("\n  sample.m[2] = %8.8x", sample.m[2]);
0
vantfiles
115 / 47 / 23
Регистрация: 07.05.2013
Сообщений: 167
28.03.2018, 08:52 4
Мне кажется, паттерны для этого не подходят вообще. То есть, для решения этой задачи требуется традиционная связка:
лексический анализатор -> синтаксический анализатор -> словарь идентификаторов

Простой пример:
C
1
2
3
4
5
6
7
8
9
10
11
typedef
  struct  /* почему бы и не с новой строки */
    _str_001 { /* и скобка может быть в любом месте */
  int a;
  unsigned int b, * c; /* перечисление переменных, и указателей */
  /* float f;
     комментарий может быть и многострочным */
  char str [
             123
           ]; /* случается и такое */
} _Str_001;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2018, 08:52

Плагин на Lua
Я не программист и всего чуток разбираюсь в Lua, поэтому все манипуляции с...

Быстродействие Lua
Мне не раз приходилось видеть, что ядро програмы написано на С++, а...

*.lua in *.exe
Кто знает как скрипт на луа компилить в исполняемый файл, подскажите, хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru