Skip to content

Instantly share code, notes, and snippets.

@serguei-k
Created September 27, 2018 06:13
Show Gist options
  • Save serguei-k/0b475a9171fca10b0f3f72d6f053da06 to your computer and use it in GitHub Desktop.
Save serguei-k/0b475a9171fca10b0f3f72d6f053da06 to your computer and use it in GitHub Desktop.
Parse Binary Expression
# operator precedence table
PRECEDENCE = {
'<': 10, '>': 10, '<=': 10, '>=': 10, '==': 10, '!=': 10,
'+': 20, '-': 20,
'*': 30, '/': 30, '%': 30,
}
# parse 1 + 2 * 3
def parse_binary_right(self, prec, left):
# prec starts with default 0
# left operand is 1
while True:
# on first iteration the current token is +
# query its precedence to get 20
left_prec = self.get_precedence()
if left_prec < prec:
return left
op_value = self.token.value
self._data.next() # consume current + token
# recurse to get right operand
right = self.parse_element()
# current token is now *, with precedence 30
if left_prec < self.get_precedence():
# operator has higher precedence so recurse to get right operand
right = self.parse_binary_right(left_prec + 1, right)
# after recursion right operand is now a binary AST: Binary(2 * 3)
# final binary expression is created here as Binary(1 + Binary(2 * 3))
left = Binary(op_value, left, right)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment