[Программирование, Алгоритмы, Компиляторы] Про LL-парсинг: Предложение по расширению грамматик для генераторов парсеров

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
13-Окт-2020 11:30

В некоторых генераторах нисходящего(LL) синтаксического анализа с увеличением объема текста исходного кода время парсинга увеличивается в более чем арифметической прогрессии.
Идея состоит в том, чтобы ввести в самом парсере понятие препарсинга — разбиение текста исходной программы на блоки для отдельного парсинга.
Тексты программ имеют блочную структуру.
к примеру
1 уровень — namespace
2 уровень — классы
3 уровень — методы и свойства
и т.д.
Для Си-подобных языков блоки это просто {}
В языке же Clipper, например,
1 уровень — процедуры/функции/методы, классы, директивы
правило начала процедуры/функции:
funcProc
: funScope? (FUNCTION | PROCEDURE) identName ('(' params? ')')? crlfStmnt
;
funScope
: STATIC
| INIT
| EXIT
;

Окончанием процедуры/функции может быть
RETURN ( expression )? crlfStmnt

но RETURN может и отсутствовать, тогда окончанием будет EOF или начало блока первого уровня.
В генераторе парсеров ANTLR для грамматики можно устанавливать опции.
Т.е. мы можем определить
options { PreParse=ON; }

и после этого для правил указывать атрибуты, например:
[PreParseLevel = 1]
funcProcSection
: funcProcHead
statements
;

Также некоторые конструкции такие как лямбды/анонимные функции могут быть тоже выделены для отдельного парсинга. Для них можно установить PreParseLevel = 0.
Целью синтаксического анализа является построение дерева синтаксического разбора(abstract syntax tree (AST)). В процессе парсинга мы будем получать для каждого блока свое дерево, которое потом можно прицепить к основному дереву.
Конечно, кто-то использует парсер-комбинаторы и для него это все понятно и так.
Хотелось бы увидеть комментарии о данной концепции.
Разумно ли все это?
Применялось ли где?
Применяли ли вы в своей работе?
Стоит ли выносить это на обсуждение в англоязычном сообществе?
With best regards
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_programmirovanie (Программирование), #_algoritmy (Алгоритмы), #_kompiljatory (Компиляторы), #_sintaksicheskij_analiz (синтаксический анализ), #_ll, #_parsing (парсинг), #_programmirovanie (
Программирование
)
, #_algoritmy (
Алгоритмы
)
, #_kompiljatory (
Компиляторы
)
Профиль  ЛС 
Показать сообщения:     

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

Текущее время: 23-Ноя 02:48
Часовой пояс: UTC + 5