added normal assignment
This commit is contained in:
@@ -109,7 +109,14 @@ class LetStatement:
|
|||||||
expression: Expression
|
expression: Expression
|
||||||
|
|
||||||
|
|
||||||
Statement = Union[LetStatement, Expression]
|
@dataclass
|
||||||
|
class AssignmentStatement:
|
||||||
|
variable_name: str
|
||||||
|
type: TypeUsage
|
||||||
|
expression: Expression
|
||||||
|
|
||||||
|
|
||||||
|
Statement = Union[LetStatement, AssignmentStatement, Expression]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -177,7 +184,10 @@ boring_grammar = r"""
|
|||||||
let_statement : "let" identifier "=" expression ";"
|
let_statement : "let" identifier "=" expression ";"
|
||||||
| "let" identifier ":" type_usage "=" expression ";"
|
| "let" identifier ":" type_usage "=" expression ";"
|
||||||
|
|
||||||
|
assignment_statement : identifier "=" expression ";"
|
||||||
|
|
||||||
statement : let_statement
|
statement : let_statement
|
||||||
|
| assignment_statement
|
||||||
| return_statement
|
| return_statement
|
||||||
| expression
|
| expression
|
||||||
|
|
||||||
@@ -298,6 +308,14 @@ class TreeToBoring(Transformer):
|
|||||||
expression=expression,
|
expression=expression,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def assignment_statement(self, assignment_statement) -> AssignmentStatement:
|
||||||
|
(variable_name, expression) = assignment_statement
|
||||||
|
return AssignmentStatement(
|
||||||
|
variable_name=variable_name,
|
||||||
|
type=UnknownTypeUsage(),
|
||||||
|
expression=expression,
|
||||||
|
)
|
||||||
|
|
||||||
def statement(self, statement):
|
def statement(self, statement):
|
||||||
(statement,) = statement
|
(statement,) = statement
|
||||||
return statement
|
return statement
|
||||||
|
|||||||
@@ -130,8 +130,10 @@ class TypeChecker:
|
|||||||
def with_statement(self, ctx: Context, statement: parse.Statement) -> bool:
|
def with_statement(self, ctx: Context, statement: parse.Statement) -> bool:
|
||||||
if isinstance(statement, parse.ReturnStatement):
|
if isinstance(statement, parse.ReturnStatement):
|
||||||
return self.with_return_statement(ctx, statement)
|
return self.with_return_statement(ctx, statement)
|
||||||
if isinstance(statement, parse.LetStatement):
|
elif isinstance(statement, parse.LetStatement):
|
||||||
return self.with_let_statement(ctx, statement)
|
return self.with_let_statement(ctx, statement)
|
||||||
|
elif isinstance(statement, parse.AssignmentStatement):
|
||||||
|
return self.with_assignment_statement(ctx, statement)
|
||||||
elif isinstance(statement, parse.Expression): # expression
|
elif isinstance(statement, parse.Expression): # expression
|
||||||
return self.with_expression(ctx, statement)
|
return self.with_expression(ctx, statement)
|
||||||
else:
|
else:
|
||||||
@@ -144,7 +146,20 @@ class TypeChecker:
|
|||||||
ctx.environment[let_statement.variable_name] = let_statement
|
ctx.environment[let_statement.variable_name] = let_statement
|
||||||
if self.with_expression(ctx, let_statement.expression):
|
if self.with_expression(ctx, let_statement.expression):
|
||||||
changed = True
|
changed = True
|
||||||
changed = unify(ctx, let_statement, let_statement.expression)
|
if unify(ctx, let_statement, let_statement.expression):
|
||||||
|
changed = True
|
||||||
|
return changed
|
||||||
|
|
||||||
|
def with_assignment_statement(
|
||||||
|
self, ctx: Context, assignment_statement: parse.AssignmentStatement
|
||||||
|
) -> bool:
|
||||||
|
changed = False
|
||||||
|
if self.with_expression(ctx, assignment_statement.expression):
|
||||||
|
changed = True
|
||||||
|
if unify(ctx, assignment_statement, ctx.environment[assignment_statement.variable_name]):
|
||||||
|
changed = True
|
||||||
|
if unify(ctx, assignment_statement, assignment_statement.expression):
|
||||||
|
changed = True
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
def with_return_statement(
|
def with_return_statement(
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ fn add(a: I32, b: I32): I32 {
|
|||||||
let test_float: F32 = {
|
let test_float: F32 = {
|
||||||
10.2
|
10.2
|
||||||
};
|
};
|
||||||
|
test_float = 5.0;
|
||||||
a + b + foo
|
a + b + foo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,13 @@ blocks propagate never except at the function level;
|
|||||||
TODO:
|
TODO:
|
||||||
* ~Float Literals~
|
* ~Float Literals~
|
||||||
* ~Block expression~
|
* ~Block expression~
|
||||||
* ~Return keyword ~
|
* ~Return keyword~
|
||||||
|
* ~Normal assignment~
|
||||||
* Structs
|
* Structs
|
||||||
|
* Define
|
||||||
|
* Literal
|
||||||
|
* Getter
|
||||||
|
* Setter
|
||||||
* Generics
|
* Generics
|
||||||
* Enums
|
* Enums
|
||||||
* Methods
|
* Methods
|
||||||
|
|||||||
Reference in New Issue
Block a user