Изменения

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

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

439 байт добавлено, 13:14, 6 июня 2015
Атрибуты в ANTLR
Общедоступный генератора разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение.
Рассмотрим для примера грамматику арифметических выражений с операторами <tex>+\times</tex>, скобками и выводом результата выражениая.
grammar ExprExpression;
'''@header''' { package ru.ifmo.ctddev.wiki; }
Стартовый нетерминал печатает резульат:
s : e expr { System.out.println($e.value);};
Естественным образом можно добавлять действия в продукции, где это нужно. Действия выполняются после предыдущего элемента грамматики и до следующего.
e '''returns''' ['''Integer''' value]: t {$value = $t.value;} ( '+' t {$value += $t.value;} )*grammar Expr;
t '''returns''' ['''Integer''' value]:start f : expr EOF {System.out.println($value = $fexpr.valueval);} ( '*' f {$value *= $f.value;} )*;
f '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''' ['''Integer''' valueint val] :ц { $val = $i; } | NUM '*' fact e = termP[$i * $fact.val] {$value val = Integer.parseInt($NUMe.text)val;} | ;  fact returns [int val] : '(' e expr ')' {$value val = $eexpr.val; } | NUM { $val = Integer.parseInt($NUM.valuetext);}
;
497
правок

Навигация