497
правок
Изменения
→Пример работы с атрибутами в нисходящем разборе
В данном примере не требуется дерево разбора в явном виде. В данной реализации рекурсивные функции от нетерминалов получают на вход(если необходимо) наследуемые атрибуты узла и возвращают синтезируемые (результат вычислений соответствующего подвыражения). Как мы видим, $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('+')
F() : '''intNode''' Node res = Node("F")
'''switch''' (curToken)
'''case''' n :
consume(n)
'''case''' '(' :
consume('(')
consume(')')
'''default''' :
<font color="red">error</font>("unexpected char")
'''return''' res
Функции для $T$ и $T'$ строятся аналогично.