Compare commits
3 Commits
c690b01396
...
4c82f5bfdd
Author | SHA1 | Date | |
---|---|---|---|
4c82f5bfdd | |||
8cf022e6e0 | |||
761244df74 |
10
src/Ast.hs
10
src/Ast.hs
@ -24,7 +24,10 @@ data StatementExpression
|
||||
| ConstructorCall DataType [Expression]
|
||||
| MethodCall Expression Identifier [Expression]
|
||||
| TypedStatementExpression DataType StatementExpression
|
||||
| UnaryOperation UnaryOperator Expression
|
||||
| PostIncrement Expression
|
||||
| PostDecrement Expression
|
||||
| PreIncrement Expression
|
||||
| PreDecrement Expression
|
||||
deriving (Show, Eq)
|
||||
|
||||
data BinaryOperator
|
||||
@ -50,10 +53,6 @@ data BinaryOperator
|
||||
data UnaryOperator
|
||||
= Not
|
||||
| Minus
|
||||
| PostIncrement
|
||||
| PostDecrement
|
||||
| PreIncrement
|
||||
| PreDecrement
|
||||
deriving (Show, Eq)
|
||||
|
||||
data Expression
|
||||
@ -65,6 +64,7 @@ data Expression
|
||||
| LocalVariable Identifier
|
||||
| FieldVariable Identifier
|
||||
| BinaryOperation BinaryOperator Expression Expression
|
||||
| UnaryOperation UnaryOperator Expression
|
||||
| StatementExpressionExpression StatementExpression
|
||||
| TypedExpression DataType Expression
|
||||
deriving (Show, Eq)
|
||||
|
102
src/Typecheck.hs
102
src/Typecheck.hs
@ -78,6 +78,22 @@ typeCheckExpression (BinaryOperation op expr1 expr2) symtab classes =
|
||||
Or -> checkLogicalOperation op expr1' expr2' type1 type2
|
||||
NameResolution -> resolveNameResolution expr1' expr2 symtab classes
|
||||
|
||||
typeCheckExpression (UnaryOperation op expr) symtab classes =
|
||||
let expr' = typeCheckExpression expr symtab classes
|
||||
type' = getTypeFromExpr expr'
|
||||
in case op of
|
||||
Not ->
|
||||
if type' == "boolean"
|
||||
then
|
||||
TypedExpression "boolean" (UnaryOperation op expr')
|
||||
else
|
||||
error "Logical NOT operation requires an operand of type boolean"
|
||||
Minus ->
|
||||
if type' == "int" || type' == "char"
|
||||
then
|
||||
TypedExpression type' (UnaryOperation op expr')
|
||||
else
|
||||
error "Unary minus operation requires an operand of type int or char"
|
||||
|
||||
typeCheckExpression (StatementExpressionExpression stmtExpr) symtab classes =
|
||||
let stmtExpr' = typeCheckStatementExpression stmtExpr symtab classes
|
||||
@ -147,61 +163,41 @@ typeCheckStatementExpression (MethodCall expr methodName args) symtab classes =
|
||||
Nothing -> error $ "Class for object type '" ++ objType ++ "' not found."
|
||||
_ -> error "Invalid object type for method call. Object must have a class type."
|
||||
|
||||
typeCheckStatementExpression (UnaryOperation op expr) symtab classes =
|
||||
typeCheckStatementExpression (PostIncrement expr) symtab classes =
|
||||
let expr' = typeCheckExpression expr symtab classes
|
||||
type' = getTypeFromExpr expr'
|
||||
in case op of
|
||||
Not ->
|
||||
if type' == "boolean"
|
||||
then
|
||||
TypedStatementExpression "boolean" (UnaryOperation op expr')
|
||||
else
|
||||
error "Logical NOT operation requires an operand of type boolean"
|
||||
Minus ->
|
||||
if type' == "int"
|
||||
then
|
||||
TypedStatementExpression "int" (UnaryOperation op expr')
|
||||
else if type' == "char"
|
||||
then
|
||||
TypedStatementExpression "char" (UnaryOperation op expr')
|
||||
else
|
||||
error "Unary minus operation requires an operand of type int or char"
|
||||
PostIncrement ->
|
||||
if type' == "int"
|
||||
then
|
||||
TypedStatementExpression "int" (UnaryOperation op expr')
|
||||
else if type' == "char"
|
||||
then
|
||||
TypedStatementExpression "char" (UnaryOperation op expr')
|
||||
else
|
||||
error "Post-increment operation requires an operand of type int or char"
|
||||
PostDecrement ->
|
||||
if type' == "int"
|
||||
then
|
||||
TypedStatementExpression "int" (UnaryOperation op expr')
|
||||
else if type' == "char"
|
||||
then
|
||||
TypedStatementExpression "char" (UnaryOperation op expr')
|
||||
else
|
||||
error "Post-decrement operation requires an operand of type int or char"
|
||||
PreIncrement ->
|
||||
if type' == "int"
|
||||
then
|
||||
TypedStatementExpression "int" (UnaryOperation op expr')
|
||||
else if type' == "char"
|
||||
then
|
||||
TypedStatementExpression "char" (UnaryOperation op expr')
|
||||
else
|
||||
error "Pre-increment operation requires an operand of type int or char"
|
||||
PreDecrement ->
|
||||
if type' == "int"
|
||||
then
|
||||
TypedStatementExpression "int" (UnaryOperation op expr')
|
||||
else if type' == "char"
|
||||
then
|
||||
TypedStatementExpression "char" (UnaryOperation op expr')
|
||||
else
|
||||
error "Pre-decrement operation requires an operand of type int or char"
|
||||
in if type' == "int" || type' == "char"
|
||||
then
|
||||
TypedStatementExpression type' (PostIncrement expr')
|
||||
else
|
||||
error "Post-increment operation requires an operand of type int or char"
|
||||
|
||||
typeCheckStatementExpression (PostDecrement expr) symtab classes =
|
||||
let expr' = typeCheckExpression expr symtab classes
|
||||
type' = getTypeFromExpr expr'
|
||||
in if type' == "int" || type' == "char"
|
||||
then
|
||||
TypedStatementExpression type' (PostDecrement expr')
|
||||
else
|
||||
error "Post-decrement operation requires an operand of type int or char"
|
||||
|
||||
typeCheckStatementExpression (PreIncrement expr) symtab classes =
|
||||
let expr' = typeCheckExpression expr symtab classes
|
||||
type' = getTypeFromExpr expr'
|
||||
in if type' == "int" || type' == "char"
|
||||
then
|
||||
TypedStatementExpression type' (PreIncrement expr')
|
||||
else
|
||||
error "Pre-increment operation requires an operand of type int or char"
|
||||
|
||||
typeCheckStatementExpression (PreDecrement expr) symtab classes =
|
||||
let expr' = typeCheckExpression expr symtab classes
|
||||
type' = getTypeFromExpr expr'
|
||||
in if type' == "int" || type' == "char"
|
||||
then
|
||||
TypedStatementExpression type' (PreDecrement expr')
|
||||
else
|
||||
error "Pre-decrement operation requires an operand of type int or char"
|
||||
|
||||
-- ********************************** Type Checking: Statements **********************************
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user