Compare commits

...

2 Commits

Author SHA1 Message Date
e2efbf693e fix(checker) minor tweaks 2026-06-19 21:54:13 +02:00
68f83ab6cf feat(parser): parse strings in Midas files 2026-06-19 21:53:35 +02:00
6 changed files with 25 additions and 7 deletions

View File

@@ -15,6 +15,7 @@ if TYPE_CHECKING:
BUILTIN_SUBTYPES: dict[str, set[str]] = { BUILTIN_SUBTYPES: dict[str, set[str]] = {
"object": {"float", "list", "dict"},
"float": {"int"}, "float": {"int"},
"int": {"bool"}, "int": {"bool"},
} }

View File

@@ -224,9 +224,9 @@ class MidasTyper(m.Stmt.Visitor[None], m.Expr.Visitor[Type], m.Type.Visitor[Type
def visit_binary_expr(self, expr: m.BinaryExpr) -> Type: def visit_binary_expr(self, expr: m.BinaryExpr) -> Type:
method: Optional[str] = MIDAS_BINARY_METHODS.get(expr.operator.type) method: Optional[str] = MIDAS_BINARY_METHODS.get(expr.operator.type)
if method is None: if method is None:
self.logger.warning(f"Unsupported operator {expr.operator}") self.logger.warning(f"Unsupported operator {expr.operator.lexeme}")
self.reporter.warning( self.reporter.warning(
expr.location, f"Unsupported operator {expr.operator}" expr.location, f"Unsupported operator {expr.operator.lexeme}"
) )
return UnknownType() return UnknownType()
@@ -257,9 +257,9 @@ class MidasTyper(m.Stmt.Visitor[None], m.Expr.Visitor[Type], m.Type.Visitor[Type
def visit_unary_expr(self, expr: m.UnaryExpr) -> Type: def visit_unary_expr(self, expr: m.UnaryExpr) -> Type:
method: Optional[str] = MIDAS_UNARY_METHODS.get(expr.operator.type) method: Optional[str] = MIDAS_UNARY_METHODS.get(expr.operator.type)
if method is None: if method is None:
self.logger.warning(f"Unsupported operator {expr.operator}") self.logger.warning(f"Unsupported operator {expr.operator.lexeme}")
self.reporter.warning( self.reporter.warning(
expr.location, f"Unsupported operator {expr.operator}" expr.location, f"Unsupported operator {expr.operator.lexeme}"
) )
return UnknownType() return UnknownType()
@@ -303,7 +303,7 @@ class MidasTyper(m.Stmt.Visitor[None], m.Expr.Visitor[Type], m.Type.Visitor[Type
member: Optional[Type] = self.types.lookup_member(object, expr.name.lexeme) member: Optional[Type] = self.types.lookup_member(object, expr.name.lexeme)
if member is None: if member is None:
self.reporter.error( self.reporter.error(
expr.location, f"Unknown member '{expr.name}' of {object}" expr.location, f"Unknown member '{expr.name.lexeme}' of {object}"
) )
return UnknownType() return UnknownType()
return member return member

View File

@@ -21,7 +21,7 @@ PY_OPERATOR_METHODS: dict[Type[ast.operator], str] = {
PY_COMPARATOR_METHODS: dict[Type[ast.cmpop], str] = { PY_COMPARATOR_METHODS: dict[Type[ast.cmpop], str] = {
ast.Eq: "__eq__", ast.Eq: "__eq__",
# ast.NotEq: "__noteq__", ast.NotEq: "__eq__",
ast.Lt: "__lt__", ast.Lt: "__lt__",
ast.LtE: "__le__", ast.LtE: "__le__",
ast.Gt: "__gt__", ast.Gt: "__gt__",
@@ -52,7 +52,7 @@ MIDAS_BINARY_METHODS: dict[TokenType, str] = {
# ast.BitAnd: "__and__", # ast.BitAnd: "__and__",
# ast.FloorDiv: "__floordiv__", # ast.FloorDiv: "__floordiv__",
TokenType.EQUAL_EQUAL: "__eq__", TokenType.EQUAL_EQUAL: "__eq__",
# ast.NotEq: "__noteq__", TokenType.BANG_EQUAL: "__eq__",
TokenType.LESS: "__lt__", TokenType.LESS: "__lt__",
TokenType.LESS_EQUAL: "__le__", TokenType.LESS_EQUAL: "__le__",
TokenType.GREATER: "__gt__", TokenType.GREATER: "__gt__",

View File

@@ -69,6 +69,8 @@ class MidasLexer(Lexer):
): ):
self.advance() self.advance()
self.add_token(TokenType.WHITESPACE) self.add_token(TokenType.WHITESPACE)
case '"' | "'":
self.scan_string(char)
case _: case _:
if char.isdigit(): if char.isdigit():
self.scan_number() self.scan_number()
@@ -78,6 +80,17 @@ class MidasLexer(Lexer):
self.error("Unexpected character") self.error("Unexpected character")
return None return None
def scan_string(self, opening: str):
while self.peek() != opening and not self.is_at_end():
self.advance()
if self.is_at_end():
self.error("Unterminated string")
self.advance()
value: str = self.source[self.start + 1 : self.idx - 1]
self.add_token(TokenType.STRING, value)
def scan_number(self): def scan_number(self):
"""Scan the rest of number and add it as a token """Scan the rest of number and add it as a token

View File

@@ -43,6 +43,7 @@ class TokenType(Enum):
TRUE = auto() TRUE = auto()
FALSE = auto() FALSE = auto()
NONE = auto() NONE = auto()
STRING = auto()
# Keywords # Keywords
TYPE = auto() TYPE = auto()

View File

@@ -418,6 +418,9 @@ class MidasParser(Parser):
if self.match(TokenType.NUMBER): if self.match(TokenType.NUMBER):
return LiteralExpr(location=token.get_location(), value=token.value) return LiteralExpr(location=token.get_location(), value=token.value)
if self.match(TokenType.STRING):
return LiteralExpr(location=token.get_location(), value=token.value)
if self.match_identifier(): if self.match_identifier():
return VariableExpr(location=token.get_location(), name=token) return VariableExpr(location=token.get_location(), name=token)