Это работа лексера? - PullRequest
       49

Это работа лексера?

3 голосов
/ 15 июня 2011

Допустим, я использовал определение метода ruby:

def print_greeting(greeting = "hi")  
end

Это работа лексера - поддерживать состояние и выпускать соответствующие токены, или это должно быть относительно глупо? Обратите внимание, что в приведенном выше примере параметр greeting имеет значение по умолчанию "hi". В другом контексте greeting = "hi" - это присвоение переменной, которое устанавливает greeting в "hi". Должен ли лексер испускать общие токены, такие как IDENTIFIER EQUALS STRING, или он должен учитывать контекст и генерировать что-то вроде PARAM_NAME EQUALS STRING?

Ответы [ 4 ]

4 голосов
/ 15 июня 2011

Я склонен сделать лексера настолько глупым, насколько это возможно, и поэтому заставил бы его испускать токены IDENTIFIER EQUALS STRING. Во время лексического анализа (в большинстве случаев ...) нет никакой информации о том, что должны представлять токены. Наличие таких правил грамматики в лексере только дополняет его (очень) сложными синтаксическими правилами. И это часть парсера.

2 голосов
/ 15 июня 2011

Я думаю, что лексер должен быть "тупым" и в вашем случае должен возвращать что-то вроде этого: DEF IDENTIFIER OPEN_PARENTHESIS IDENTIFIER EQUALS STRING CLOSE_PARENTHESIS END. Парсер должен сделать валидацию - зачем разделять обязанности.

1 голос
/ 17 июня 2011

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

1 голос
/ 15 июня 2011

Не работает с ruby, но работает с дизайном компилятора и языка программирования.

Оба подхода работают, но в реальной жизни проще использовать общие идентификаторы для переменных, параметров и зарезервированных слов ("тупой лексер" или "тупой сканер").

Позже вы можете "преобразовать" эти общие идентификаторы в другие токены.Иногда в вашем парсере.

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

Другой аналогичный, общий случай, когда у вас есть выражение или язык, которые используют «+» и «-» для двоичного оператораи для унарного знака оператора.

...