Изменения

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

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

21 байт добавлено, 17:00, 11 февраля 2019
Атрибуты в ANTLR
==Атрибуты в ANTLR==
Общедоступный генератора генератор разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение.
Рассмотрим для той же грамматики арифметических выражений с операторами <tex>+,\ *</tex>, скобками и выводом результата выражениая выражения пример на ANTLR.
grammar Expression;
Естественным образом можно добавлять действия в продукции, где это нужно. Действия выполняются после предыдущего элемента грамматики и до следующего.
Стартовый нетерминал печатает резульатрезультат: s : expr { System.out.println($eexpr.valueval); }; В продукции для нетерминала <code>expr</code> определяется возвращаемое значение (<code>['''int''' val]</code>). Обращение к этому атрибуту имеет вид <code>$expr.value</code>. В фигурных скобках записаны семантические правила.
Разобранные нетерминалы возвращают результат, вычисленный в поддереве(<code>returns [int val]</code>) как свой синтезируемый атрибут, процесс вычисления которого описан в фигурных скобках <code>{ $val = $exprP.val; }</code>.
exprP['''int''' i] '''returns''' ['''int''' val]
: { $val = $i; } <font color="green"> // <tex>\varepsilon</tex>-правило</font> | '+' term e expr = exprP[$i + $term.val] { $val = $eexpr.val; }
;
term '''returns''' ['''int''' val]
: fact termP[$fact.val] { $val = $termpPtermP.val; }
;
termP['''int''' i] '''returns''' '''[int''' val]
: { $val = $i; } | '*' fact e expr = termP[$i * $fact.val] { $val = $eexpr.val; }
;
WS : [ \t \r \n]+ -> skip ;
NUM : [0-9]+ ;
 
 
В продукции для нетерминала <code>e</code> определяется возвращаемое значение (<code>[Integer value]</code>). Обращение к этому атрибуту имеет вид <code>$e.value</code>. В фигурных скобках записаны семантические правила.
== Примечания ==
Анонимный участник

Навигация