Используете lex / создаете сканер?

Недавно я изучал теорию компиляторов о лексическом анализе. Как я понял, есть несколько способов построения лексического сканера, например:

  • Использование Lex / Flex для автоматического создания сканера.
  • Создайте свой собственный. В примерах я встречал модель корпуса коммутатора с использованием техники упреждающего чтения (имитация DFA, NFA).

Мой вопрос: какой из них больше подходит для реализации базового языка программирования (состоит из переменных, условий, цикла)? Как их использовать на практике? Можно ли использовать и то, и другое?


person Lop52    schedule 18.09.2015    source источник
comment
Лексический сканер только разделяет источник на токены; он не поможет вам разобрать токены на такие структуры, как циклы и условные выражения. Если вы хотите создавать настоящие программы, используйте (f) lex; развертывание собственного лексического сканера - это намного больше работы, его намного проще поддерживать, требуется гораздо больше отладки и вряд ли он будет быстрее.   -  person rici    schedule 18.09.2015
comment
Вы можете использовать любой из них, но нет смысла использовать оба. Очевидно, что причина существования таких инструментов, как lex / flex, заключается в том, что ручное написание и обслуживание сканера может быть довольно громоздким и трудоемким, особенно если вы разрабатываете язык программирования, а также лексер / синтаксический анализатор.   -  person 500 - Internal Server Error    schedule 18.09.2015


Ответы (1)


lex полезен для простых языков, но не используется в языках с сложным синтаксисом (например, flex / lex не использует сканер, написанный на lex, для обработки ввода lex) . Иногда кто-то спрашивает, как управлять несколькими сканерами синтаксиса (давным-давно я помогал кому-то в программе с несколькими файлами lex и yacc с помощью sed, потому что это было до того, как появились flex / bison с параметрами, помогающими с переименование).

Для практической демонстрации vi-like-emacs в большинстве модулей подсветки синтаксиса. Не все. Perl и ruby ​​оказались слишком сложными, чтобы возиться с ними в lex / flex, из-за того, что они встраивают регулярные выражения без особой подсказки. С другой стороны, у него есть работоспособный (но большой) сканер lex / lex, написанный на lex. В качестве примера я добавил копию этого в FAQ по vile (см. результат).

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

person Thomas Dickey    schedule 20.09.2015
comment
Сканеры не имеют никакого отношения к синтаксису. - person user207421; 20.09.2015
comment
Мы можем спорить о терминологии, но у вас явно слишком много свободного времени. - person Thomas Dickey; 20.09.2015