Какие функции должен обеспечить лексер? - PullRequest
2 голосов
/ 31 мая 2010

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

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

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

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

далее : использовать текущий токен и вернуть его

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

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

Язык - JavaScript, поэтому я не могу перегрузить операторы.

Ответы [ 3 ]

3 голосов
/ 31 мая 2010

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

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

изменить & mdash; о, также:

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

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

изменить еще раз & mdash; Кроме того, я не скажу вам не писать один, потому что они в основном самые забавные вещи когда-либо. В javascript вы не можете стать слишком сумасшедшим, но на языке, подобном Erlang, вы можете заставить свой лексер действовать как «насос токенов», заставляя его генерировать поток токенов, которые он отправляет отдельному процессу синтаксического анализатора.

3 голосов
/ 31 мая 2010

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

0 голосов
/ 31 мая 2010

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

То, что ему «нужно», зависит, конечно, от того, что вам нужно, а не от того, что ему нужно. Мы, вероятно, сможем оказать вам лучшую помощь, если вы объясните свои собственные потребности. Но, в любом случае, вот вам выстрел:

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

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

...