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


9

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

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

* Мови вищого рівня - такі речі, як Perl / PHP / Python / Javascript і т. Д. Я впевнений, що є спосіб зробити це на C


2
Здається, "чи є книга з обчисленням, яка не використовує всі ті грецькі букви та дивні химерні речі?"
Кевін Клайн

@kevincline Чому люди веслують через Атлантику, коли на небі є ідеально хороші літаки?
Мазок

1
веслування та верхова їзда мають різні побічні ефекти.
Кевін клайн

Відповіді:


3

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

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


1
Я не мав на увазі, що C не міг робити регексів, я мав на увазі, що він має більш потужні функції для такого роду матеріалів. Я б міг уявити, що легше побудувати вдосконалений та ефективний лексер на мові С, ніж мова вищого рівня.
Мазок

1
@sam складність і ефективність лексеру чи аналізатора є скоріше функцією складності мови, що розбирається, ніж мови, в якій реалізований аналізатор, тому ні.
jk.

+1. Лексер неймовірно простий; вам просто потрібна рядок, тип даних для ваших жетонів і таблиця заздалегідь заданих ключових слів. Найскладніша частина стосується пробілів та коментарів: P
Мейсон Уілер

2

Можливо, вас зацікавлять "сканери без сканерів", які не мають окремого кроку токенізації. Одне пояснення переваг парсерів без сканерів наведено на початку цієї статті: Фільтри розбірливості для генералізованих сканерів LR без сканерів . (Однак є і недоліки.)

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


1

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


0

Звичайно, ви можете використовувати інші аналізатори, оскільки кожна звичайна мова також контекстна. Питання дійсно зводиться до того, чому б ви цього хотіли.

Насправді немає нічого простішого, ніж звичайні вирази (як можна вдосконалити O (N)?), А спроба спростити не допоможе. Ви завжди можете використовувати прості трекінгу, як вказував Jetti, хоча рекомендую уникати цього, якщо це можливо.

Якщо ви збираєтесь використовувати більш просунутий аналізатор для лексингу, то, швидше за все, вам не потрібна фаза лексингу. Насправді, причини, за якими у нас є фаза лексингу, полягають у тому, що швидше розбирати лексеми, що лексикуються, ніж розбирати символи, разом з цим різко спрощуючи наш крок розбору. Таким чином, використовуючи більш просунутий парсер, ви просто втрачаєте в першу чергу всю користь від лексингу.


Отже, як це робить регулярне вираження? Чи все-таки це не повинно набувати характеру за характером (для більшості моделей, що використовуються в лексінгу принаймні)?
Jetti

@ Jetti Так, звичайно.
Паббі

Було б так само легко прочитати кожен символ, а потім відхилити, якщо потрібно, витягнути маркер. Це було б більше коду, але не складніше.
Jetti

@Jetti Я не бачу, як краще наївне зволікання.
Паббі

Я ніколи не сказав краще. Але ОП запитала, чи є інші способи, і це ще один спосіб, який не є просунутим аналізатором.
Jetti

0

Є сенс або робити лексичний аналіз з регулярними виразами, або взагалі пропустити цей прохід і зробити набагато більш гнучкий і потужний без лексерного розбору з PEG або GLR.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.