2010-05-30 5 views
2

Я делаю лексер, не говорите мне, чтобы я не делал, потому что я уже делал большую часть этого.
В настоящее время он создает массив токенов и все.Какие функции должен предоставить лексер?

Я хотел бы знать, какие функции должен предоставить лексер и краткое объяснение того, что должна выполнять каждая функция.

Я приму самый полный список.

Примером функции будет:

следующий: Потребляйте текущий маркер и вернуть его

Кроме того, следует лексер иметь функцию expect или если интерпретатор реализовать?

Кстати, конструктор lexer принимает строку в качестве аргумента и делает лексические анализы и сохраняет все токены в переменной «токены».

Язык является javascript, поэтому я не могу перегружать операторов.

+0

http://en.wikipedia.org/wiki/Lexical_analysis –

ответ

3

Вы должны иметь возможность составить полный список, написав программу, которая использует ваш лексер, и реализуя функции, которые вам в конечном итоге нужны.

3

По моему опыту, вам нужно:

  • nextToken — шаг вперед на входе и получить следующий маркер.
  • curToken — вернуть текущий токен; не перемещаются
  • curValue — токены, такие как STRING и NUMBER, имеют значения; лексемы, как SEMICOLON сделать не
  • sourcePos — возвращения положения источника (номер строки, позиция символа) первого символа текущего маркера

редактировать — ой также:

  • prefetch — инициализируйте лексер, получив первый токен.

Кроме того, для некоторых языков вам может потребоваться 2 или более токенов. Затем вам понадобится вариант на простом curToken, чтобы вы могли смотреть на большее «окно» на поток токенов. Для большинства языков, которые в действительности не нужны.

Редактировать повторно — также я не буду говорить вам, чтобы вы не писали одно, потому что они в основном являются самыми смешными вещами. В javascript вы не можете стать слишком сумасшедшим, но на таком языке, как Erlang, вы можете заставить свой lexer действовать как «токеновый насос», создавая поток токнов, который он отправляет в отдельный процесс парсера.

+0

Я в основном согласен с вашими примерными функциями, за исключением этих двух: 1. «маркеры, такие как STRING и NUMBER, имеют значения, маркеры вроде SEMICOLON do not»: True, но я не думаю, что это задача лексера, чтобы выяснить эти ценности. Особенно на статически типизированном языке, где вы не можете возвращать разные типы 'value' из объекта« Token ». Я бы сказал, что это работа семантического анализатора, которая работает поверх Parser и Lexer (значение = семантика) или задание Parser, если нужно преобразовать токен в литеральный постоянный узел в AST. Подумал, что я вижу в этом какую-то пользу: избегать сканирования лексемы дважды. – SasQ

+0

2. 'prefetch': должна ли эта функция выкидывать ошибку, если во входном буфере нет ничего для предварительной выборки? Если да, то что, если пустой источник является допустимой программой? Предварительная выборка приведет к ошибке. Я думаю, что лучше возвращать ошибку, когда 'nextToken' не получает ничего больше от входного буфера, так как это ошибка, когда парсер ожидает больше текста и нет (преждевременный конец файла), аналогично' expect' упомянутых ОП. – SasQ

0

Подумайте еще раз о том, что вы спрашиваете: «какие функции лексера должен обеспечить»

чего это «потребности» зависит, конечно, от того, что вас потребности, не то, что это потребностей , Вероятно, мы сможем помочь вам, если вы объясните свои собственные потребности. Но ну, вот кадр в любом случае:

Минимальный должен состоять из одной функции, которая принимает строку в качестве аргумента и возвращает список строк (или итератор по строкам, если вы хотите быть фантазией и отсрочкой). Этого достаточно для многих случаев использования, и, следовательно, это то, что «лексер» «нуждается».

Более описательный способ может возвращать более сложные объекты, чем строки, содержащие дополнительную информацию о каждом маркере (например, например, его позицию в исходной строке, так что вы сможете сообщить бедному программисту о синтаксических ошибках в его код, где он должен смотреть). Возможно, вы можете найти множество метаданных, чтобы добавить туда помимо номеров строк, но в очередной раз все зависит от ваших потребностей.

+0

Но это вопрос, который нужно задать, если вы хотите создать * интерфейс * для своего лексера, чтобы подготовить его к различным потребностям пользователей и сделать его удобным для использования. Есть несколько распространенных случаев использования лексера, и их отсутствие в дизайне может быть плохим. Подумайте об этом как о обычном «шаблоне дизайна» для lexer. – SasQ

Смежные вопросы