from structs import * def parseExpression(token, prev, tokens): idx = 0 args = [] prev = token while tokens[idx].type_ != TokenType.CLOSE_PAREN: token = tokens[idx] inc = 1 if token.type_ == TokenType.OPEN_PAREN: expr, inc = parseExpression(token, prev, tokens[idx+1:]) args.append(expr) elif token.type_ in (TokenType.STRING, TokenType.TRUE, TokenType.FALSE, TokenType.INT, TokenType.FLOAT): expr, inc = parseLiteral(token, prev, tokens[idx+1:]) args.append(expr) elif token.type_ in (TokenType.INT_TYPE, TokenType.FLOAT_TYPE, TokenType.STRING_TYPE, TokenType.ANY_TYPE): expr, inc = parseType(token, prev, tokens[idx+1:]) args.append(expr) else: expr, inc = parseSymbol(token, prev, tokens[idx+1:]) args.append(expr) idx += inc prev = token return List(args), idx + 2 # parens def parseSymbol(token, prev, tokens): return Symbol(token.text, token.line), 1 def parseLiteral(token, prev, tokens): if token.type_ == TokenType.STRING: return String(token.value), 1 elif token.type_ == TokenType.INT: return Int(token.value), 1 elif token.type_ == TokenType.FLOAT: return Float(token.value), 1 elif token.type_ in (TokenType.TRUE, TokenType.FALSE): return Bool(token.value), 1 else: return Literal(token.value), 1 def parseType(token, prev, tokens): return Type(token.text), 1 def parse(tokens): idx = 0 prev = None exprs = [] while tokens[idx].type_ != TokenType.EOF: token = tokens[idx] counter = 1 if token.type_ == TokenType.OPEN_PAREN: expr, counter = parseExpression(token, prev, tokens[idx+1:]) exprs.append(expr) elif token.type_ in (TokenType.FALSE, TokenType.TRUE, TokenType.STRING, TokenType.INT, TokenType.FLOAT): lit, counter = parseLiteral(token, prev, tokens[idx+1:]) exprs.append(lit) elif token.type_ in (TokenType.INT_TYPE, TokenType.FLOAT_TYPE, TokenType.STRING_TYPE, TokenType.ANY_TYPE): typ, counter = parseType(token, prev, tokens[idx+1:]) exprs.append(typ) else: sym, counter = parseSymbol(token, prev, tokens[idx+1:]) exprs.append(sym) idx += counter prev = token return exprs