aboutsummaryrefslogtreecommitdiff
path: root/neb/parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'neb/parser.py')
-rw-r--r--neb/parser.py67
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