LINUX.ORG.RU

стоит ли использовать генератор парсера для парсинга такого?


0

1

есть небольшой язык для описания упрощенных uml диаграмм, такого плана:
[note: You can stick notes on diagrams too!{bg:cornsilk}],[Customer]<>1-orders 0..*>[Order], [Order]++*-*>[LineItem], [Order]-1>[DeliveryMethod], [Order]*-*>[Product], [Category]<->[Product], [DeliveryMethod]^[National], [DeliveryMethod]^[International]
(http://yuml.me)
Хочу для него написать опенсурсную тулзу. Стоит ли использовать генератор парсеров, или самому написать? Если стоит взять, то какой?

Если есть сноровка в этом деле, лексер с парсером для такого языка напишутся в два счета. Если ее нет, то можешь чуть-чуть получить ее. Даже во втором случае вероятно получится быстрее, чем разобраться с бизонами и якками.

staseg ★★★★★
()

В tikz все это есть

anonymous
()

Самый важный аспект генераторов парсеров в том, что ни позволяют практически декларативно описывать правила синтаксически управляемой трансляции.

Это намного понятнее, чем изучать код готового парсера. Соответственно, сопровождение готовой программы проще. Проще и создание такой программы, она может создаваться поэтапно, начиная с самой простой приближенной, в нулевом приближении, грамматики, постепенно добавляя правила.

Затем, если захочется изменить грамматику или правила трансляции, намного проще это сделать, когда правила трансляции просто и понятно привязаны к правилам грамматики.

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

А освоить хотя бы пару генераторов парсеров надо. Если при этом начинать с достаточно простого языка, как ваш, то вы не испытаете разочарования, все будет достаточно просто. Если при этом язык имеет практическое применение, то будет вообще классно.

Книги, описывающие lex/yacc, flex/bison к примеру, есть. Встречал также книгу, описывающую какой-то древний генератор парсеров, написанный ЕМНИП, на PL/1. А вот книг, специфически описывающих современные генераторы парсеров для распространенных сейчас языков, не встречал. Может кто-то кинет ссылку просто так?

anonymous
()
Ответ на: комментарий от anonymous

Зачем книга? Это обычная документация. Теоретические аспекты и основные идеи алгоритмов давно описаны без привязки к конкретному языку --- начиная от Dragon Book (мне понравилась книга «Parsing Techniques», есть в гугле), --- поэтому при описании уже конкретного генератора достаточно только указать тип его грамматики (LL(1) и т.п.) и тип алгоритма (recursive-descent или breadth-first, top-down или bottom-up, другие варианты и особенности), а дальше надо уже описывать язык, на котором описывается грамматика и действия, и это уже сильно зависит от языка, на котором написан и для которого предназначатся генератор. Эта информация всегда подробно изложена в описании, и обычно достаточно просмотреть документацию к имеющимся генераторам для используемого языка с подходящими грамматикой и алгоритмом, чтобы сделать выбор.

anonymous
()
Ответ на: комментарий от anonymous

Почти верно. Но вы ошибаетесь в том, что в документации к генератору подробно описано как его использовать.

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

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

Вы найдете в документации описание фич, но не найдете примеров реальных условий при которых эти фичи следует использовать.

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

Для сравнения почитайте книгу lex&yacc (flex&bison) издательства oreilly, и документацию к lex/yacc, и поймете о чем я говорю.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.