Изменения

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

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

596 байт добавлено, 13:23, 6 июня 2015
Атрибуты в ANTLR
Общедоступный генератора разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение.
Рассмотрим для примера грамматику той же грамматики арифметических выражений с операторами <tex>+\times</tex>, скобками и выводом результата выражениаяпример на ANTLR.
grammar Expression;
'''@header''' { package ru.ifmo.ctddev.wiki; }
 
Естественным образом можно добавлять действия в продукции, где это нужно. Действия выполняются после предыдущего элемента грамматики и до следующего.
Стартовый нетерминал печатает резульат:
s : expr { System.out.println($e.value);};
Естественным образом можно добавлять действия Разобранные нетерминалы возвращают результат, вычисленный в продукцииподдереве(<code>returns [int val]</code>) как свой синтезируемый атрибут, где это нужнопроцесс вычисления которого описан в фигурных скобках <code>{ $val = $exprP.val; }</code>. Наследуемые атрибуты передаются нетерминату как параметр(<code>exprP[$term. Действия выполняются после предыдущего элемента грамматики и до следующегоval]</code>).
expr '''returns ''' ['''int ''' val]
: term exprP[$term.val] { $val = $exprP.val; }
;
exprP['''int ''' i] '''returns ''' ['''int ''' val]
: { $val = $i; }
| '+' term e = exprP[$i + $term.val] { $val = $e.val; }
;
term '''returns ''' ['''int ''' val]
: fact termP[$fact.val] { $val = $termpP.val; }
;
termP['''int ''' i] '''returns ''' '''[int ''' val]
: { $val = $i; }
| '*' fact e = termP[$i * $fact.val] { $val = $e.val; }
;
fact '''returns ''' ['''int ''' val]
: '(' expr ')' { $val = $expr.val; }
| NUM { $val = Integer.parseInt($NUM.text); }
497
правок

Навигация