если бы это было возможно. Разработчикам мини-языков следует учесть эти проблемы.
Все языки препроцессоров (кроме самой troff-разметки) имеют сравнительно четкий, shell-подобный синтаксис, которые соответствует многим описанным в главе 5 соглашениям о конструкции форматов файлов данных. Существует несколько затруднительных исключений. Особенно выделяется среди них программа
Хотя troff сам по себе представляет собой специализированный императивный мини-язык, одной из идей, которая 'проходит' как минимум через 3 мини-языка в DWB, является декларативная семантика: компоновка документа на основе ограничивающих условий. Данная идея также характерна для современных GUI-инструментариев. Вместо того чтобы указывать координаты пикселей для графических объектов, единственное, что действительно требуется сделать — это объявить пространственные взаимозависимости между ними ('элемент управления А расположен выше элемента В, который находится слева от элемента С'), а затем заставить программное обеспечение вычислить наилучшее расположение элементов А, В и С, соответствующее заданным ограничивающим условиям.
В программеpic2graph
, которая рассматривалась в одном из учебных примеров главы 7.
Это весьма типичная для Unix конструкция мини-языка, и как таковая она имеет несколько интересных моментов даже на уровне синтаксиса. Следует отметить ее сходство с shell-программой: комментарии начинаются с символа #, а синтаксис, очевидно, организован на основе лексем и имеет простейшее возможное соглашение для строк. Разработчик
#Minilanguage taxonomy (классификация мини-языков)
#
# Base ellipses (основные эллипсы)
define smallellipse {ellipse width 3.0 height 1.5}
M: ellipse width 3.0 height 1.8 fill 0.2
line from M.n to M.s dashed
D: smallellipse() with .e at M.w + (0.8, 0)
line from D.n to D.s dashed
I: smallellipse() with .w at M.e - (0.8, 0)
#
# Captions (подписи)
'' 'Data formats' at D.s
'' 'Minilanguages' at M.s
'' 'interpreters' at I.s
#
# Heads (заголовки)
arrow from D.w + (0.4, 0.8) to D.e + (-0.4, 0.8)
'flat to structured' '' at last arrow.с
arrow from M.w + (0.4, 1.0) to M.e + (-0.4, 1.0)
'declarative to imperative' '' at last arrow.с
arrow from I.w + (0.4, 0.8) to I.e + (-0.4, 0.8)
'less to more general' '' at last arrow.с
#
# The arrow of loopiness (стрелка развития циклов)
arrow from D.w + (0, 1.2) to I.e + (0, 1.2)
'increasing loopiness' '' at last arrow.с
#
# Flat data files (плоские файлы данных)
'/etc/passwd' '.newsrc' at 0.5 between D.c and D.w
# Structured data files (структурированные файлы данных)
'SNG' at 0.5 between D.c and M.w
# Datafile/minilanguage borderline cases (пограничные случаи файлы данных/мини-язык)
'regexps' 'Glade' at 0.5 between M.w and D.e
# Declarative minilanguages (декларативные мини-языки)
'm4' 'Yacc' 'Lex' 'make' 'XSLT' 'pic' 'tbl' 'eqn'
at 0.5 between M.с and D.e
# Imperative minilanguages (императивные мини-языки)
'fetchmail' 'awk' 'troff' 'Postscript' at 0.5 between M.c and I.w
# Minilanguage/interpreter borderline cases (пограничные случаи
мини-язык/интерпретатор)
'dc' 'bc' at 0.5 between I.w and M.e
# Interpreters (интерпретаторы)
'Emacs Lisp' 'JavaScript' at 0.25 between M.e and I.e
'sh' 'tcl' at 0.55 between M.e and I.e
'Perl' 'Python' 'Java' at 0.8 between M.e and I.e
Вероятно, больших усилий не потребуется, чтобы понять, что первая строка кода представляет собой определение макрокоманды. В последующих ссылках на smallellipse()
инкапсулирован повторяющийся элемент диаграммы. Назначение команды arrow также очевидно.
Используя все это как подсказку и глядя на реальную диаграмму, несложно выяснить значение остальных элементов синтаксиса (позиционных ориентиров, таких как М.s
, и конструкций, подобных last arrow
или at 0.25 between M.e and I.e
, или добавление смещения вектора). Как и Glade-разметка, а также
Пример программы
Комбинация макросов с компоновкой на основе ограничивающих условий позволяет программеpic2graph
, использованный в качестве учебного примера в главе 7, был специально создан для достижения этой цели с помощью модернизированных PostScript-возможностей
Более четким решением является утилита