Я смотрел на несколько лексеров в различных языках высокого уровня ( Python , PHP , Javascript и др.), И все они, кажется, используют регулярные выражения в той или иной форме. Хотя я уверен, что регулярные выражения, вероятно, лучший способ сделать это, мне было интересно, есть ли какой-нибудь способ добиться базового лексинга без регулярных выражений, возможно, какой-то прямой синтаксический анализ строк или что-то в этом роде.
Так что да, возможно ли реализовать какой-то базовый лексинг на языке более высокого уровня * без использования регулярных выражений в любой форме?
* Языки высокого уровня, такие как Perl / PHP / Python / Javascript и т. Д. Я уверен, что есть способ сделать это в C
theory
regular-expressions
lexer
мазаться
источник
источник
Ответы:
Прежде всего, существовали библиотеки регулярных выражений для языка Си еще до того, как были изобретены ваши языки «более высокого уровня». Скажу только, что программы на C не такие подунки, как некоторые думают.
Для большинства грамматик лексизм - это поиск пустого места и нескольких других символов, таких как () [] {}; разделить слова, а затем сопоставить их со списком ключевых слов, чтобы увидеть, есть ли совпадение.
источник
Возможно, вас заинтересуют «парсеры без сканера», в которых нет отдельного шага токенизации. Одно из объяснений преимуществ анализаторов без сканера дается в начале этой статьи: Фильтры устранения неоднозначности для обобщенных анализаторов LR без сканирования . (Хотя есть и недостатки.)
(PEG, которые были упомянуты в других ответах, также могут быть использованы для создания синтаксических анализаторов.)
источник
В регулярных выражениях нет ничего конкретного. Они просто сокращены, что позволяет вам создавать код намного проще, а реализации обычно поставляются. Однако, по сути, лексеры - это автоматы, а регулярные выражения являются лишь одним из способов достижения этой цели.
источник
Конечно, вы можете использовать другие парсеры, так как каждый обычный язык также не зависит от контекста. Вопрос действительно сводится к тому, почему вы хотите.
На самом деле нет ничего проще, чем регулярные выражения (как вы можете улучшить O (N)?), И попытка упрощения не поможет. Как всегда отмечал Джетти, вы всегда можете использовать простой возврат, хотя я рекомендую избегать его, если это возможно.
Если вы собираетесь использовать более сложный синтаксический анализатор для лексинга, то вам, скорее всего, вообще не нужна фаза лексирования. Фактически, причины, по которым у нас есть фаза лексирования, заключаются в том, что анализировать лексические токены быстрее, чем анализировать символы, что значительно упрощает наш шаг синтаксического анализа. Таким образом, используя более продвинутый парсер, вы просто теряете все преимущества лексинга.
источник
Имеет смысл либо выполнить лексический анализ с регулярными выражениями, либо вообще пропустить этот проход и выполнить гораздо более гибкий и мощный анализ без лексера с помощью PEG или GLR.
источник