Как сопоставить и подстроку, и саму строку? - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь токенизировать кучу кода с помощью lex и сопоставлять разные типы ключевых слов с разными регулярными выражениями.Когда следующее регулярное выражение совпадает, оно маркирует все, что совпадает с «VARIABLE»;

[_a-zA-Z][_a-zA-Z0-9]*

И следующее соответствие с оператором печати;

\s*print\((.*?)\)\s*

Что мне нужно, когда следующий оператор проходит черезлексический анализ;

myVar_12
print(myVar_12)

токены должны быть похожи;

VARIABLE
PRINT VARIABLE

Но я получаю это;

VARIABLE
PRINT

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

1 Ответ

1 голос
/ 31 марта 2019

Вы пояснили в комментарии, что хотите, чтобы print было ключевым словом, независимо от того, следует ли за ним список параметров или нет.Поэтому список параметров не должен быть частью регулярного выражения print.Регулярное выражение для совпадения print должно быть просто print.

print                   return PRINT;
[_a-zA-Z][_a-zA-Z0-9]*  return VARIABLE;

Обратите внимание, что порядок имеет значение, потому что входное «print» может совпадать с обоими регулярными выражениями, и если несколько регулярных выражений дают совпадение одинаковой длины, lex использует тот, который находится первым вфайл.Таким образом, ключевые слова всегда должны быть определены перед правилом для идентификаторов.

Вы также захотите распознавать скобки как свои собственные токены и игнорировать пробелы (предположительно).


¹ ВНа самом деле это должно быть частью регулярного выражения в любом случае.Но если вы хотите, чтобы print было контекстным ключевым словом, вам нужно другое решение.

...