Compare commits
No commits in common. "a7034db0eb54fa449b918a2a49c299f9920cb0c2" and "92a365d908520e4373a2f509ea4e9499a2db0bb5" have entirely different histories.
a7034db0eb
...
92a365d908
4 changed files with 18 additions and 79 deletions
|
@ -5,7 +5,6 @@ import io
|
||||||
|
|
||||||
// main can return int or void, void mains are handled by jortsc
|
// main can return int or void, void mains are handled by jortsc
|
||||||
fn main () -> int {
|
fn main () -> int {
|
||||||
// todo: put it back to io.puts
|
io.puts("pants")
|
||||||
ioputs("pants")
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,19 +27,3 @@ class Identifier:
|
||||||
@dataclass
|
@dataclass
|
||||||
class Import:
|
class Import:
|
||||||
module: str
|
module: str
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class String:
|
|
||||||
value: str
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Number:
|
|
||||||
value: str
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class FunctionCall:
|
|
||||||
function: str
|
|
||||||
args: list
|
|
||||||
|
|
|
@ -13,7 +13,6 @@ class TokenType(Enum):
|
||||||
comment_end = auto()
|
comment_end = auto()
|
||||||
whitespace = auto()
|
whitespace = auto()
|
||||||
number = auto()
|
number = auto()
|
||||||
string = auto()
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -51,7 +50,7 @@ TOKENS = [
|
||||||
(r'\-\>', TokenType.reserved),
|
(r'\-\>', TokenType.reserved),
|
||||||
(r'\.', TokenType.reserved),
|
(r'\.', TokenType.reserved),
|
||||||
|
|
||||||
(r'\"[^\n]*\"', TokenType.string),
|
(r'\"[^\n]*\"', TokenType.reserved),
|
||||||
|
|
||||||
# basic math ops
|
# basic math ops
|
||||||
(r'[\+\-\/\*]', TokenType.reserved),
|
(r'[\+\-\/\*]', TokenType.reserved),
|
||||||
|
|
|
@ -2,8 +2,7 @@ from typing import Optional, Any, List
|
||||||
|
|
||||||
from jortsc.parser.lexer import Token, TokenType
|
from jortsc.parser.lexer import Token, TokenType
|
||||||
from jortsc.parser.ast_nodes import (
|
from jortsc.parser.ast_nodes import (
|
||||||
Function, TypedVar, Identifier, Import, ReturnType, String, Number,
|
Function, TypedVar, Identifier, Import, ReturnType
|
||||||
FunctionCall
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,8 +18,7 @@ class Reader:
|
||||||
self.cur = 0
|
self.cur = 0
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return (f'<Reader cur={self.cur} tot={len(self.tokens)} '
|
return f'<Reader cur={self.cur} cur_tok={self.peek()}>'
|
||||||
f'cur_tok={self.peek()}>')
|
|
||||||
|
|
||||||
def peek(self) -> Optional[Token]:
|
def peek(self) -> Optional[Token]:
|
||||||
"""Peek at the current token."""
|
"""Peek at the current token."""
|
||||||
|
@ -170,34 +168,6 @@ def read_reserved(token: Token, reader: Reader):
|
||||||
return handler(reader)
|
return handler(reader)
|
||||||
|
|
||||||
|
|
||||||
def read_value(token: Token, _reader: Reader):
|
|
||||||
"""Read a given value"""
|
|
||||||
if token.type_ == TokenType.string:
|
|
||||||
return String(token.value)
|
|
||||||
elif token.type_ == TokenType.number:
|
|
||||||
return Number(token.value)
|
|
||||||
|
|
||||||
|
|
||||||
def read_statement(token: Token, reader: Reader):
|
|
||||||
"""Read a statement"""
|
|
||||||
# token is an identifier, so first check for a function call
|
|
||||||
|
|
||||||
# TODO: handle more things than a function call
|
|
||||||
call_fn_name = token.value
|
|
||||||
token = reader.expect_val('(')
|
|
||||||
res = []
|
|
||||||
|
|
||||||
while True:
|
|
||||||
token = reader.next_safe()
|
|
||||||
|
|
||||||
if token.value == ')':
|
|
||||||
break
|
|
||||||
|
|
||||||
res.append(read_value(token, reader))
|
|
||||||
|
|
||||||
return FunctionCall(call_fn_name, res)
|
|
||||||
|
|
||||||
|
|
||||||
def read_start(reader: Reader):
|
def read_start(reader: Reader):
|
||||||
"""Read the start of a program."""
|
"""Read the start of a program."""
|
||||||
print('reader', reader)
|
print('reader', reader)
|
||||||
|
@ -205,33 +175,22 @@ def read_start(reader: Reader):
|
||||||
token = reader.next()
|
token = reader.next()
|
||||||
|
|
||||||
if token is None:
|
if token is None:
|
||||||
print('eof!')
|
return []
|
||||||
return None
|
|
||||||
|
|
||||||
ast = []
|
ast = []
|
||||||
res = []
|
res = []
|
||||||
|
|
||||||
|
print('cur', token)
|
||||||
|
|
||||||
# handle blocks
|
# handle blocks
|
||||||
if token.value == '{':
|
if token.value == '{':
|
||||||
# next can be a whitespace, or a }
|
while True:
|
||||||
token = reader.next()
|
token = reader.next()
|
||||||
|
|
||||||
print('block start!, next:', token)
|
if token.value == '}':
|
||||||
|
break
|
||||||
|
|
||||||
if token.type_ == TokenType.whitespace:
|
res.extend(read_start(reader))
|
||||||
# keep going on reading
|
|
||||||
while True:
|
|
||||||
token = reader.peek()
|
|
||||||
print('block append', token)
|
|
||||||
|
|
||||||
if token.value == '}':
|
|
||||||
print('block end')
|
|
||||||
reader.next()
|
|
||||||
break
|
|
||||||
|
|
||||||
res.extend(read_start(reader))
|
|
||||||
elif token.value == '}':
|
|
||||||
res = []
|
|
||||||
|
|
||||||
# import, fn, etc
|
# import, fn, etc
|
||||||
elif token.type_ == TokenType.reserved:
|
elif token.type_ == TokenType.reserved:
|
||||||
|
@ -241,26 +200,24 @@ def read_start(reader: Reader):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
elif token.type_ == TokenType.identifier:
|
elif token.type_ == TokenType.identifier:
|
||||||
res = read_statement(token, reader)
|
res = [Identifier(token.value)]
|
||||||
else:
|
|
||||||
res = read_value(token, reader)
|
|
||||||
|
|
||||||
ast.append(res)
|
ast.append(res)
|
||||||
return ast
|
return ast
|
||||||
|
|
||||||
|
|
||||||
def read_loop(reader: Reader):
|
def read_loop(reader: Reader):
|
||||||
"""Read the AST."""
|
|
||||||
final_ast = []
|
final_ast = []
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
ast = read_start(reader)
|
ast = read_start(reader)
|
||||||
|
|
||||||
# break when eof
|
if not ast:
|
||||||
if ast is None:
|
|
||||||
break
|
break
|
||||||
|
|
||||||
# TODO: better ast cleanup
|
inner = ast[0]
|
||||||
|
|
||||||
|
if not inner:
|
||||||
|
break
|
||||||
|
|
||||||
final_ast.append(ast)
|
final_ast.append(ast)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue