Гибкий скрипт, который соответствует пустым вводам?

Можно ли написать сценарий lex или flex, содержащий набор правил, в которых шаг сопоставления с максимальным значением всегда будет соответствовать строке нулевой длины?

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


person templatetypedef    schedule 21.06.2011    source источник
comment
@agent-j Я не уверен, что понял ваш комментарий. Не могли бы вы уточнить, какие примеры вы хотели бы, чтобы я привел?   -  person templatetypedef    schedule 22.06.2011
comment
@templatetypedef: Конкретизация вопроса почти всегда упрощает задачу. Предоставьте образец входных данных и ожидаемый результат, а также, возможно, даже некоторый код.   -  person bukzor    schedule 11.07.2011


Ответы (1)


Я не знаю насчет lex, но flex может сопоставить пустую строку, используя конечный контекст:

""/. { /* handle empty string */ }

Это будет соответствовать пустой строке перед любым символом, но это может быть практически любой шаблон (см. flex документацию об ограничениях).

<INITIAL>""/[-]{2} { BEGIN(sqlcomment); }
<sqlcomment>[^\n]* { /* Handle sql comment, including -- */ BEGIN(INITIAL); }

Если вы хотите соответствовать концу ввода, вы должны использовать специальный символ ‹‹EOF›› (см. гибкая документация по eof).

EDIT: теперь, когда я немного подумаю об этом, конечный контекст может быть необязательным. Просто "" может работать. Если это так, я по-прежнему настоятельно рекомендую использовать конечный контекст в этом случае, когда это возможно. Это предотвращает многие побочные эффекты, связанные с искаженными входными данными, и помогает при отладке.

person vdust    schedule 05.07.2011
comment
Вы совершенно правы! Скрипт /.* соответствует пустой строке бесконечно много раз. Спасибо за указание на это! - person templatetypedef; 09.07.2011