Как вернуть самое короткое совпадение для токена во Flex? - PullRequest
0 голосов
/ 08 ноября 2018

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

ESCAPESEQ   \\\x
SHORTSTRINGITEM {SHORTSTRINGCHAR}|{ESCAPESEQ}
SHORTSTRING (\'{SHORTSTRINGITEM}*\')|(\"{SHORTSTRINGITEM}*\")
LONGSTRINGCHAR  [^\\(\'\'\')(\"\"\")]
LONGSTRINGITEM  {LONGSTRINGCHAR}|{ESCAPESEQ}
LONGSTRING  (\'\'\'{LONGSTRINGITEM}*\'\'\')|(\"\"\"{LONGSTRINGITEM}*\"\"\")
LONGSTRINGLITERAL   {STRINGPREFIX}?{LONGSTRING}

Если я анализирую код Python, в котором две длинные строки разделены другими токенами, мой анализатор возвращает две длинные строки и код между ними, как в токене. Это потому, что Flex пытается вернуть максимально возможное совпадение. Однако я хочу вернуть самое короткое совпадение только для этой длинной строки токена. Спасибо за ответы.

1 Ответ

0 голосов
/ 11 ноября 2018

Попробуйте определить это так:

DOCUMENTACION_D \"\"\"
DOCUMENTACION   {DOCUMENTACION_D}([^\"]|\\\"|\n)*{DOCUMENTACION_D}

Правило будет примерно таким:

{DOCUMENTACION} {
  doSomething();
}
...