Изменения
→Атрибуты в ANTLR
Общедоступный генератора разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение.
Рассмотрим для примера грамматику арифметических выражений с оператором операторами <tex>+</tex>, <tex>-\times\div</tex>, и выводом результата выражениая.
Вне продукций грамматики бывает нужно вставить в сгенерированный разборщик(для Java) package, import, а также некоторые поля и методы. Это делается с помощью <code>@header</code> и <code>@members</code>:
grammar Expr;
'''@header''' { package toolsru.ifmo.ctddev.wiki; import java.util.*; }
'''@parser::members''' {
Map<String, Integer> memory = new HashMap<String, Integer>();
int eval(int left, int op, int right) {
//...
}
}
Естественным образом можно добавлять действия в продукции, где это нужно. Действия выполняются после предыдущего элемента грамматики и до следующего. В данном примере действия добавлены на конце альтернативы, поэтому действие выполнится после того, как разборщик распознает все выражение. Когда разборщик встречает выражение, за которым идет символ новой строки, ему нужно напечатать результат. Когда он встречает присваивание - ему нужно записать имя и значение переменной в память.
t '''ereturns''' ['''returnsInteger''' [int valvalue]: : a=e op=('*') b=e f {$val value = eval($a.val, $opf.type, $b.val)value;} | a=e op= ('+*') b=e f {$val = eval($a.val, $op.type, $b.val);} | INT {$val value *= $INTf.intvalue;} | ID { String id = $ID.text; $v = memory.containsKey(id) ? memory.get(id) : 0; } | '(' '''e''' ')' {$val = $e.val;} *;
== Примечания ==