Вычислительные технологии
Том 13, № 5, 2008
Автоматная модель визуального описания синтаксического
разбора*
А. П. Стасенко
Институт систем информатики им. А.П. Ершова СО РАН, Новосибирск, Россия
e-mail: [email protected]
The paper introduces and investigates an automaton model suitable for a clear visual description of effective descending syntax analysis of programming languages. It is shown that in the deterministic case the presented automaton model allows class of LL\ languages. The presented automaton model indirectly allows more powerful languages via its context states and supports hierarchical processing of indeterminacy for implementing syntax error handling without overhead of completely specified automaton. The paper shows the ways to improve efficiency of automaton of the presented model such as state minimization, removal of e-transitions and unreachable states. The advantages of translator implementation that use automatons of the presented model are shown.
Введение
В настоящее время синтаксический разбор языков программирования [1] обычно осуществляется с помощью автоматов, сгенерированных по грамматике языков системами построения трансляторов (СПТ). При этом в СПТ, ориентированных на восходящий разбор, таких как YACC [2] или Bison [3], возникают сложности с написанием семантических правил и читабельностью сгенерированного распознавателя [4], тогда как СПТ, ориентированные на нисходящий разбор, такие как ANTRL [5], допускают часто неприемлемо узкий класс LLk-языков [6]. Существуют подходы, комбинирующие сильные стороны восходящих и нисходящих разборов [7, 8], но все они так или иначе требуют, чтобы входная грамматика принадлежала к определенному классу, и затем генерируют распознающий автомат в виде таблицы и/или программного кода.
Требование принадлежности грамматики к определенному классу связано с необходимостью преобразования (часто ручного) исходной грамматики для получения допустимой грамматики, что, во-первых, не всегда возможно, во-вторых, приводит к отрыву от обычно более наглядного пользовательского описания языка и, в-третьих, может быть источником ошибок [9]. Генерация автомата также приводит к отрыву от исходного описания языка, так как обычно неизбежно наступает этап, когда необходимо внести изменения в уже сгененированный код. Положение особенно осложняется при необходимости частого внесения изменений в исходный язык, требующих повторных ручных преобразований грамматики и перегенерации автомата.
* Работа частично поддержана Российским фондом фундаментальных исследований (грант № 07-0712050).
( Институт вычислительных технологий Сибирского отделения Российской академии наук, 2008.
Указанные проблемы особенно обостряются в трансляторах промышленного уровня и обычно решаются с помощью вручную написанных распознавателей. Существуют работы по ручному заданию восходящих распознавателей [10], но большее распространение получили распознаватели1, основывающиеся на намного более естественном нисходящем разборе, использующем контекстную информацию там, где это необходимо для преодоления ограниченности класса LL&-языков. Недостатками вручную написанных трансляторов обычно являются:
— недостаточно сильное разделение разбора синтаксиса и семантики;
— плохое сочетание кода разбора синтаксиса, представляющего собой большие конструкции выбора, с кодом семантического разбора;
— использование больших линейно проверяемых конструкций выбора вместо логарифмического поиска по упорядоченному множеству условий;
— сложность ручного устранения снижающих эффективность переходов по умолчанию в конструкциях выбора;
— трудность ручной минимизации числа конструкций выбора.
В данной статье предлагается автоматная модель визуального описания синтаксического разбора, которая, во-первых, позволяет избежать недостатков существующих СПТ путем наглядного описания синтаксиса языка в непосредственно исполняемом виде. Во-вторых, данная модель делает возможным упростить трансляторы, разрабатываемые с ее помощью, и повысить их эффективность путем устранения указанных выше недостатков написанных вручную трансляторов.
Наглядность предлагаемой автоматной модели проистекает из того факта, что она задается не табличным способом, как классические магазинные автоматы, осуществляющие синтаксический анализ [6], а с помощью графа, сравнимого по сложности с графом конечного автомата, тогда как существующие способы графического задания магазинных автоматов [11, 12] требуют громоздких пометок на дугах, соответствующих переходам. Графические способы задания синтаксиса языка достаточно удобны, что подтверждается синтаксическими диаграммами Вирта [13], с помощью которых был описан язык Паскаль. Предлагаемая автоматная модель по сути является развитием и уточнением идеи, заложенной в синтаксических диаграммах Вирта.
Статья состоит из нескольких разделов. В разд. 1 вводится определение модели Y-автомата и его частных случаев: 7s-, 71- и 7^-автоматов, графическое изображение которых дается в разд. 2. Наибольший интерес представляет класс 71 -автоматов, допускающих детерминированное исполнение и класс контекстно-зависимых языков, однако для полноты картины в разд. 3 исследуется класс языков, представимых Ys-автоматами, в которых отсутствуют контекстные переходы, снижающие наглядность графического представления 7-автоматов. В двух следующих разделах рассмотрение сосредоточивается на классе 7^-автоматов, сочетающем наглядность представления 75-автоматов и детерминированность исполнения 71 -автоматов. В разд. 4 доказывается существование класса грамматик, эквивалентного классу 7s1-автоматов. В разд. 5 характеризуется
1 Многие промышленные компиляторы языка СиН—+ и Си используют компилятор переднего плана Edison Design Group (http://www.edg.com), основанный на вручную написанном нисходящем распознавателе. Компиляторы Open Watcom также используют вручную написанные нисходящие распознаватели (http://www.openwatcom.org/index.php/Compiler_Architecture). Компилятор переднего плана G+—Н начиная с версии 3.4 перестал использовать СПТ YACC и был переписан вручную для реализации нисходящего разбора, для повышения эффективности трансляции и устранения конфликтов распознавателя (http://gcc.gnu.org/gcc-3.4/changes.html).
класс языков, представимых 7^-автоматами, и исследуется влияние на него механизма иерархической обработки исключений. В разд. 6 рассматривается совпадение класса контекстно-зависимых языков и класса языков 71-автоматов, а в разд. 7 речь идет о способах оптимизации 71 -автоматов. Статья завершается разделом 8, где описываются преимущества реализации транслятора, синтаксический разбор которого дан с помощью графического представления 71-автоматов.
1. Определение модели
Вводимая модель автомата для визуального описания синтаксического разбора (далее — просто 7-автомата) основывается на классической модели магазинного автомата [14]. Магазинный автомат подобен конечному автомату, но в отличие от последнего имеет рабочую память — магазин, в который записываются символы некоторого алфавита. Каждое движение магазинного автомата определяется функцией перехода в зависимости от текущего состояния, входного символа или не зависимо от него (так называемые е-движения) и от верхнего символа магазина. Одно движение магазинного автомата состоит в замещении верхнего символа магазина некоторой магазинной цепочкой, в частности пустой (стирание верхнего символа магазина), и переходе в новое состояние управления. При этом текущим входным символом становится текущий символ на входной ленте, если выполняется движение, зависящее от входного символа, либо текущий входной символ остается тем же самым, если выполняется е-движение.
С одной стороны, модель 7-автомата — это сужение модели магазинного автомата, так как на нее наложены ограничения на вид функции перехода, призванные повысить наглядность ее графического представления. С другой стороны, модель 7-автомата дополнительно имеет контекстные переходы для расширения класса языков, представимых y-автоматами, и магазин исключений с целью дальнейшего повышения читабельности графического представления модели.
Модель 7-автомата определяется кортежем A = (T, Tk, S, s0, Send, Sk, т, Tk, K, k0, Ф, fe), где T — конечный входной алфавит, Tk — множество контекстных пометок, S — конечное множество состояний, s0 £ S — начальное состояние, Send С S — множество конечных состояний, Sk — множество контекстных состояний (Sk П S = 0), т : S х (T U {е2}) х (MU{е}) ^ 2(SuSfc)xM* — функция переходов, изменяющая содержимое магазина M, содержащего состояния из S, Tk : Sk xTk ^ SUSk — функция контекстных переходов, K — множество контекстов, k0 £ K — начальный контекст, Ф — множество контекстных функций вида K ^ K х Tk, ^ : Sk ^ Ф — функция разметки состояний контекстными функциями, fe : S х (Me U {е}) ^ M* — функция изменения магазина исключений Me (ИМИ-функция), содержащего состояния из S. Модель 7-автомата имеет входную ленту с алфавитом T, в котором выделен специальный символ tend, находящийся в конце ленты. Также модель 7-автомата имеет магазин M и магазин исключений Me.
Функция переходов 7-автомата т для каждого состояния s1 £ S и символа перехода 8 £ T U {е} имеет один из следующих трех видов (упоминаемые далее как переходы первого, второго и третьего видов соответственно):
1) семейство переходов т(s1, 8, е) = (s2, е), не зависящих от состояния и не меняющих содержимое магазина M;
2Символ е обозначает пустую цепочку.
2) семейство переходов те) = (зп, 52,..., 1), не зависящих от содержимого магазина М, но добавляющих в него цепочку 52,... , 5п-1 (з2 — в первую очередь);
3) семейство переходов т(в1, 52) = (з2, е) для всех 52 € М в состояние, вытолкнутое из магазина М.
Функция /е для каждого состояния 5 € £ имеет один из следующих четырех видов:
— функция вида /е(з, е) = (е), не зависящая от состояния и не меняющая содержимое магазина Ме;
— функция вида /е(з,е) = (зе), добавляющая состояние 5е в магазин Ме;
— функция вида /е(5,те) = (зе) для всех те € Ме, заменяющая состояние те на 5е на вершине магазина Ме;
— функция вида /е(5,те) = (е) для всех те € Ме, выталкивающая состояние из магазина Ме.
Конфигурацией автомата называется элемент множества Т* х (£ и £к) х М* х Ме* х К. Работа автомата определяется сменой конфигураций от начальной конфигурации (^1, 50, е, е, ко), где обозначает начальную цепочку символов на входной ленте, до конечной конфигурации, принадлежащей множеству Т* х £еп^ х М* х Ме* х К. Введем определение вспомогательных понятий. В 7-автомате переходом функции переходов т для конфигурации 5, т, те, к) называется множество т(з,£,т) и т(з,е,т), где £ € Т определяется из равенства ^ = Переход т для конфигурации 5, т, те, к) называется детерминированным, если |т(з,£,т)| = 1 и |т(з,е,т)| < 1. Переход т для конфигурации 5, т, те, к) называется неопределенным, если |т(з,£,т) и т(5, е,т)| = 0.
Если для состояния 5 € £ функция переходов т предназначена для конфигурации (^1, 51, т1, те1, к1), то следующая конфигурация (^2, 52, т2, те2, к2) определяется таким образом. Состояние 52 и цепочка т', использующаяся для определения цепочки т2 = т''т', где цепочка т'' получается из равенства т1 = т''т, связаны с функцией переходов т как (в2,т') = т= {£,е},т). Если $ = то цепочка находится из равенства = иначе — = Цепочка те, использующаяся для определения цепочки те2 = т"т'е, где цепочка т" получается из равенства те1 = т4'те, связана с ИМИ-функцией /е как т'е = /е(51,те). Контекст не изменяется: к2 = к1.
Если для состояния 5 € £ функция переходов т не определена для конфигурации (^1, 51, т1, те1, к1), то следующая конфигурация (^2, 52, т2, те2, к2) находится таким образом: = состояние 52 и цепочка те2 определяются из равенства те1 = те2523, т2 = т1, к2 = к1. Тем самым, ИМИ-функция /е и магазин исключений Ме задают механизм иерархической обработки неопределенностей (ИОН-механизм). Под 7-автоматом без ИОН-механизма подразумевается 7-автомат, в котором все функции /е не зависят от содержимого магазина Ме и не меняют его.
Для состояния 5 € смена конфигурации (^1, 51, т1, те1, к1) на конфигурацию (^2, 52, т2, те2, к2) рассчитывается иначе. Новое состояние 52 определяется функцией переходов как 52 = ), где и новое состояние контекста к2 характеризуются
функцией ф на основании текущего контекста , к2) = ф(к1), при этом функция ф € Ф зависит от функции разметки ^ для текущего состояния: ф = ^(в1). Содержимое магазинов и входной ленты не изменяется: т2 = т1, те2 = те1 и =
Определение 1. Под языком, задаваемым 7-автоматом, подразумевается множество начальных цепочек символов в алфавите Т на входной ленте 7-автомата, для которых автомат достигает конечного состояния.
3Если те 1 = е, то поведение 7-автомата не определено.
Будем говорить, что автоматы эквивалентны, если задаваемые ими языки совпадают. Два класса (множества) автоматов эквивалентны, если для каждого автомата в первом классе найдется эквивалентный автомат во втором классе и наоборот.
Введем подкласс класса 7-автоматов без контекстных состояний и ИОН-механизма, который интересен тем, что он является подклассом обычных недетерминированных магазинных автоматов с более ограниченным видом функции переходов т, что, однако, как показано в разд. 3, не повлекло за собой сужения класса задаваемых ими языков.
Определение 2. Под ys-автоматом подразумевается 7-автомат без ИОН-механизма, в котором Sk = 0.
Заметим, что у 7^-автомата можно не задавать компоненты K, k0, Ф, тд и Тд, а в конфигурации автомата указывать только первые три элемента T* х S х M*.
Введем понятие класса детерминированных 7-автоматов, который важен тем, что автоматы из этого класса допускают детерминированное исполнение и позволяют задавать широкий класс контекстно-зависимых языков, что доказывается в разд. 6.
Определение 3. Под Yi-автоматом подразумевается 7-автомат, в котором все переходы функции переходов т детерминированы, а неоднозначность выбора между переходами т(s, б, m) и т(s,t,m) разрешается предпочтением перехода по t.
Введем подкласс класса 7-автоматов, который интересен тем, что выступает как подкласс обычных детерминированных магазинных автоматов с более ограниченным видом функции переходов т, что, как показано в разд. 5, повлекло за собой сужение класса задаваемых ими языков.
Определение 4. Пересечение класса Ys-автоматов и класса 71-автоматов обозначается как класс Ysl-автоматов.
Рассмотрим примеры 7-автоматов. Начнем с примера 7^-автомата Asl, определив его компоненты следующим образом. Пусть T = {'(', ')',tend}, S = {s0, sl, s2, Send}, Send = {send}. Функция переходов т 7sl-автомата Asl характеризуется следующим образом: т(з0, '(',m) = (sl,msend), т(sl, '(',m) = (sl,ms2), т(sl, ')',s) = (s,e), т(s2,e,m) = (sl, m)4.
Если на входной ленте находится цепочка '(()())', то работа задающего ее 7^-авто-мата Asl будет определяться следующей последовательностью конфигураций (конфигурации упорядочены слева направо и сверху вниз):
('(()())', so, б), ('()())', Sl,Send), (')())', sl, Send S2),
('())', S2,Send), ('())', Sl,Send), ('))', Sl, Send S2),
(')', s2, send), (')', sl, send), (б Send,6).
Заметим, что автомат Asl задает скобочный язык L = {'(а)'}, где а G A = {б, '(al)a2'} с al,a2 G A.
Рассмотрим пример y1 -автомата Al, определив его компоненты следующим образом.
Пусть T = {'(', ')', а, . . . , Z, tend}, S = {So, Sl, S3, S4, S5, Sa, S7, S8, Send}, Sfc = {S2}, Send =
{send}, K = {цепочка чисел, задающая содержимое магазина X}, k0 = 1, Ф = {ф}, Tk = {true, /а/Se}. Функция ^ автомата Al определяется как ^(s2) = ф. Функция переходов тд определяется как тд(S2,true) = s3, тд(S2,/a/Se) = s5. Функция /e определяется как
/e(S3,me) = (meS7), /e(S4,me) = (б) и /e(S,me) = (me) для S G {Sl, S5, Sa, S7, S8}.
4Правила т(в1,'(', т) = (в^т^) и т(в2,е, т) = (в1,ш) можно было бы заменить правилом
т(в1,'(', ш) = (в1,тв1), но это не было сделано для поддержания сходства с рассматриваемыми далее 7-схемами, которые не могут непосредственно представить указанное правило.
Функция ф автомата A1 возвращает значение true, если число на вершине магазина X равно глубине магазина X, и возвращает значение false — если иначе. Также (после проверки предыдущего равенства) функция ф увеличивает на единицу число на вершине магазина X. Для целей реальной трансляции состояниям и переходам модели Y-автомата приписываются пометки, обозначающие различные транслирующие процедуры над контекстом K, что более подробно рассматривается в разд. 8. Тем самым вводятся функция которая добавляет к магазину X единицу, и функция фрор,
которая выталкивает число из магазина X. Состояние s5 помечено функцией
Функция переходов т автомата A1 определяется следующим образом: т(s0,' (',m) = (s1,msend), т(s1,' (',m) = (s2,m), т(s1;' )',s) = (s,e) (переход помечен функцией фрор), т(s3,e,m) = (s8,m), т^4,е^) = (s1;m), т(s5,e,m) = (s1,ms6), т^6,е^) = (s1;m), т(s7, t, m) = (s7, m) для всех t G T \ {' )'}, т(s7,' )', m) = (s1; m), т(s8,' )', m) = (s4, m), т(s8,' a', m) = (s8, m).
Если на входной ленте находится цепочка ' ((abba)())', то работа задающего ее y1-автомата A1 будет определяться следующей последовательностью конфигураций:
((abba)())'
abba)())',
bba)())', )())',
))', )',
so,e,e, 1),
s3) serad> e) 2) s7j serad) 2) s7j serad) 2) s5 j serad; 3)
si, send, e, 3)
( ' (abba)())', ( ' abba)())', (' ba)())',
(' ())', ( ))',
(e,
si,send,e,1), (
s8, s7, 2), (
s7, ^nd^ 2), (
s1 , ^nd^ 2), (
si,send se,e, 3 1), (
e, e, e).
abba)())' bba)())',
a)())', ))',
)',
s2, send, e, 1),
s8, send, s7, 2), s7, send, e 2), s2, send, e, 2), s6, send, e, 3),
Заметим, что автомат А1 задает скобочный язык Ь = {'(а)'}, где а € А = {в, '(а1)а2'} с а1, а2 € А, в € В. Причем В = {а,... , г}* для скобок с номером п в скобках с уровнем вложенности, равным п, и В = е для всех остальных случаев. Также заметим, что в автомате А1 специальным образом задается разбор языка Ь2 = а* (начиная с состояния в8), являющегося подмножеством множества В. В качестве языка Ь2 можно взять произвольный язык, задаваемый 71-автоматом. Автомат А1 пытается разобрать язык Ь2 и, в случае неудачи, пропускает часть цепочки до первого символа закрывающей скобки (являющегося признаком окончания цепочки языка Ь2). Данная ситуация близка к реальной задаче разбора языка программирования с восстановлением разбора после синтаксических ошибок.
2. Изображение модели
Для визуального представления модели 7-автомата было разработано графическое представление, называемое 7-схемой [15], которое отображает модель 7-автомата в виде ориентированного размеченного графа. Вершины 7-схемы делятся на следующие классы:
1) прямоугольные вершины, соответствующие состояниям в € £ и :
а) вершины, соответствующие состояниям в € £:
1) вершины со сплошной границей, для соответствующих состояний которых ИМИ-функция /е имеет вид /е(в,те) = (те) и /е(в,те) = (теве) (рис. 1, а);
Рис. 1. Базовые элементы y-схемы
ii) вершины со штриховой границей, для соответствующих состояний которых ИМИ-функция fe имеет вид fe(s,me) = (se) и fe(s,me) = (б) (рис. 1, б);
b) вершины, соответствующие состояниям из Sk и имеющие сплошную границу и пометку элементом множества ф Е Ф (рис. 1, в);
2) вспомогательные круглые вершины с пометкой "pop" (рис. 1, г).
Дуги y-схем также подразделяются на несколько классов: 1) дуги из вершин, соответствующих состояниям s Е S:
a) дуги, задающие переходы первого вида т(s,5, m) = (si, m) различными способами в зависимости от символа 5:
i) сплошная дуга с меткой t Е T для любого 5 Е T (рис. 1, д);
ii) сплошная дуга без метки для всех 5 Е T \ Ts, где Ts — это метки всех других помеченных дуг, исходящих из вершины, соответствующей состоянию s (рис. 1, е);
iii) штриховая дуга без метки для 5 = б (рис. 1, ж);
b) непомеченные жирные пунктирные дуги, задающие переходы второго вида т(s,5, m) = (sn,ms1 ... sn-1) из состояния s5 в состояние sn и образующие путь от вершины состояния s1 до вершины состояния sn (рис. 1, й,к,л);
c) входящие в круглые вершины с пометкой "pop" дуги, задающие переходы третьего вида т(s, 5, s1) = (s1, б) из состояний s и имеющие различный вид в зависимости от символа 5 (рис. 1, м,н,о);
d) непомеченные пунктирные дуги с символом круга в начале дуги, задающие ИМИ-функции fe вида fe(s,me) = (mese) и fe(s,me) = (se), с началом в вершине состояния s и концом в вершине состояния se (рис. 1, з);
2) сплошные дуги с меткой Е Тк, исходящие из вершин, соответствующих состояниям из Бк (рис. 1, и).
5Вершина состояния ^ имеет исходящую дугу, которая может быть разного вида (в зависимости от символа 5), — она входит в вершину состояния в1.
Рис. 2. Примеры: а — 7^1 -схема; б — 71 -схема
а
Если 7-схема построена по 7{1?51}-автомату, как показано выше, то она называется 7{1,51}-схемой. Исходя из определения 71 -автомата, 71 -схема обладает следующими свойствами: из любой вершины не может исходить несколько одинаково помеченных дуг, из вершины, соответствующей состоянию из £, не может исходить более одной непомеченной сплошной или штриховой дуги, более одной жирной пунктирной дуги и более одной пунктирной дуги с символом круга в начале дуги.
Рассмотрим примеры 7-схем. На рис. 2, а приведена 7в1 -схема, задающая 7^-автомат Лз1 из разд. 1. На рис. 2, б приведена 71 -схема, задающая 71 -автомат А1 из разд. 1. Нетрудно заметить, что рис. 2, б более компактно и наглядно дает описание автомата А1, занимающее половину страницы в текстовом виде.
3. Свойства -автомата
Напомним понятие грамматики. Под грамматикой подразумевается четверка (Т, N, , Я), где Т — это терминальный алфавит, N — нетерминальный алфавит, £ N — начальный символ грамматики, Я — множество правил вывода. Под языком, задаваемым грамматикой, подразумевается множество цепочек терминальных символов, выводимых согласно правилам грамматики из начального символа грамматики. Контекстно-свободной грамматикой называется грамматика, правила вывода которой имеют вид В ^ а, где В £ N, а £ ^ и Т)*. Контекстно-свободным языком называется язык, задаваемый некоторой контекстно-свободной грамматикой. Грамматика и автомат эквивалентны, если задаваемые ими языки совпадают. Классы грамматик и автоматов эквивалентны, если для каждой грамматики в классе грамматик найдется эквивалентный ей автомат в классе автоматов и наоборот.
Известно, что класс недетерминированных магазинных автоматов эквивалентен классу контекстно-свободных грамматик [14]. В данном разделе показывается, что класс 7^-автоматов эквивалентен классу контекстно-свободных грамматик. Сначала покажем, что класс контекстно-свободных языков — это подкласс класса языков 7^-автоматов.
Утверждение 1. Для любого контекстно-свободного языка существует 7^-автомат,, его задающий.
Доказательство. Возьмем контекстно-свободную грамматику С = {Т', N', $0, Я}. Построим 75-автомат А, такой что ЬА = Ьс. Определим компоненты 7^-автомата А
следующим образом. Входной алфавит определим как Т = Т' и {£еп^}. Множество состояний £ = N и Ж'' и {веп^} и {в0}, где Ж'' = {г^-}, г =1... |К|, = 1... 3, где 3 — это длина правой части г-го правила вывода, N П Ж'' = 0, / Ж' и Ж'', в0 / N и Ж'', 5еп^ = в0. В качестве конечного состояния возьмем £еп^ = {веп^}. Функция переходов т содержит переход из начального состояния т(в0,е, е) = (в0, веп^), добавляющий конечное состояние в магазин М.
В качестве начального состояния входной ленты возьмем произвольную цепочку языка Ь^. Для каждого г-го правила грамматики В^ ^ а^д... а^, где а^д..^ € Ы' и Т', добавим следующие переходы к функции переходов т:
1) для каждого ] = 1... 3 полагаем следующее:
a) если а^- € Т', то добавляем переход т(гга-1,а^,т) = (г^-,т), полагая, что Гг,0 = В*;
b) если а^- € Ж', то добавляем переход т(гга-1,е,т) = (а^-, тг^-);
2) добавляем переход в состояние на вершине магазина М: т(г^, е, в) = (в,е).
Тем самым, одно правило магазинного автомата, разбирающего данную грамматику С, заменено несколькими правилами 7^-автомата А с помощью дополнительных магазинных символов. □
Следующее утверждение говорит, что справедливо и обратное включение.
Утверждение 2. Язык, задаваемый любым 73-автоматом, является контекстно-свободным.
Доказательство. Доказательство напрямую следует из того, что любой 7^-авто-мат — это недетерминированный магазинный автомат (с ограничением на функцию переходов т). □
Так как класс языков, задаваемых 7^-автоматами, совпадает с классом контекстно-свободных языков, то введенные ограничения на функцию переходов т 7^-автомата не повлекли за собой сужения класса языков, задаваемых недетерминированными магазинными автоматами. К сожалению, ввиду недетерминированности 7^-автоматы не допускают эффективного6 исполнения и поэтому не интересны для применений в реальных трансляторах [14].
4. Связь 7з1-автомата с классами грамматик
В данном разделе показывается, что существует класс грамматик, эквивалентный классу 7^-автоматов и не совпадающий с известным классом -грамматик [6].
Определим класс грамматик С7 = (Т, Ж, в0,К) с множеством правил К вида: (1) "^ ^а", (2) "^ ^а" и (3) "в0 ^ е", где ^ € Ж, ^ € Т и а € (Ж и Т)*, со следующими ограничениями:
1) все правила множества К с одинаковым нетерминалом имеют один вид;
2) каждое правило множества К с одинаковым нетерминалом уникально по терминалу £1;
3) каждое правило второго вида множества К с одинаковым нетерминалом имеет одинаковый нетерминал Ж2.
6Исполнение за время, пропорциональное длине входной цепочки.
Покажем, что класс грамматик С7 эквивалентен классу 7^-автоматов.
Утверждение 3. Любой грамматике из класса С7 соответствует 7^-автомат, задающий язык этой грамматики.
Доказательство. Рассмотрим доказательство утверждения 1 для грамматики из С7 в месте построения функции переходов 7^-автомата А. Докажем, что 7^-автомат А является 71 -автоматом, так как все переходы функции переходов т автомата А для грамматики из С7 детерминированы. Недетерминированность переходов может возникнуть в пунктах 1а и 1Ь утверждения 1 при ] = 1, если г^0 = В^. В пункте 1а переход т(г^>0,а^д,т) = (г,д,т) будет детерминированным ввиду того, что в грамматике из С7 каждое правило с одинаковым нетерминалом г^0 в левой части имеет уникальный терминал а^д. В пункте 1Ь правило перехода т(г^0,е,т) = (а^^тг^д) будет детерминировано, так как:
— в грамматике из С7 все правила с одинаковым нетерминалом г^0 в левой части начинаются с одинакового нетерминала а^д в правой части, что напрямую следует из третьего ограничения в определении класса грамматик С7;
— состояния г^д для совпадающих г^0 нетерминалов можно объединить в одно, потому что переход из них однозначно определяется терминалом а^2 и это напрямую следует из второго ограничения в определении класса грамматик С7.
Очевидно, что автомат А является 7^-автоматом, так как оставшийся переход в родительское состояние пункта 2 детерминирован ввиду уникальности состояния г^. □
Утверждение 4. Любому 7^-автомату соответствует грамматика из С7, задающая язык этого автомата.
Доказательство. Возьмем 7^-автомат А = {Т, £, в0, £еп^, т}. Согласно утверждению 13 (см. дальше), устраним в автомате А мнимые переходы первого и второго видов. Построим грамматику — (Т, £, в0,К). Для каждого перехода первого вида т(в1,^,т) = (в2,т) к множеству К добавим правило "в1 ^ ¿в2". Для каждого перехода второго вида т(в1,^,т) = (вп,тв2 ... вп-1) к множеству К добавим правило "в1 ^ ¿впвп-1,..., в2". Для каждого перехода третьего вида т(в1,^,в2) = (в2,е) к множеству К добавим правило "в1 ^ ¿". Для каждого перехода третьего вида т(в1,е,в2) = (в2,е) к множеству К добавим правило " в1 ^ е". Удалим мнимые переходы из грамматики, используя известный алгоритм для контекстно-свободных грамматик [14]. Очевидно, что каждое правило множества К с одинаковым нетерминалом в1 в левой части имеет уникальный терминал по свойству 7^-автомата. □
Покажем, что класс грамматик С7 не совпадает с классом ЬЬ1-грамматик. Для определения класса ЬЬ1-грамматик введем понятие множества ВЫБОР. Множеством ВЫБОР для правила В ^ а контекстно-свободной грамматики называется множество терминальных символов, с которых начинаются всевозможные терминальные цепочки, выводимые из цепочки а. Будем говорить, что грамматика является ЬЬ1-грамматикой, если она является контекстно-свободна и множества ВЫБОР всех ее правил с одинаковой левой частью не пересекаются.
Утверждение 5. Существуют -грамматики, не принадлежащие классу С7.
Доказательство. Рассмотрим грамматику С = (Т = {а, Ь, с}, М = {£, А, В}, £, К), где К = {"£ ^ Ас", "£ ^ Вс", "А ^ а", "В ^ Ь"}. Грамматика С, очевидно, принадлежит классу но не принадлежит классу С7, так как в ней существуют правила с одинаковой левой частью, но различными нетерминалами в начале правой части. □
Утверждение 6. В классе С7 существуют грамматики, не принадлежащие классу ЬЬ1.
Доказательство. Рассмотрим грамматику С = (Т = {а, Ь, с, N = {£, А}, Я), где Я = {"£ ^ Ас", "£ ^ А^", "А ^ а", "А ^ Ь"}. Грамматика С удовлетворяет всем требованиям класса грамматик С7, но не принадлежит классу ЬЬ^ так как содержит неоднозначность по первому терминалу выбора правила с нетерминалом £ в левой части. □
5. Связь 7з1-автомата с классами языков
Будем говорить, что язык является ЬЬ1-языком, если существует ЬЬ ^грамматика, его задающая [6]. В этом разделе показано, что класс языков, задаваемых 7^-автоматами, совпадает с классом ЬЬ^языков. Также исследуется класс языков, задаваемых 7^-автоматами с механизмом иерархической обработки неопределенностей.
Утверждение 7. Любой ЬЬ1-язык можно задать 7з1-автоматом.
Доказательство. Рассмотрим ЬЬ1-грамматику С произвольного ЬЬ^языка. Изменим грамматику С так, чтобы она продолжала задавать язык исходной грамматики, но принадлежала классу С7. Этого достаточно, так как уже доказано существование 7^1-автомата, задающего язык Ьс7. В грамматике С множества ВЫБОР, построенные для правил с одинаковой левой частью, не содержат одинаковых элементов, поэтому очевидно, что каждое правило грамматики С можно заменить множеством правил первого вида N1 ^ ¿1а для ¿1 £ ВЫБОР правил грамматики класса С7 путем замены первого нетерминала правой части правила. Очевидно, что после таких замен грамматика останется в классе ЬЬ1 и непересечение множеств ВЫБОР для правил с одинаковой левой частью будет означать соблюдение второго ограничения в определении класса грамматик С7. Первое и второе ограничения в определении класса грамматик С7 для измененной грамматики будут очевидно удовлетворены. □
Утверждение 8. Любой 7з1-автомат задает ЬЬ1-язык.
Доказательство. Рассмотрим грамматику из С7, соответствующую взятому 7^-автомату. Правила первого вида грамматики из С7 с одинаковой левой частью имеют непересекающиеся множества ВЫБОР ввиду того, что они различны по первому терминалу.
Рассмотрим правила второго вида грамматики из С7 с одинаковой левой частью " N1 ^ Введем новый нетерминал N для каждого нетерминала N1, стоящего
в левой части правила второго вида. К грамматике добавим правила первого вида " N ^ ¿1а1".
Если правила первого нетерминала N2 имеют второй вид "N2 ^ ^¿2а2", то после подстановки снова получаются правила второго вида " N1 ^ а1". Сделав еще
одну подстановку, получим правила вида " N1 ^ ^¿2а2N", которые будут удовлетворять второму ограничению из определения класса грамматик С7, так как для каждого нетерминала N1 они различны по терминалу ¿2, ввиду уникальности терминала ¿2 для одинаковых нетерминалов N2. Там самым для полученных правил можно повторять процедуру замены первого нетерминала на правила второго вида до тех пор, пока первый нетерминал не будет стоять в левой части правил первого вида.
Если правила первого нетерминала N2 имеют первый вид " N2 ^ ¿2а2", то после подстановки получатся правила первого вида "N1 ^ ¿2а2^", которые также будут удовлетворять второму ограничению из определения класса грамматик С7, так как для каждого нетерминала N1 они различны по первому терминалу. Тем самым правила
второго вида грамматики из С7 с одинаковой левой частью также имеют непересекающиеся множества ВЫБОР.
Все правила грамматики с одинаковой левой частью имеют непересекающиеся множества ВЫБОР, поэтому грамматика из С7 принадлежит классу ЬЬ1. □
Очевидно, что 7^-автомат является детерминированным магазинным автоматом с ограничением на функцию переходов т. Известно из [6], что класс ЬЬ1-языков — это собственный подкласс класса детерминированных контекстно-свободных языков7. Таким образом, введенные ограничения на функцию переходов т 7^-автомата повлекли за собой сужение класса детерминированных контекстно-свободных языков до класса ЬЬ1 -языков.
Рассмотрим влияние ИОН-механизма на класс языков, представимых 7^-автомата-ми. ИОН-механизм 7-автоматов, задаваемый ИМИ-функцией /е и магазином исключений Ме, был введен для удобства построения и сохранения наглядности реальных 7-схем, описывающих синтаксический анализ языков программирования. ИОН-механизм позволяет избежать необходимости полного определения функции переходов т для описания 7-автоматов с возможностью обработки синтаксических ошибок во входной программе. По своей сути ИОН-механизм сходен с механизмом обработки исключений известных языков программирования.
Определение 5. Под 7«е1 -автоматом подразумевается 751-автомат с ИОН-механизмом.
Хотя ИОН-механизм не предназначается для расширения класса языков, задаваемых 7^-автоматами, можно показать, что класс языков 7«е1-автоматов включает неконтекстно-свободный язык и не включает контекстно-свободный язык. Тем самым язык 7«е1-автомата не совпадает ни с одним из известных классов языков, но, очевидно, включает в себя класс ЬЬ1-языков.
Утверждение 9. Существует неконтекстно-свободный язык, задаваемый 7«е1-ав-томатом.
Доказательство. Используем известный неконтекстно-свободный язык, состоящий из цепочек вида апЬпсп для всех п > 0. Рассмотрим 7«е1-автомат, в котором Т = {а, Ь, С, ¿еп^}, £ — {$0,$1,$2,$3, $по }, = {зуе«}. Функция переходов т определяется следующим образом: т(з0, е, т) = (з1, тз3), т(з1, а, т) = (з1, тз2), т(з1, е, т) = (т, е), т(з2,Ь, т) = (т,е), т(з3,с, т) = (з3,т), т(зпо,£,т,те) = (зпо,т,те) для всех £ € Т. Функция /е определяется так: /е($0,те) = (теЗуе«), /е($1,те) = (те5гао), /е($3,те) = (е),
/е($по,те) = (е).
При распознавании букв а по сути их количество п запоминается в магазинах М и Ме. Магазин М используется для распознавания ровно п букв Ь, а магазин Ме — для распознавания ровно п букв с. Автомат может достигнуть конечного состояния зуе« только в случае возникновения неопределенной ситуации в состоянии з3, когда сработает переход в состояние на вершине магазина Ме, причем только в том случае, если состоянием з3 из магазина Ме было вытолкнуто п раз состояние зпо. Попав в состояние зпо, автомат с неизбежностью попадет в неопределенное положение при исчерпании магазина Ме. □
Утверждение 10. Существует контекстно-свободный язык, не задаваемый 7«е1-автоматом.
7Язык детерминированного магазинного автомата называется детерминированным контекстно-свободным языком.
Доказательство. Рассмотрим язык Ь, задаваемый контекстно-свободной грамматикой С = (Т = {а,6,с,^},Ж = {£, А,В},£,К), где К = {"£ ^ А", "£ ^ В", "А ^ аАЬАс", "В ^ аВЬВ^"}. Язык Ь не принадлежит классу ЬЬ&-языков, так как для любого наперед заданного числа к существует достаточно длинная цепочка, принадлежащая языку Ь, по первым к символам которой нельзя определить, нетерминал А или нетерминал В ее задает.
Ввиду того что нетерминалы А и В задаются с помощью ветвящейся рекурсии, их невозможно сымитировать итеративными способами, наподобие трюка, описанного при доказательстве утверждения 5. Значит, 7^е1-автомат, задающий язык Ь, должен использовать магазин М для обеспечения корректной вложенности нетерминалов А и В. Различить, какой из этих нетерминалов задает распознаваемую цепочку языка, можно только в момент считывания терминала с или Даже если каким-то образом изменить содержимое магазина Ме, чтобы отразить, какая из букв (с или была встречена, при рекурсивном возврате по магазину М автомат сможет воспользоваться этой информацией только при возникновении неопределенной ситуации (функция переходов т не определена для текущей конфигурации), которая невозможна ввиду ее отсутствия при движении автомата по той же части пути до момента добавления этой информации в магазин Ме. □
6. Свойства 71-автомата
Как показано ранее, 7^-автоматы ограничены довольно узким классом LLi-языков и поэтому малоприменимы для синтаксического анализа реальных языков программирования, спроектированных без учета принадлежности к этому классу формальных языков. Поэтому с точки зрения мощности множества задаваемых языков интерес представляет более широкий класс 71-автоматов, класс языков которого, как будет показано в этом разделе, совпадает с классом контекстно-зависимых языков8. Рассмотрение ограничивается контекстно-зависимыми языками, в предположении, что контекст исполнения ограничен конечной памятью реальных вычислительных систем. Следующее утверждение показывает, что класс контекстно-зависимых языков — это подкласс класса языков Yi-автомата.
Утверждение 11. Для любого контекстно-зависимого языка существует 71-ав-томат, его задающий.
Доказательство. Возьмем произвольный контекстно-зависимый язык L с грамматикой (T',N',s0,R'). Как известно из [14], класс контекстно-зависимых языков совпадает с классом языков линейно ограниченных автоматов. Таким образом, существует линейно ограниченный автомат Al, задающий язык L.
Рассмотрим 71-автомат, в котором T = T' U {tend}, S = (s0, s3}, Send = {s3}, Sfc = {s2}, K = {X | строка символов из алфавита T'}, Tk = (true, /a/se}, ^(s2) = ^decide, Ф = (0decide}. Состояние s0 помечено действием "сделать строку символов X пустой". Состояние s1 помечено действием "добавить последний прочитанный символ входной ленты к строке символов X". Функция переходов т, определяется так: т(s0,t,m) = (s1,m), т(s0,tend,m) = (s2,m), т(s1,t,m) = (s2,m), т(s1,tend,m) = (s2,m) для любого t G T и любого m G M. Функция 0decide реализует автомат Al, используя в качестве
8Контекстно-зависимый язык задается контекстно-зависимой грамматикой (T, N, so,R), правила R которой имеют вид а ^ в, где а, в G (N U T)* и |а| < |в|.
его ленты строку символов X и возвращая true, если строка допустима, и false — если иначе. Функция переходов Tk содержит переход Tk(s2,true) = (S3), помеченный действием "сообщить, что входная цепочка принадлежит языку L". Функция переходов Tk также содержит переход Tk(s2, false) = (s3), помеченный действием "сообщить, что входная цепочка не принадлежит языку L".
Построенный Yi-автомат с очевидностью задает язык L, так как по сути он только накапливает символы входной ленты для использования ее в качестве ленты линейно ограниченного автомата9. □
Следующее утверждение говорит, что справедливо и обратное включение. Утверждение 12. Язык, задаваемый любым Y1-авmомаmом, является контекстно-зависимым.
Доказательство. Доказательство напрямую следует из того, что ввиду конечности памяти реальных вычислительных систем y1 -автомат является подклассом линейно ограниченного автомата. □
Таким образом, класс языков, задаваемых y1 -автоматами, совпадает с классом контекстно-зависимых языков.
7. Оптимизация 71-автомата
В данном разделе показаны конструктивные способы оптимизации, применимые к классу 71-автоматов, такие как минимизация состояний, устранение мнимых переходов10 и недостижимых состояний, позволяющие повысить эффективность работы автомата для практических нужд. Сначала рассмотрим устранение мнимых переходов в Ys1-автоматах.
Утверждение 13. В рамках модели Ys-i^-автомата, не сужая класс представимых им языков, можно устранить все мнимые переходы первого и второго видов.
Доказательство. Для устранения мнимого перехода первого вида т(si,e,m) = (s2,m) достаточно заменить его множеством переходов A U B U C U {d} для всех t, не участвующих в переходах из состояния s1, где:
— A = {т(s1,t,m) = (s3,m) | для каждого перехода т(s2,t,m) = (s3,m)};
— B = {т(s1,t,m) = (sn+1,ms3... s«) | для каждого перехода т(s2,t,m) = (sn+i,ms3 ... s«)};
— C = {т(s1 ,t,s3) = (s3,e) | для каждого перехода т(s2,t, s3) = (s3,e)};
— d — мнимый переход из состояния s2, если он существует, в котором исходное состояние s2 заменено на состояние si.
Мнимый переход второго вида т(s1, e, m) = (sn, ms2 ... sn-1) устраняется его заменой на множество переходов A U B U C U { d} для всех t, не участвующих в переходах из состояния s1, где:
— A = {т(s1, t, m) = (s«+1, ms2 ... sn-1) | для каждого перехода т(sn, t, m) = (s«+1, m)};
— B = {т(s1, t, m) = (sn+m, ms2 ... sn ... sn+m-1) | для каждого перехода т(sn, t, m) =
(^«^mo msn+1 • • • sn+m-1)};
9Используемый в доказательстве утверждения 6 автомат не нагляден, так как скрывает все детали разбора в контекстной функции фdecide- Однако для большинства языков программирования, синтаксис которых в основном представим детерминированным контекстно-свободным языком, можно сохранить разумный баланс наглядности автомата и его контекстных функций, как, например, на рис. 2, б-
10Переход функции переходов т называется мнимым, если его второй аргумент равен е-
— С = {т(в1,^,т) = (вп-1,тв2 ... вп-2) | для каждого перехода т(вп, ¿,вп-1) =
(вп-1,е)};
— й — мнимый переход из состояния вп, если он существует, в котором исходное состояние вп заменено на состояние в1.
Очевидно, что все вышеперечисленные замены не меняют язык, задаваемый 7^-автоматом. Также очевидно, что достаточно выполнить конечное число таких замен для полного устранения мнимых дуг первого и второго видов, так как каждая замена сокращает их конечное число на единицу. □
Для устранения мнимых переходов третьего вида в модели 7^-автомата необходимо расширить переход третьего вида до перехода т(в1,^,т1) = (в2,е), выталкивающего состояние из магазина М и использующего его для определения состояния в2. Такое расширение ввиду роста числа переходов, зависящих от содержимого магазина, было сочтено нецелесообразным для их наглядного изображения в рамках 7-схем. В рамках класса 71-автомата невозможно избавиться от мнимых переходов в состояния, которым сопоставлены функции /е, изменяющие содержимое магазина Ме, так как модель 7-ав-томата не позволяет приписывать изменение стека Ме переходам функции переходов т.
Некоторые из состояний 71-автомата могут оказаться недостижимыми11. Недостижимые состояния могут быть удалены для экономии размера автомата.
По 71-автомату часто можно построить 71-автомат с меньшим числом состояний, эквивалентный исходному. Соответствующий процесс называется минимизацией 71-ав-томата.
Утверждение 14. Для любого 71-автомата можно построить эквивалентный ему 71-автомат с числом состояний меньшим или равным числу состояний исходного автомата.
Доказательство. Минимизация 71-автомата схожа с минимизацией конечного автомата [9]. Сначала все состояния автомата разбиваются на класс конечных состояний (£еп^) и классы состояний, разбиваемые отношением эквивалентности =0. Пара состояний (в1, в2) принадлежит отношению =0, если верен предикат (А1 V А2) Л В1 Л (С1 V С2), где:
— терм А1 истинен тогда и только тогда, когда из состояний в1 и в2 не существует мнимых переходов;
— терм А2 истинен тогда и только тогда, когда из состояний в1 и в2 существуют мнимые переходы;
— терм В1 истинен тогда и только тогда, когда состояния в1 и в2 имеют один вид функции /е;
— терм С1 истинен тогда и только тогда, когда в1, в2 € £;
— терм С2 истинен тогда и только тогда, когда в1, в2 € и = ^(в2).
Отношение =0 рефлексивно и симметрично, так как все отношения термов предыдущего предиката рефлексивны и симметричны. Отношение =0 транзитивно, так как все отношения термов предыдущего предиката транзитивны, а отношения термов с одинаковой буквой не пересекаются. Тем самым отношение =0 является отношением эквивалентности.
Так как 71-схемы имеют дополнительные (повышающие их наглядность) обозначения, то для минимизации 71-автомата в терминах 71-схем к предикату отношения =0
11 Недостижимыми называются состояния, не отмеченные обходом (при обходе рассматриваются переходы, заданные синтаксисом автомата) по переходам т, т^ и (рассматриваемой здесь тоже как функция перехода) из состояния во.
необходимо добавить терм А3, проверяющий, что из вершин, соответствующих состояниям и з2, исходят сплошные непомеченные дуги. Также необходимо добавить терм
проверяющий, что вершины, соответствующие состояниям и з2, и все переходы из них, вызванные одинаковыми пометками, имеют одинаковые пометки транслирующих процедур.
Далее каждый полученный класс эквивалентности разбивается отношением эквивалентности =1. Пара состояний (з1,$2) принадлежит отношению =1, если любой одинаково помеченный переход т, и /е (рассматриваемой здесь как функция перехода) из этих состояний ведет к состояниям из одного класса эквивалентности предыдущего разбиения. Разбиение продолжается до тех пор, пока общее число классов эквивалентности будет увеличиваться, после чего совокупность представителей полученных классов эквивалентности будет состояниями минимизированного автомата. □
8. Описание транслятора
С помощью 71-схем можно реализовать транслятор, осуществляющий лексический, синтаксический и семантический разборы языков программирования. Для этого к вершинам и дугам 71-схем добавляются пометки, состоящие из идентификаторов транслирующих процедур. Реализация процедур в формализме 71-схем не уточняется и может иметь общий модифицируемый контекст исполнения, позволяющий задавать трансляцию произвольной сложности.
Транслятор разделяется на графическую, текстовую и интерпретирующую части. Графическая часть описывает 71 -схему, задающую 71-автомат, который задает синтаксис языка. Текстовая часть содержит описание контекстно-зависимых переходов ("семантики отношений") и транслирующих процедур ("операционной семантики"), использующихся в 71-автомате. Интерпретирующая часть транслятора исполняет его графическую и текстовую части.
Разделение транслятора на графическую и текстовую части позволяет сочетать сильные качества обеих форм представления, что косвенно подтверждается распространенными средствами визуального моделирования [16]. Графические спецификации подходят для проектирования и документирования из-за богатства способов представления, легче усваиваемых кратковременной памятью человека. Текстовые спецификации лучше подходят для реализации программы по причине сочетания строгости, гибкости, компактности записи и переносимости. К другим преимуществам разделения транслятора на графическую и текстовую части относятся:
— простота модификаций входного языка путем наглядных изменений 71-схемы;
— высокая переносимость по причине интерпретируемости 71-автомата;
— упрощение реализации и тестирования процедур (проверки входных и выходных условий) за счет их логической обособленности;
— более экономное расходование памяти за счет общего контекста процедур без накладных расходов, присущих иерархии локальных контекстов вложенных функциональных вызовов;
— более эффективное и легкое восстановление общего контекста процедур, что обычно нереализуемо в языках высокого уровня без дополнительных расходов, связанных с обработкой исключений;
— автоматизация тестирования транслятора за счет наличия исполняемого описания синтаксиса в виде 71-автомата;
— возможность использования динамических оптимизаций на уровне интерпретатора 7!-автомата, настраивающих его на транслируемый язык или даже на конкретную программу языка в процессе ее разбора;
— возможность легкой инструментации транслятора на уровне интерпретатора 71-автомата и сбора статистики программ транслируемого языка.
Компилятор переднего плана потокового языка Sisal 3.1 системы функционального программирования [17] спроектирован с использованием рассмотренного разделения на графическую, текстовую и интерпретирующую части. Компилятор переднего плана осуществляет лексический и синтаксический разбор (совмещенный с семантическим) текста программ языка Sisal 3.1 во внутреннее представление, основанное на потоке данных. Разработанный транслятор обеспечивает простоту учета модификаций языка, удовлетворительную скорость трансляции12, качественные сообщения об ошибках и о предупреждениях и развитые механизмы восстановления после ошибок разбора. Использование Yi-схем позволило сократить объем текста транслятора переднего плана языка Sisal 3.1 до 10 тыс. строк по сравнению с 30 тыс. строк кода аналогичной части транслятора OSC 12.0 для более простой версии языка Sisal 1.2 [18].
Заключение
В статье вводится и исследуется новая автоматная модель, предназначенная для описания синтаксического разбора языков программирования. Модель допускает наглядное изображение в виде графа и упрощает ручное построение высокоэффективных распознавателей, минуя недостатки, свойственные их автоматическому построению. В детерминированном случае автоматы введенной модели задают класс LLi-языков. Задание более широких классов языков описывается неявно с помощью контекстных состояний, используемых для разбора трудных фрагментов языка и, как правило, не влияющих на наглядность графа всего автомата, что подтверждается опытом реализации компилятора переднего плана потокового языка Sisal 3.1. Показаны способы повышения эффективности автомата введенной модели, такие как минимизация состояний, устранение мнимых переходов и недостижимых состояний. Описываются преимущества реализации транслятора с использованием автоматов введенной модели.
Список литературы
[1] Ахо А.В., Сети Р., УльмАн Д.Д. Компиляторы: принципы, технологии и инструменты. СПб.: Вильямс, 2001. 768 с.
[2] Johnson S.C. YACC — yet another compiler compiler. N.Y.: Murray Hill, 1975. 33 p. (Tech. Rep. / AT&T Bell Labs; N 32).
[3] Donnelly C., Stallman R.M. Bison Manual: Using the YACC-Compatible Parser Generator. Boston, MA: Free Software Foundation, 2003. 136 p.
12Невысокая скорость разбора, до десяти раз медленнее обычных показателей трансляторов промышленного уровня, объясняется тем, что задача построения высокоскоростного транслятора изначально не ставилась. В частности, высокая скорость разбора ограничивается интерпретацией yi-автомата и накладными расходами вызова методов COM-интерфейсов, с помощью которых транслятор переднего плана был реализован.
[4] Grüne D., Jacobs C. Parsing techniques: a practical guide. New Jersey: Ellis Horwood, 1990. 322 p.
[5] Parr T. The Complete Antlr Reference Guide. Pragmatic Bookshelf, 2007. 361 p.
[6] Льюис Ф., РоЗЕНКРАНЦ Д., Стринз Р. Теоретические основы проектирования компиляторов. М.: Мир, 1979. 656 с.
[7] Leermakers R. The Functional Treatment of Parsing. Norwell, MA: Kluwer Academic Publishers, 1993. 158 p.
[8] Horspool R.N. Recursive ascent-descent parsing // Computer Languages. N.Y.: Pergamon Press, 1993. Vol. 18, N 1. P. 1-15.
[9] Полетаева И.А. Методы трансляции: конспект лекций. Новосибирск: НГТУ, 1997. 59 с.
[10] NüneS-Harwitt A. CPS Recursive Ascent Parsing // Proceedings of International LISP Conference, 2003. 6 p.
[11] McDonald J. Interactive Pushdown Automata Animation // ACM SIGCSE Bulletin. N.Y.: ACM Press, 2002. Vol. 34, N 1. P. 376-380.
[12] Cavalcante R., Finley T., Rodger S.H. A visual and interactive automata theory course with JFLAP 4.0 // ACM SIGCSE Bulletin. N.Y.: ACM Press, 2004. Vol. 36, N 1. P. 140-144.
[13] Вирт Н., ЙЕНСЕН К. Паскаль. Руководство для пользователя и описание языка. М.: Финансы и статистика, 1989. 255 с.
[14] КАСЬЯНОВ В.Н., Поттосин И.В. Методы построения трансляторов. Новосибирск: Наука, 1986. 330 с.
[15] Стасенко А.П. Графический метаязык для описания транслятора // Сб. тр. аспирантов и молодых ученых "Молодая информатика". Новосибирск: ИСИ СО РАН, 2005. С. 105-113.
[16] Кузнецов Б.П. Психология автоматного программирования // Журнал BYTE, 2000. № 11. С. 22-29.
[17] SFP — An interactive visual environment for supporting of functional programming and supercomputing / Kasyanov V.N., Stasenko A.P., Glühankov M.P. et al. // WSEAS Transactions on Computers. Athens: WSEAS Press, 2006. Vol. 5, N 9. P. 2063-2070.
[18] Стасенко А.П. Использование автоматного подхода для построения компилятора переднего плана // Тез. конф.-конкурса "Технологии Microsoft в теориии и практике программирования". Новосибирск, 2006. C. 37-39.
Поступила в редакцию 26 июля 2006 г., в переработанном виде — 25 мая 2008 г.