Arithmetic evaluation: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: demo\rosetta\Arithmetic_evaluation.exw)
Line 66: Line 66:


Dict[String, Symbol] symbol_table
Dict[String, Symbol] symbol_table
Array[String] tokens
[String] tokens
V tokeni = -1
V tokeni = -1
ASTNode token_node
ASTNode token_node
Line 75: Line 75:
:tokeni++
:tokeni++
:token_node = ASTNode()
:token_node = ASTNode()
I :tokeni == tokens.len
I :tokeni == :tokens.len
:token_node.symbol = :symbol_table[‘(end)’]
:token_node.symbol = :symbol_table[‘(end)’]
R
R
Line 84: Line 84:


F expression(rbp = 0)
F expression(rbp = 0)
ASTNode t = :token_node
ASTNode t = move(:token_node)
advance()
advance()
V left = t.symbol.nud(t)
V left = t.symbol.nud(move(t))
L rbp < :token_node.symbol.lbp
L rbp < :token_node.symbol.lbp
t = :token_node
t = move(:token_node)
advance()
advance()
left = t.symbol.led(t, left)
left = t.symbol.led(t, move(left))
R left
R left


Line 108: Line 108:


F infix(id, bp)
F infix(id, bp)
F led(ASTNode self, left)
F led(ASTNode self, ASTNode left)
self.first_child = left
self.first_child = left
self.second_child = expression(self.symbol.led_bp)
self.second_child = expression(self.symbol.led_bp)
Line 119: Line 119:
R self
R self
symbol(id).set_nud_bp(bp, nud)
symbol(id).set_nud_bp(bp, nud)

infix(‘+’, 1)
infix(‘+’, 1)
infix(‘-’, 1)
infix(‘-’, 1)
Line 126: Line 125:
prefix(‘-’, 3)
prefix(‘-’, 3)


F nud(ASTNode self)
symbol(‘(number)’).nud = self -> self
R self
symbol(‘(number)’).nud = nud
symbol(‘(end)’)
symbol(‘(end)’)