Лексер обычно жадный, это означает, что если токен может соответствовать строке, большей, чем другая строка, также соответствующая другому (или тому же) токену, она будет соответствовать большей строке.
В этом примере лексер будет сначала соответствовать символу «a» и считать, что «идентификаторы» (или «переменная») являются потенциальным токеном (также любой другой токен, который может начинаться с буквы, например «абстрактная») или «как»), после чего лексер будет читать следующий символ («+»), а как + не может быть и идентификатор, и не «абстрактный» ни «как», он прекратит поиск кандидата для «a», и обозначить его как идентификатор.
после этого он имеет символ «+» в качестве текущего символа и думает о возможных токенах, соответствующих этому («+», «++», «+ =»), из-за «жадности» лексер пытается продолжайте со следующего символа и получите следующий «+», поэтому он приходит к выводу, что единственным токеном, который может соответствовать, является «++» (если «+++» был действительным маркером, лексер должен отказаться, если следующий символ - это +)
Следующий шаг принимает следующий символ (снова «+») и думает о возможных маркерах («+», «++», «+ =»), он примет следующий символ («b»)), а как «+ b» не является потенциальным префиксом любого токена, он определяет, что следующий токен «+».
Затем он продолжает использовать «b» (потенциальный идентификатор или любое стартовое ключевое слово b («base», «bool», «break», «byte»), но при чтении следующего символа («;») лексер определяет, что является идентификатором
поэтому лексеров произвести следующие маркеры
идентификатор ++ + идентификатор;.
это может также быть восприняты как 'а + + (+ б) 'с двумя одинарными плюсами до' b' и без приращений! –
http://en.wikipedia.org/wiki/Maximal_munch –
@BenVoigt - это точно так. Таким образом, эта проблема не может быть решена с помощью si алгоритм маркерного токенизатора, вам нужно будет подняться на один уровень выше и позволить лексеру узнать о контексте? – Tar