497
правок
Изменения
→Атрибуты в ANTLR
Общедоступный генератора разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение. Рассмотрим для примера грамматику арифметических выражений.
Вне продукций граматики бывает нужно вставить в сгенерированный разборщик(пример для Java) package или import, а также некоторые поля и методы. Это делается с помощью '''@header ''' и '''@members''':
grammar Expr;
@header { package tools; import java.util.*; }
@parser::members {
| NEWLINE ;
Действия выполняются после предыдущего элемента грамматики и до следующего. В данном примере действия добавлены на конце альтернативы, поэтому действие выполнится после того, как парсер сматчит разборщик распознает все выражение. Когда парсер разборщик встречает выражение, за которым идет символ новой строки, ему нужно напечатать результат. Когда он встречает присваивание - ему нужно записать имя и значение переменной в память.
Правило для '''e''' теперь выглядит следующим образом:
e returns [int val]
: a=e op=('*'|'/') b=e {$val = eval($a.val, $op.type, $b.val);}
| a=e op=('+'|'-') b=e {$val = eval($a.val, $op.type, $b.val);}
| INT {$val = $INT.int;}
| ID {
String id = $ID.text;
$v = memory.containsKey(id) ? memory.get(id) : 0;
}
| '(' e ')' {$val = $e.val;} ;
В первой строке здесь определяется возвращаемое значение ([int val]) для '''e'''. Это именно тот атрибут, на который ссылается $e.val в примерах выше.
Во второй строке, присваивания '''a=e''' и '''b=e''' иллюстрируют семантические правила, а действие '''{$val = eval($a.val, $op.type, $b.val);}''' {{---}} транслирующий символ из примеров, которые мы рассмотрели выше.
== Примечания ==
<references/>
= Источники информации =
* Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс. Первое издание. 2003. Стр. 279 {{---}} 305.