Created
September 27, 2018 06:13
-
-
Save serguei-k/0b475a9171fca10b0f3f72d6f053da06 to your computer and use it in GitHub Desktop.
Parse Binary Expression
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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