Изменения

Перейти к: навигация, поиск

Атрибутные транслирующие грамматики

91 байт добавлено, 14:50, 5 июня 2015
Нет описания правки
{| style="background-color:#CCC;margin:0.5px"
!style="background-color:#EEE"| продукцииПродукция
!style="background-color:#EEE"| Семантические правила
|-
===Пример S-атрибутной грамматики===
<wikitex>
Выпишем синтаксически управляемое определение для грамматики арифметических выражений с операторами $+$ и $*$ (здесь $\{ADD {{...}} \}$ и $\{MUL {{...}} \}$ {{- --}} [[Атрибутные_транслирующие_грамматики#tr_char|транслирующие символы]]. Если в продукции несколько раз встречается одинаковый нетерминал, будем добавлять к нему индексы, считая от начала продукции.):
{| style="background-color:#CCC;margin:0.5px"
|style="background-color:#FFF;padding:2px 30px"| $S.val=E.val$
|-
|style="background-color:#FFF;padding:2px 30px"| $E E_0 \to E E_1 + T\ \{ADD\ res = op_1 + op_2\}$
|style="background-color:#FFF;padding:2px 30px"| $ADD.op_1=E_1.val \\ ADD.op_2=T.val \\ E_0.val=ADD.res $
|-
|style="background-color:#FFF;padding:2px 30px"| $E.val=T.val$
|-
|style="background-color:#FFF;padding:2px 30px"| $T T_0 \to T T_1 \times F \ \{MUL\ res = op_1 * \times op_2\}$
|style="background-color:#FFF;padding:2px 30px"| $MUL.op_1=T.val \\ MUL.op_2=F.val \\ T_0.val=MUL.res$
|-
Общедоступный генератора разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение.
Рассмотрим для примера грамматику арифметических выражений с оператором $<tex>+$</tex>, $*$<tex>\times</tex>, и выводом результата выражениая.
Вне продукций грамматики бывает нужно вставить в сгенерированный разборщик(для Java) package, import, а также некоторые поля и методы. Это делается с помощью '''<code>@header''' </code> и '''<code>@members'''</code>:
grammar Expr;
| '(' '''e''' ')' {$val = $e.val;} ;
В первой строке здесь определяется возвращаемое значение ('''<code>[int val]'''</code>) для нетерминала '''e'''. Это именно тот атрибут, на который ссылается '''<code>$e.val''' </code> в примерах выше.Во второй строке, присваивания '''<code>a=e''' </code> и '''<code>b=e''' </code> иллюстрируют семантические правила, а действие '''<code>{$val = eval($a.val, $op.type, $b.val);}''' </code> {{---}} транслирующий символ из определений, которые мы рассматривали в начале статьи.
== Примечания ==
497
правок

Навигация