Как реализовать эффективный токенизатор с регулярным выражением, используя имена групп - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь написать токенизатор для разбора текста (входной строки) с помощью регулярных выражений.Я хочу разделить входные данные по отдельным токенам и сохранить их в списке , где токен является классом (C #), таким как

class Token {
  string value;
  string type; // "identifier", "string', "intliteral', ... 
}

. Я хочу использовать регулярное выражение, подобное приведенному ниже дляразделение входной строки:

public static Regex tokenPattern = new Regex (
@"
  ( (?<identifier>(?:\p{L}|_)\w*)
  | (?<string>""[^""]*"")
  | (?<intliteral>(?:-|\+)?\d+[^\.])
  | (?<realliteral>(?:-|\+)?\d+(?:\.\d+)?)
  | (?<comma>,)
  | (?<lpar>\()
  | (?<rpar>\))
  | ...
  | (?<undefined>[^\s]*?)
  )
",
  RegexOptions.ExplicitCapture |
  RegexOptions.IgnorePatternWhitespace | 
  ...
);

Моя проблема в том, что легко получить часть значение каждого токена, но, кажется, нет простого способа получить type part, то есть имя группы.Я ожидал, что у Regex Group будет свойство Name , содержащее «идентификатор» и т. Д., Но это не так.

Есть ли способ определить имя группы безперебирать все имена групп / номера для каждого токена?(то есть подход со сложностью O (n) вместо O (nm), n количество токенов во входной строке, m количество типов токенов)?

1 Ответ

0 голосов
/ 21 октября 2018

Это будет многофазная операция, и использование одного регулярного выражения для такой операции не будет хорошим использованием процессорного времени.Я рекомендую разделить этапы операции, такие как:

  1. Разобрать каждое значение, используя базовое регулярное выражение в токене.
  2. Выполнить специальную операцию, чтобы определить, какой типобнаружен токен, и установите это значение соответствующим образом.

Вам, скорее всего, придется продолжать разбивать шаги после 2-го шага, чтобы добиться большей эффективности.


Я должен согласиться с мнением, что регулярное выражение не является инструментом для обработки языка токенов после идентификации отдельных токенов или в процессе токена для переопределения атрибутов токена.

...