УДК 519.685.3
Вестник СПбГУ. Сер. 1, 2005, вып. 2
А. С. Лукичев
ИСПОЛЬЗОВАНИЕ АТРИБУТОВ В ТЕХНОЛОГИИ SYNTAX
Введение. В информатике широко используются искусственные языки. Это не только языки программирования, но также и многочисленные интерфейсы приложений. Поэтому проблема описания и анализа таких языков остается актуальной. Среди задач, которым служит описание языка, можно выделить такие, как [6]:
• возможность исследования свойств языка;
• возможность автоматической генерации анализатора языка по его описанию.
Выбор систем автоматической генерации анализаторов очень широк. Большинство из этих систем реализуют генерацию алгоритмов анализа по регулярным или контекстно-свободным грамматикам, например, LEX/YACC [2, 7]. В первом случае получаются весьма эффективные приложения, однако класс языков, к которым применима подобная техника, достаточно узок. Во втором случае класс языков шире, однако и сложность даже алгоритмов распознавания может быть O(n3) из-за недетерминизма используемого механизма. Задача анализа может потребовать и обратного просмотра.
Одной из основных целей разработки технологии SYNTAX [8] было совместить применимость к широкому классу языков с высокой эффективностью распознавателей. Методика спецификации и реализации трансляций, применяемая здесь, основана на идее аппроксимации контекстно-свободного языка регулярными множествами, подобно сплайнам. Средства задания языков базируются на так называемых RBNF-грам-матиках, правила которых определяют порождения для нетерминалов при помощи регулярных выражений. Анализатор — сплайновый процессор — на отдельных участках входной цепочки ведет себя, как конечный автомат, используя магазин лишь для сопряжения аппроксимирующих регулярных множеств. Данный подход позволяет добиться высокой эффективности реализации трансляций [8].
Использование только лишь контекстно-свободных грамматик не позволяет описать полностью синтаксис используемых на практике искусственных языков. Описания таких языков зачастую содержат ограничения, требующие контекстно-зависимого анализа. Например, требование использования в вычислениях только описанных переменных. Для формального описания таких языков можно использовать двухуровневые грамматики. Наиболее известными являются W-грамматики А. ван Вейнгаардена [9] и аффиксные грамматики [4, 5]. Идея использования таких грамматик состоит в том, что на первом уровне порождаются, возможно, бесконечные множества нетерминалов и правил, которые уже потом участвуют в выводе цепочек языка (второй уровень). В случае аффиксных грамматик нетерминалы второго уровня получаются из нетерминалов первого уровня их параметризацией с помощью аффиксов. Для задания контекстно-зависимых условий используются предикатные символы.
Еще одной задачей является описание синтаксичеоки-управляемой трансляции. В системах синтаксически-управляемой обработки данных используется метод привязки
© А. С. Лукичев, 2005
семантических процедур к правилам граматики: при выполнении разбора по определенному правилу грамматики исполняется связанная с ним семантическая процедура. Семантические процедуры зависят друг от друга по данным, при этом последовательность их вызова определяется синтаксической частью транслятора, задаваемой контекстно-свободной грамматикой. Д. Кнут предложил схему задания трансляции, в которой такие потоки данных описываются на уровне грамматики [3].
В SYNTAX-технологии изначально аффиксы и атрибуты не были предусмотрены, однако для реализации контекстной зависимости и спецификации трансляции использовались предикатные символы (резольверы) и семантические процедуры (семантики), соответственно. Резольверы и семантики не имели параметров, что означало, что весь обмен контекстной информацией мог осуществлятся лишь через глобальную операционную среду. Это выводило разработку операционной среды из-под контроля технологии. Введение атрибутов в SYNTAX-технологию равносильно введению параметризации упомянутых семантических процедур и предикатных функций. При этом атрибуты в SYNTAX имеют и черты аффиксов, так как используются также для параметризации нетерминалов. Введение механизма поддержки атрибутов в данной технологии придает ей большую надежность и предоставляет пользователю больше удобств и дополнительной информации при проектировании средств синтаксической обработки данных. Целью настоящей работы является рассмотрение одного из возможных способов реализации такой поддержки, формальное построение трансляции и описание модели вычислений в такой системе.
Введение атрибутов в технологию SYNTAX. При описании введения атрибутов в технологию SYNTAX будем опираться на ее изложение в монографии [8].
При введении атрибутов для контекстно-свободных грамматик [3] наборы атрибутов связываются с вхождениями грамматических символов (нетерминалов и терминалов) в правила грамматики, а правила вычислений значений атрибутов связываются с самими правилами грамматики. Так, правилу грамматики A ^ Bi B2, где A имеет синтезируемый атрибут ci, а Bi и B2 —наследуемые атрибуты С2 и сз, соответственно, можно сопоставить правило вычисления атрибута ci := f (с2, сз). Важно отметить, что атрибуты здесь характеризуются не только своим именем, но и вхождением связанного с ними грамматического символа в правило. Так, в правиле A ^ BB атрибуты, связанные с вхождениями нетерминалов B будут различны, поскольку различны эти вхождения, т.е. правило для вычисления ci, атрибута A, будет выглядеть как ci := f (с2, сз), где С2 и сз — атрибуты первого и второго вхождений B, соответственно. Если рассматривать соответствующий узел в дереве разбора как запись с полями для хранения информации, то атрибут грамматического символа можно считать именем поля [1].
Рассмотрим возможность применения аналогичного подхода к RBNF-граммати-кам. Управляющая RBNF-грамматика определяется [8] как формальная система G = (Vn, Vt, R, S, P, S), где Vn и Vt — множества нетерминалов и терминалов соответственно, R и S — множества револьверов и семантик, S G Vn — начальный нетерминал, а P — множество правил вида N : Rn , где N G Vn , а Rn —регулярное выражение над объединенным алфавитом VR = Vn U Vt U R U S. Значение такого регулярного выражения fj,(R) определяется следующим образом:
a, a G VR U {e},
R*i,
Ri,R2, Ri; R2 •
{a}, если R
ж k
, U u(Ri)k, если R = fJ,(R) = ^ k=0
m(Ri)m(R2), если R =
fJi(Ri) U h(R2), если R =
Взяв в качестве примера правило A : B+ RBNF-грамматики и применив предложенную выше схему введения атрибутов, можно связать, например, атрибут ci с вхождением A, а атрибут c2 — с вхождением B и задать правило вычисления ci как ci := f (02). Однако, в таком случае вычисление ci не будет зависеть от того, какому из предложений B, BB, BBB и т. д. соответствует разбираемая по даному правилу синтаксическая конструкция. Оказывется удобно вычислять значения атрибутов итеративно в процессе анализа входной цепочки по соответствующему правилу грамматики, т. е. в данном примере можно некоторым образом задать правило ci := g(ci, c2), которое исполняется всякий раз при разборе очередной подконструкции входной цепочки, соответствующей очередному вхождению B. Таким образом, в случае, если разбираемая синтаксическая конструкция соответствует BBB, то значение атрибута ci будет вычисляться по правилу ci := f (Co, Ci, C2, C3), где f (x0,xi,x2,x3) = g(g(g(x0,xi),x2),x3), Ci, C2, C3 — значения синтезируемых атрибутов для каждого вхождения B в цепочку BBB, Co — начальное значение ci, задаваемое при инициализации; Co — константа, поэтому значение ci в данном случае зависит от трех параметров — значений синтезируемых атрибутов вхождений B.
Для реализации такого подхода рассмотрим следующую схему: со всяким вхождением нетерминала в левые части правил свяжем набор формальных атрибутов, а со всяким вхождением нетерминала, семантики или резольвера в правые части правил свяжем набор фактических атрибутов.
Формальные атрибуты можно разделить на 3 класса:
а) наследуемые атрибуты (in);
б) синтезируемые атрибуты (out);
в) локальные атрибуты (local).
Набор формальных атрибутов изображается следующим образом: (in Ii, ...,In, out Oi,..., Om, local Li,..., Lk).
Здесь Ii,... ,In —имена наследуемых атрибутов, Oi,..., Om —имена синтезируемых атрибутов, Li,...,Lk —имена локальных атрибутов.
Фактические атрибуты можно разделить на 2 класса:
а) наследуемые атрибуты (in);
б) синтезируемые атрибуты (out).
Набор фактических атрибутов изображается следующим образом:
(Xi,...,Xs).
Пусть Ф = (inIi,..., In, out Oi,..., Om, local Li,..., Lk). Набор фактических атрибутов (Xi,. .. ,Xs) называется определенным в контексте набора формальных атрибутов Ф, если Xi € {Ii,..., In}U{Oi,..., Om}U{Li,..., Lk} для вяского i € 1. ..s. Пустой набор фактических атрибутов (е) является определенным в контексте любого набора формальных атрибутов. Пусть О(Ф) —множество наборов фактических атрибутов, определенных в контексте набора формальных атрибутов Ф, тогда правило NФ : RN, где RN — регулярное выражение над алфавитом VNВ(Ф) U VT U ^КВ(Ф) U Т*В(Ф), называется аннотированным правилом. RBNF-грамматику с аннотированными правилами
будем называть атрибутной RBNF-грамматикой. Рассмотрим операнд RN Хф, где X G Vn U R U S, а ф G П(Ф). Если ф = (Ii,...,Im ,Oi,...,On), где Ii,...,Im —наследуемые фактические атрибуты, а Oi,..., On — синтезируемые, то сигнатурой данного операнда называется цепочка innoutm, т.е. последовательность, задающая порядок и класс атрибутов (наследуемые либо синтезируемые). Тогда сигнатурой нетерминала N, стоящего в левой части правила N Ф : RN, где Ф = (in Ii,. ..,In, out Oi, ..., Om, localLi,..., Lk), называется цепочка innoutmlocalk, т. е. последовательность, задающая порядок и класс формальных атрибутов (наследуемые, синтезируемые либо локальные).
Рассмотрим следующие аннотированные правила RBNF-грамматики:
E (out с, local a,b) : N (a), ' + ',N(b),Add(a,b,c).
N (out v) : ScanN umber (v), 'Number'.
Здесь в контексте набора формальных параметров нетерминала E определены наборы фактических параметров (a), (b), (a,b,c). Сигнатура Add(a,b, с) выглядит следующим образом: in in out, сигнатура E — out local local.
При изучении свойств RBNF-грамматик и построении сплайновых процессоров удобно бывает рассматривать представление RBNF-грамматики в виде граф-схемы — аналога диаграмм Вирта. Граф-схема представляет собой направленный граф, вершины которого помечены символами из Vn U Vt , а дуги — цепочками из R* и S*. Каждому регулярному выражению в правой части правила RBNF-грамматики можно сопоставить компоненту граф-схемы, пользуясь таблицей 1.
Граф-схема разбивается на множество компонент, однозначно соответствующих правилам RBNF-грамматики. При этом начальная вершина компоненты, соответствующей правилу N : Rn , помечена символом Begin — N, а конечная — End — N, N G Vn .
Пусть имеется атрибутная RNBF-грамматика. Рассмотрим аннотированное правило NФ : RN. Ему также можно сопоставить компоненту граф-схемы по таблице 1. Начальная вершина здесь будет помечена NФ, внутренние вершины — элементами VNБ(Ф) U VT, а дуги — цепочками из (RD(^))* и (Е.О(Ф))*.
Определим теперь атрибутную трансляционную RBNF- грамматику Gt — (Gc,E), где Gc —атрибутная управляющая RBNF-грамматика, а E — операционная среда; E = (E,F, Ir,Is,eo), где E — пространство состояний операционной среды, F — множество значений атрибутов грамматических символов (нетерминалов, семан-тик и резольверов), Ir = {ip : ip : E x F* ^ {false, true}} — множество предикатов, ассоциированных с резольверами и параметризованных значениями атрибутов, Is = {ia : ia : E x F* ^ E x F*} — множество преобразований операционной среды, ассоциированных с семантиками и параметризованных значениями атрибутов.
Определим рекурсивное построение трансляции. Пусть имеется правило nw = NФ : RN, где Ф = (inIi,...,In, outOi,...,Om, localLi,...,Lk). Построим функцию Tnw : VT* x E x F* ^ 2ExF . Будем строить множество Tnw (x,e,f) для некоторых x G VT**, e G E, f G F *. При этом f = ii... inoi... omli. ..lk —цепочка длины n + m + k, в противном случае Tnw (x,e,f) = 0. Пусть n(RN) содержит цепочку X^i ...Х8ф8, Ф1 ,. ..,фа G D(^), фj = e, если Xj G V*, j G 1,...,s. Каждый набор фактических атрибутов фj = (Yi,... ,Yp), j G 1,...,s, можно ассоциировать с двумя отображениями
ф{1] : Г*
Г* и ф{р : Г* х Г*
Г*, а именно:
Ф? (I)
где уг =
У1 ■■■Ур,
1г,
Ir+n, Ir+n+m,
если 3 г € 1,...,п : Уг = 1Г, если 3 г € 1,...,т : Уг = Ог, если 3 г € 1,...,к : Уг = Ок ■
Не умаляя общности, можно считать, что в наборе фз У1,...,У —наследуемые атрибуты, а У-+1, ...,Ур — синтезируемые (для некоторого 0 < £ < р). Тогда:
ф2) (1,д) = VI ■ ..Уп+т+к,
дг, если п < I < п + т и Ог-п+1 = Уг+г, где уг = ^ дг, если п + т <1 < п + т + к и Ьг-п-т+1 = Уг+г, 1г, в остальных случаях.
Говоря неформально, ф^1 выбирает значения наследуемых атрибутов грамматического символа Xз из набора текущих значений контекста формальных атрибутов Iфк), а ф(2 присваивает некоторым элементам из этого набора значения соответствующих синтезируемых атрибутов Xз.
Построим недетерминированным образом последовательность троек ((Iфз), в з, хз ))^=о цепочек длины п + т + к из Г, состояний операционной среды вз € Е и хз € (УтU{Z})*,
^ € УТ:
I(0)
во хо I(з+1)
вЗ+1
I,
в,
ф?) (I з),п в',
i фз+1) = ф т (i з),п
если X.,
1 з — £ и (вф. 1 определена и равна (в', I'),
V € £ и V(в з,фЗ1 (Iфз)))
в +1
в,
IЗ+1) = I з),
в +1 =
I (З+1) в +1
I (З+1) в +1
X.,
IЗ),
в ,
= £,
IЗ),
в ,
Z,
если X. = М € Ум, = М : ЯМ правило грамматики и (в', I') €
(х^з^фр!)) для некоторой цепочки х € Ут*
если X з € Ут
если X. = р € Я и "р(вз, фЗ1 (Iфз))) = Ьтэ,
если X з = р € Я и "р(в з, фу (Iфз))) = Еа^е.
—-
—-
у
х
х
3
х
3
Тогда (e',f') G тПт (x,e,f), если и только если существует разбиение x = xi ...ха такое, что можно построить хотя бы одну последовательность ((f(j),ej,xj)j=o, где e' = es, f' = f(а).
Пусть nil G F — специальное значение, означающие отсутствие присвоенного значения. Потребуем, чтобы сигнатура начального нетерминала S была localk, k > 0. Тогда трансляцией, задаваемой трансляционной грамматикой Gc называется {(x, e) : (e, f) G тП0 (x, e0, nilk), f G F*}, где п0 —правило для S.
Для определения трансляции потребовалось ввести ряд ограничений, которые можно переформулировать следующим образом.
1. Все вхождения нетерминала в правила имеют одинаковую сигнатуру, при этом если имеется вхождение N G Vn , имеющее фактический набор атрибутов (Ii,...,Im,Oi,...,On), где Ii,...,Im —наследуемые атрибуты, а Oi,...,On — синтезируемые, то N имеет набор формальных атрибутов (in ii,.. ., in, out Oi,. ..,om, local li, ...,lk).
2. Терминальные символы не имеют атрибутов.
3. Начальный нетерминал грамматики не имеет формальных синтезируемых и наследуемых атрибутов.
4. Вхождение резольвера имеет пустое множество синтезируемых атрибутов (с целью исключить побочные эффекты).
В приведенном определении трансляции никак не учитывался тот факт, что в наборе значений наследуемых фактических атрибутов могут присутствовать неопределенные (nil) значения. Для избежания подобной ситуации необходимо удовлетворить следующие ограничения. Для удобства сформулируем их в терминах граф-схем.
5. Если формальный атрибут используется как наследуемый фактический атрибут, то
а) либо на всяком пути в компоненте граф-схемы из начальной вершины в данную соответствующий формальный атрибут хотя бы однажды использовался как синтезируемый фактический атрибут;
б) либо соответствующий формальный атрибут является формальным наследуемым атрибутом нетерминала, соответствующего данной компоненте.
6. Для всякого синтезируемого формального атрибута нетерминала, соответствующего данной компоненте, на всяком пути в компоненте граф-схемы из начальной вершины в конечную существует вершина, у которой данный формальный атрибут используется как синтезируемый фактический атрибут.
Рассматривая модель вычислений в данной системе, имеет смысл говорить о магазине контекстов, двигающемся вместе с магазином сплайнового процессора. Контекстом в таком случае является некоторое множество объектов {fi,...,fp}, а текущим контекстом — контекст, находящийся на вершине магазина контекстов. Каждый объект fi = (ni,vi) имеет имя n(fi) = ni и значение v(fi) = Vi G F — множество значений атрибутов грамматических символов. Пусть начальный нетерминал
Элемент граф-схемы Регулярное выражение йдг
.—► Ддг = Г, 8, £, где г 6 8 6 £*
Ддг = гу 8, а, где а 6 Уг и Удг, г € 8 € И*
< Ri R, Ддг — ; 5 где Н\ и Нъ — регулярные выражения
1 V V R J Ддг = И*, где К — регулярное выражение
Ддг — ? -^2 > где и — регулярные выражения
S имеет набор формальных атрибутов (localli,...,lk) (в силу ограничения (3) множества наследуемых и синтезируемых атрибутов у него пусты). Механизм построения сплайнового процессора подробно описан в [8], воспользуемся лишь результатами данного процесса. В начале работы в магазин сплайнового процессора помещается магазинный символ X = {Begin — S}, а в магазин контекстов — множество неинициализированных объектов {(li, nil),..., (lk, nil)}. Пусть теперь на вершине магазина контекстов находится контекст Y' = {fi,...,fp}, а сплайновый процессор помещает на вершину магазина магазинный символ X = {vi,...,vs} (помещение в магазин цепочки символов можно разбить на последовательное помещение одиночных символов). При этом каждая вершина Vj помечена Nj(n(fw(i)),...,n(fw(n+m))), где w : 1 : n + m ^ 1 : p — некоторая функция, задающая набор атрибутов, параметризующих грамматический символ. В дальнейшем будем называть w функцией выбора атрибутов. Тогда, в силу ограничения (1), нетерминал Nj имеет набор формальных атрибутов (in ii,...,in, out oi,..., om, local li,...,lk). В магазин контекстов помещается контекст Y" = {Ii,..., In, Oi,..., Om, Li,..., Lk}, причем n(Ii) = ii,i G 1,...,n; n(Oi) = Oi,i G 1,..., m; n(Li) = li,i G 1,...,k. При этом v(Ii) = v(fw(i)), i G 1,...,n, а объекты Oi,...,Om, Li,...,Lk не инициализированы. При выполнении перехода из подавляемого состояния, снятии символа с вершины магазина и, таким образом, возврате к контексту Y' происходит установка значений синтезируемых атрибутов: v(fw(i+m)) = v(Oi), i G 1,...,n. При вычислении резольвера, имеющего фактический набор атрибутов (n(fw(i)),..., n(fw(n))) в том же контексте Y, происходит вызов ассоциированной с ним предикатной фукнции с параметрами (v(fw(i)),...,v(fw(n))). При совершении семантического действия, связанного с семантическим символом, имеющим фактический набор атрибутов (n(fw(i)),..., n(fw(n+m))) в контексте Y и сигнатуру innoutm, происходит обращение к ассоциированной с данной семантикой процедуре, имеющей входные параметры (v(fw(i)),... ,v(fw(n))) и выходные— (v(fw(n+i)),
. . . ,v(fw(n+m))).
Из приведенного построения видно, что для обеспечения детерминированности процедуры, необходимо, чтобы все нетерминалы Nj, помечающие вершины vj граф-схемы, составляющие магазинный символ X = {vi,. ..,vs}, имели одинаковые сигнатуры, со-
ответствующие наследумые атрибуты имели одинаковые значения, а синтезируемые атрибуты следовали в одинаковом порядке. Будем считать, что два набора фактических атрибутов эквивалентны, если соответствующие им функции выбора атрибутов совпадают. Таким образом, можно сформулировать следующее ограничение.
7. Если в разложении состояния по некоторому терминалу на одном уровне расположены вершины, помеченные нетерминалами М1,...,Ые, то все N з должны иметь одинаковые сигнатуры, а их наборы фактических атрибутов должны быть эквивалентны.
В [8] введено требование семантической балансировки, заключающееся в том, что все пути от начальной вершины к листьям в разложении состояния по некоторому терминалу помечены одинаковыми цепочками семантик. Данное требование связано с тем, что при приеме входного символа и переходе в следующее состояние сплайновый процессор движется не по одной дуге в граф-схеме, а по целому набору параллельных путей, ведущих в следующее состояние — множество терминальных вершин, помеченных данным входным символом (аналогичная схема применяется при построении детерминированного конечного автомата по недетерминированному [1]). При этом необходимо выполнение семантик, помечающих дуги. Следовательно, для исполнения требования детерминированности все пути должны быть помечены одинаковыми цепочками семантик. По тем же соображениям, учитывая вышеприведенную схему вычислений, необходимо дополнить требование семантической балансировки условием того, что соответствующие друг другу вхождения семантик в цепочки должны иметь одинаковые наборы значений фактических атрибутов уа-и(1)),..., уа-и(п+т)), как, например, в следующем случае:
Л(т х) : Б(х); С(х).
в(ть) : Бвт{Ъ), 'а'^.
С(тс) : Бвт(с), 'а',У.
Таким образом, можно сформулировать еще одно ограничение.
8. Все пути от начальной вершины к листьям в разложении состояния по некоторому терминалу должны быть помечены не просто одинаковыми цепочками семантик, эти семантики должны иметь одинаковые сигнатуры, а их наборы фактических атрибутов должны быть эквивалентны.
При этом резольверы, имеющие различные сигнатуры или неэквивалентные наборы фактических атрибутов, считаются различными.
Рассмотрим следующий пример:
Л(т а) : Б (а).
Б(та) : "зТгив(а), 'х'.
Здесь Л и Б —нетерминалы, имеющие наследуемый атрибут а; а "зТгпв — резоль-вер, также имеющий один фактический атрибут. Принятие символа 'х' зависит от значения резольвера "вТгпв, для вычисления которого необходимо, чтобы на вершине магазина контекстов находился контекст нетерминала Б. Однако этот контекст помещается в магазин контекстов только после помещения в магазин сплайнового процессора символа, соответствующего Б, что, в свою очередь, может произойти только после того, как символ 'х' будет принят. Данный пример иллюстрирует необходимость еще одного ограничения.
9. На любом пути в компоненте граф-схемы от начальной вершины до вершины, помеченной терминальным или нетерминальным символом, или конечной вершины не должно лежать резольвера, имеющего непустой набор фактических атрибутов.
Для реализации семантик и резольверов с атрибутами используются процедуры и функции с параметрами. Согласованность по управлению и по данным гарантирована приведенными ограничениями.
Преимущества атрибутных спецификаций. Основная цель атрибутизации SYNTAX спецификаций (т.е. внесения атрибутов в RBNF-грамматики и реализации поддержки этих изменений в описании семантики) — связать потоки данных в семантической части спецификации трансляции с ее синтаксической частью, упростив схему управления данными приложения. При этом описанные выше ограничения не накладывают на эти потоки дополнительных ограничений, которых можно было бы избежать при реализации семантики независимо от синтаксической части, т. е. без использования параметризации нетерминалов, семантик и резольверов. Действительно, ограничения (1)—(6) гарантируют, что все формальные атрибуты, используемые как фактические, имеют определенные значения. Ограничение (7) основывается на схеме формирования магазина в сплайновом процессоре и в любом случае должно удовлетворяться. Ограничение (8) учитывает тот факт, что во время прямого просмотра нет полной информации о пути в граф-схеме, соответствующем принимаемой входной цепочке, и на одном шаге процессор проходит по некоторому множеству «параллельных» дуг, поэтому, в силу детерминированности механизма, семантические цепочки, помечающие такие дуги, должны выдавать одинаковый результат, т. е. состоять из одинаковых семантик с одинаковыми атрибутами. Спецификация, не удовлетворяющая ограничению (9), может быть легко преобразована в нужную форму путем вынесения начальных резольверов в объемлющие правила. Например:
Ai(ina) : ..., B(a),....
A2(ina) : ...,C(a),----
B(in a) : p(a),C(a),....
C(in a) : s(a), 'x',....
Данный фрагмент может быть преобразован таким образом:
Ai(ina) : . ..,p(a),s(a),B(a),....
A2(in a) : . ..,s(a),C(a),....
B(ina) : C(a),....
C(ina) : 'x',....
Естественно, язык, порождаемый нетерминалами B и C в определенном контексте, станет другим, но язык, порождаемый грамматикой в целом, не изменится.
Summary
A. S. Lukichev. Using the attribute technique in SYNTAX technology.
A method of using the attribute technique for SYNTAX technology is proposed. Attributes are widely used for context-free language semantics implementation and are supported by a number of well-known compiler generation systems The peculiarities of the attribute technique implementation for SYNTAX technology concerning the constraints of the technology are considered.
Литература
1. Ахо А., Сети Р., Ульман Дж. Компиляторы: принципы, технологии, инструменты. М., 2001.
2. Johnson S. C. Yacc — yet another compiler compiler // Computer Science Technical Report 32. AT&T Bell Laboratories, Murray Hill, N.J., 1975.
3. Knuth D. E. Semantics of context-free languages // Mathematical Systems Theory 2:2. 1968. P. 127-145.
4. Koster C. H. A. On the Construction of ALGOL-Procedures for Generating, Analyzing and Translating Sentences in Natural Languages // Report MR72, Mathematisch Centrum, Amsterdam, 1965.
5. Koster C.H.A. Affix Grammars // Proceedings of IFIP Conference on ALGOL 68 Implementation. Munich, 1970. P. 95-109.
6. Koster C. H. A. Affix Grammars for Programming Languages // Attribute Grammars, Applications and Systems. International Summer School SAGA. Prague. 1991.
7. Lesk M. E. Lex — a lexical analyzer generator // Computer Science Technical Report 39. AT&T Bell Laboratories, Murray Hill, N.J., 1975.
8. Мартыненко Б. К. Синтаксически управляемая обработка данных. СПб., 1997.
9. van Wijngaarden A. Orthogonal Design and Description of a Formal Language. Report MR76, Mathematisch Centrum. Amsterdam, 1965.
Статья поступила в редакцию 16 ноября 2004 г.