Menu

Lexers states

Alexey T.

What "states" do in lexers configuration

Элементы определенные на странице Парсер, Правила, Сублексеры – могут устанавливать или сбрасывать так называемые состояния.
Если элемент устанавливает состояние то оно будет установлено от этого элемента и до конца текста.
Если элемент требует(Проверка состояния) чтобы было установлено\сброшено какое-либо состояние, то он не будет определятся если требуемые состояния не будут установлены\сброшены.
Если элемент сбрасывает состояние, то если до элемента было установлено это состояние то после него в тексте оно уже будет сброшено.

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

  • Комментарий – начинается с символа «;» и идет до конца строки.
  • Блок - начинается на «begin» а оканчивается на «end» а символ «;» находящийся в блоке означает что-то другое а не начало комментария, а слово begin находящееся в блоке вообще ничего не означает.
  • Просто код - это не комментарии и код вне блоков.

Чтобы сделать лексер для этого языка:

  • Создаем правило Конец блока - «block end», там где Присутствующий, пишем «1» (см. ниже), там где Сброс, пишем «1» (см. ниже)
  • На вкладке Правила, создаем элемент Начало блока - «block start», в условии конца блока пишем «block end», там где Назначить, пишем «1» (после начала бока состояние 1 – установлено), там где Отсутствующий, пишем «1» (дабы не допустить создание вложенных блоков), на вкладке условия пишем «begin»
  • На вкладке Парсер, создаем элемент «comment» и задаем ему следующее регулярное выражение «;.*», поскольку в блоках не существует комментариев, то там где Отсутствующий, пишем «1» (в блоках не будет обрабатываться это регулярное выражение).

я это выяснил «методом тыка», поэтому описание выше может быть неточно.

(автор: My-crack)

Дополнение от Алекса

Состояния это целые (4 байта), если указано например "установить: 16", то это значит, что для состояния будет установлен один бит, соответствующий числу 16, и так же можно установить (сбросить) сразу много битов, например 3 бита числом 16+4+1.


Related

Wiki: Home