Изменения

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

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

48 байт добавлено, 23:40, 4 июня 2015
Атрибуты в ANTLR
grammar Expr;
'''@header ''' { package tools; import java.util.*; } '''@parser::members ''' {
Map<String, Integer> memory = new HashMap<String, Integer>();
int eval(int left, int op, int right) {
Естественным образом можно добавлять действия в продукции, где это нужно:
'''stat: ''' '''e ''' NEWLINE {System.out.println($e.val);} | ID '=' ''' e ''' NEWLINE {memory.put($ID.text, $e.val);}
| 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);}
$v = memory.containsKey(id) ? memory.get(id) : 0;
}
| '(' ''' e ''' ')' {$val = $e.val;} ;
В первой строке здесь определяется возвращаемое значение ('''[int val]''') для нетерминала '''e'''. Это именно тот атрибут, на который ссылается '''$e.val''' в примерах выше.
497
правок

Навигация