diff options
| author | mryouse | 2022-06-18 02:45:04 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-18 02:45:04 +0000 |
| commit | d1a1c1592e610526c4a0432f93bd9ea6ae96d6e8 (patch) | |
| tree | df4c78f3ce5dfb1369d5fc6c155ca43e8bfc729f /neb/parser.py | |
| parent | 065d138ca3013a4d1ef1aa3d7c48982d8bee5de2 (diff) | |
refactor: make neb a module
Diffstat (limited to 'neb/parser.py')
| -rw-r--r-- | neb/parser.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/neb/parser.py b/neb/parser.py new file mode 100644 index 0000000..ea875fb --- /dev/null +++ b/neb/parser.py @@ -0,0 +1,67 @@ +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, TokenType.LIST_TYPE, TokenType.NUMBER_TYPE, TokenType.BOOL_TYPE, TokenType.LITERAL_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, TokenType.LIST_TYPE, TokenType.NUMBER_TYPE, TokenType.BOOL_TYPE, TokenType.LITERAL_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 |
