Изменения

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

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

821 байт добавлено, 15:28, 5 июня 2015
Пример работы с атрибутами в нисходящем разборе
В данном примере не требуется дерево разбора в явном виде. В данной реализации рекурсивные функции от нетерминалов получают на вход(если необходимо) наследуемые атрибуты узла и возвращают синтезируемые (результат вычислений соответствующего подвыражения). Как мы видим, $val$ - синтезируемый атрибут, $acc$ - наследуемый атрибут, $ADD$ - транслирующий символ.
E() : '''intNode''' Node res = Node("E") '''switch''' (curToken) '''case''' n, '(' : res.addChild(T()) <font color="blue">int temp = res.children[T].val res.addChild(E'(temp)) </font> '''break''' '''default''' : <font color= T"red">error</font>("unexpected char") E'<font color="blue">res.val = E'(T.val)</font> '''return''' E'.valres 
E'(acc) : '''intNode''' Node res = Node("E'")
'''switch''' (curToken)
'''case''' '+' :
consume('+')
Tres.addChild(Node("+")) res = .addChild(T()) <font color="blue">int temp = res.children[T].val ADD.res = ADD(acc, T.valtemp) E'res.val = addChild(E'(ADD.res)) res.val = res.children[E'].val</font> ''return'break'' E'.val '''case''' '\varepsilon$', ')': <font color="blue">res.val = acc;</font> '''returnbreak''' acc '''default''' : <font color="red">error</font>("unexpected char") '''return''' res
F() : '''intNode''' Node res = Node("F")
'''switch''' (curToken)
'''case''' n :
consume(n)
Fres.addChild(Node(curToken)) <font color="blue">res.val = n.val</font> '''returnbreak''' F.val
'''case''' '(' :
consume('(')
Fres.addChild(Node("(")) res.addChild(E()) <font color="blue">rev.val = res.children[E()].val</font>
consume(')')
'''return''' Fres.valaddChild(Node(")"))
'''default''' :
<font color="red">error</font>("unexpected char")
'''return''' res
Функции для $T$ и $T'$ строятся аналогично.
497
правок

Навигация