# of same precedence right_side = context.expression(self.lbp) return left + right_side class Substraction(Token): lbp = 10 # Same precedence as addition def led(self, left, context): return left - context.expression(self.lbp) def nud(self, context): """When a '-' is present on the left of an expression.""" # This means that we are returning the opposite of the next expression return - context.expression(self.lbp) class Multiplication(Token): lbp = 20 # Higher precedence than addition/substraction def led(self, left, context): return left * context.expression(self.lbp) lexer = Lexer(with_parens=True) lexer.register_token(Integer, re.compile(r'\d+')) lexer.register_token(Addition, re.compile(r'\+')) lexer.register_token(Substraction, re.compile(r'-')) lexer.register_token(Multiplication, re.compile(r'\*')) def parse(text): return lexer.parse(text)
from tdparser import Lexer, Parser, Token, ParserError from tdparser.topdown import EndToken __all__ = ['parse_expression', 'parse_expressions'] def escape_string(text): return '"%s"' % text.replace('\\', '\\\\').replace('"', '\\"') def unescape_string(text): assert text[0] == text[-1] == '"' return text[1:-1].replace('\\"', '"').replace('\\\\', '\\') lexer = Lexer() class Key(Token): regexp = r'[A-Za-z_][A-Za-z0-9_]*' def nud(self, context): return self class Number(Token): regexp = r'-?\d+' type = 'int' def __init__(self, text): Token.__init__(self, text)