Лексический анализ без регулярных выражений

9

Я смотрел на несколько лексеров в различных языках высокого уровня ( Python , PHP , Javascript и др.), И все они, кажется, используют регулярные выражения в той или иной форме. Хотя я уверен, что регулярные выражения, вероятно, лучший способ сделать это, мне было интересно, есть ли какой-нибудь способ добиться базового лексинга без регулярных выражений, возможно, какой-то прямой синтаксический анализ строк или что-то в этом роде.

Так что да, возможно ли реализовать какой-то базовый лексинг на языке более высокого уровня * без использования регулярных выражений в любой форме?

* Языки высокого уровня, такие как Perl / PHP / Python / Javascript и т. Д. Я уверен, что есть способ сделать это в C

мазаться
источник
2
Похоже, "есть ли книга по исчислению, которая не использует все эти греческие буквы и странные неряшливые вещи?"
Кевин Клайн
@kevincline Почему люди бегут через Атлантику, когда в небе совершенно хорошие самолеты?
Пятно
1
Гребля и езда имеют разные побочные эффекты.
Кевин Клайн

Ответы:

3

Прежде всего, существовали библиотеки регулярных выражений для языка Си еще до того, как были изобретены ваши языки «более высокого уровня». Скажу только, что программы на C не такие подунки, как некоторые думают.

Для большинства грамматик лексизм - это поиск пустого места и нескольких других символов, таких как () [] {}; разделить слова, а затем сопоставить их со списком ключевых слов, чтобы увидеть, есть ли совпадение.

Карл Билефельдт
источник
1
Я не имел в виду, что C не может выполнять регулярные выражения, я имел в виду, что у него есть более мощные функции для такого рода вещей. Я полагаю, что проще создать продвинутый и производительный лексер в C, чем язык более высокого уровня.
Пятно
1
@ sam сложность и производительность лексера или синтаксического анализатора больше зависят от сложности анализируемого языка, чем от языка, на котором реализован синтаксический анализатор, так что нет.
JK.
+1. Лексер невероятно прост; вам просто нужна строка, тип данных для ваших токенов и таблица предопределенных ключевых слов. Самая сложная часть имеет дело с пробелами и комментариями: P
Мейсон Уилер
2

Возможно, вас заинтересуют «парсеры без сканера», в которых нет отдельного шага токенизации. Одно из объяснений преимуществ анализаторов без сканера дается в начале этой статьи: Фильтры устранения неоднозначности для обобщенных анализаторов LR без сканирования . (Хотя есть и недостатки.)

(PEG, которые были упомянуты в других ответах, также могут быть использованы для создания синтаксических анализаторов.)

Райан Калпеппер
источник
1

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

DeadMG
источник
0

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

На самом деле нет ничего проще, чем регулярные выражения (как вы можете улучшить O (N)?), И попытка упрощения не поможет. Как всегда отмечал Джетти, вы всегда можете использовать простой возврат, хотя я рекомендую избегать его, если это возможно.

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

Pubby
источник
Так как же это сделать в regex? Разве это все равно не должно идти за символом (по крайней мере, для большинства моделей, используемых в лексизме)?
Джетти
@ Джетти Да, конечно.
Пабби
Было бы так же легко прочитать каждый символ, а затем вернуться назад, если необходимо извлечь токен. Было бы больше кода, но не сложнее.
Джетти
@ Джетти Я не вижу, как наивный возврат лучше.
Пабби
Я никогда не говорил лучше. Но OP спросил, есть ли другие способы, и это другой способ, который не является продвинутым парсером.
Джетти
0

Имеет смысл либо выполнить лексический анализ с регулярными выражениями, либо вообще пропустить этот проход и выполнить гораздо более гибкий и мощный анализ без лексера с помощью PEG или GLR.

SK-логика
источник