Можно ли использовать регулярное выражение для выражения всех требований к лексическому синтаксическому анализатору?

Недавно я изучаю принципы компиляторов. Я заметил, что все примеры из учебников описывают языковый лексический синтаксический анализатор, использующий «lex» или «flex» с регулярными выражениями, чтобы показать, как анализировать исходные файлы ввода.

Означает ли это, что все известные языки программирования могут быть реализованы с использованием грамматики типа 3 для лексического анализа? Или просто в учебниках используются простые образцы для демонстрации идей?


person Troskyvs    schedule 18.09.2016    source источник


Ответы (1)


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

Например, вы не можете сопоставить необработанный строковый литерал C ++ с регулярным выражением. Вы не можете сказать без синтаксического анализа, является ли /= в программе Javacript единственной лексемой, используемой для обозначения разделения и назначения, или это начало регулярного выражения, которое соответствует строке, начинающейся с =. Для языков, допускающих вложенные комментарии (в отличие от C), требуется что-то более мощное.

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

person rici    schedule 18.09.2016