Skip to content

Commit fbe5981

Browse files
committed
[refactor] Split the type checker module into a checker for expressions and a checker for statements.
1 parent 4bc0f8c commit fbe5981

9 files changed

Lines changed: 1060 additions & 1089 deletions

File tree

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub mod environment;
1414
pub mod interpreter;
1515
pub mod ir;
1616
pub mod parser;
17-
pub mod tc;
17+
pub mod type_checker;
1818

1919
fn main() {
2020
println!("Hello, world!");

src/parser/parser_expr.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@ use std::str::FromStr;
1313

1414
use crate::ir::ast::Expression;
1515
use crate::parser::parser_common::{
16-
identifier, is_string_char, keyword,
17-
// Bracket and parentheses constants
18-
LEFT_BRACKET, RIGHT_BRACKET, LEFT_PAREN, RIGHT_PAREN,
16+
identifier,
17+
is_string_char,
18+
keyword,
1919
// Other character constants
2020
COMMA_CHAR,
21+
// Bracket and parentheses constants
22+
LEFT_BRACKET,
23+
LEFT_PAREN,
24+
RIGHT_BRACKET,
25+
RIGHT_PAREN,
2126
};
2227

2328
pub fn parse_expression(input: &str) -> IResult<&str, Expression> {
@@ -195,7 +200,11 @@ pub fn parse_actual_arguments(input: &str) -> IResult<&str, Vec<Expression>> {
195200
multispace0,
196201
char::<&str, Error<&str>>(LEFT_PAREN),
197202
separated_list0(
198-
tuple((multispace0, char::<&str, Error<&str>>(COMMA_CHAR), multispace0)),
203+
tuple((
204+
multispace0,
205+
char::<&str, Error<&str>>(COMMA_CHAR),
206+
multispace0,
207+
)),
199208
parse_expression,
200209
),
201210
multispace0,

src/parser/parser_stmt.rs

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,26 @@ use nom::{
1111

1212
use crate::ir::ast::{FormalArgument, Function, Statement};
1313
use crate::parser::parser_common::{
14-
identifier, keyword,
15-
// Statement keyword constants
16-
IF_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, FOR_KEYWORD, IN_KEYWORD,
17-
ASSERT_KEYWORD, DEF_KEYWORD, END_KEYWORD,
14+
identifier,
15+
keyword,
16+
ASSERT_KEYWORD,
17+
COLON_CHAR,
18+
COMMA_CHAR,
19+
DEF_KEYWORD,
20+
ELSE_KEYWORD,
21+
END_KEYWORD,
22+
EQUALS_CHAR,
23+
FOR_KEYWORD,
1824
// Operator and symbol constants
1925
FUNCTION_ARROW,
26+
// Statement keyword constants
27+
IF_KEYWORD,
28+
IN_KEYWORD,
2029
// Character constants
21-
LEFT_PAREN, RIGHT_PAREN, COLON_CHAR, SEMICOLON_CHAR, COMMA_CHAR, EQUALS_CHAR,
30+
LEFT_PAREN,
31+
RIGHT_PAREN,
32+
SEMICOLON_CHAR,
33+
WHILE_KEYWORD,
2234
};
2335
use crate::parser::parser_expr::parse_expression;
2436
use crate::parser::parser_type::parse_type;
@@ -51,7 +63,10 @@ fn parse_if_else_statement(input: &str) -> IResult<&str, Statement> {
5163
keyword(IF_KEYWORD),
5264
preceded(multispace1, parse_expression),
5365
parse_block,
54-
opt(preceded(tuple((multispace0, keyword(ELSE_KEYWORD))), parse_block)),
66+
opt(preceded(
67+
tuple((multispace0, keyword(ELSE_KEYWORD))),
68+
parse_block,
69+
)),
5570
)),
5671
|(_, cond, then_block, else_block)| {
5772
Statement::IfThenElse(
@@ -94,7 +109,11 @@ fn parse_assert_statement(input: &str) -> IResult<&str, Statement> {
94109
delimited(
95110
char::<&str, Error<&str>>(LEFT_PAREN),
96111
separated_list0(
97-
tuple((multispace0, char::<&str, Error<&str>>(COMMA_CHAR), multispace0)),
112+
tuple((
113+
multispace0,
114+
char::<&str, Error<&str>>(COMMA_CHAR),
115+
multispace0,
116+
)),
98117
parse_expression,
99118
),
100119
char::<&str, Error<&str>>(RIGHT_PAREN),
@@ -117,7 +136,11 @@ fn parse_function_definition_statement(input: &str) -> IResult<&str, Statement>
117136
delimited(
118137
char::<&str, Error<&str>>(LEFT_PAREN),
119138
separated_list0(
120-
tuple((multispace0, char::<&str, Error<&str>>(COMMA_CHAR), multispace0)),
139+
tuple((
140+
multispace0,
141+
char::<&str, Error<&str>>(COMMA_CHAR),
142+
multispace0,
143+
)),
121144
parse_formal_argument,
122145
),
123146
char::<&str, Error<&str>>(RIGHT_PAREN),
@@ -143,10 +166,17 @@ fn parse_block(input: &str) -> IResult<&str, Statement> {
143166
char::<&str, Error<&str>>(COLON_CHAR),
144167
multispace0,
145168
separated_list0(
146-
delimited(multispace0, char::<&str, Error<&str>>(SEMICOLON_CHAR), multispace0),
169+
delimited(
170+
multispace0,
171+
char::<&str, Error<&str>>(SEMICOLON_CHAR),
172+
multispace0,
173+
),
147174
parse_statement,
148175
),
149-
opt(preceded(multispace0, char::<&str, Error<&str>>(SEMICOLON_CHAR))),
176+
opt(preceded(
177+
multispace0,
178+
char::<&str, Error<&str>>(SEMICOLON_CHAR),
179+
)),
150180
delimited(multispace0, keyword(END_KEYWORD), multispace0),
151181
)),
152182
|(_, _, stmts, _, _)| Statement::Block(stmts),

src/parser/parser_type.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,34 @@ use nom::{
1111
use crate::ir::ast::{Type, ValueConstructor};
1212

1313
use crate::parser::parser_common::{
14-
identifier, keyword, separator,
15-
// Type name constants
16-
INT_TYPE, REAL_TYPE, BOOLEAN_TYPE, STRING_TYPE, UNIT_TYPE, ANY_TYPE,
17-
// Special type constructor constants
18-
MAYBE_TYPE, RESULT_TYPE,
14+
identifier,
15+
keyword,
16+
separator,
17+
ANY_TYPE,
18+
BOOLEAN_TYPE,
19+
COLON_CHAR,
20+
// Other character constants
21+
COMMA_CHAR,
22+
COMMA_SYMBOL,
1923
// Keyword constants
20-
DATA_KEYWORD, END_KEYWORD,
24+
DATA_KEYWORD,
25+
END_KEYWORD,
2126
// Operator and symbol constants
22-
FUNCTION_ARROW, COMMA_SYMBOL,
27+
FUNCTION_ARROW,
28+
// Type name constants
29+
INT_TYPE,
2330
// Bracket and parentheses constants
24-
LEFT_BRACKET, RIGHT_BRACKET, LEFT_PAREN, RIGHT_PAREN,
25-
// Other character constants
26-
COMMA_CHAR, COLON_CHAR, PIPE_CHAR,
31+
LEFT_BRACKET,
32+
LEFT_PAREN,
33+
// Special type constructor constants
34+
MAYBE_TYPE,
35+
PIPE_CHAR,
36+
REAL_TYPE,
37+
RESULT_TYPE,
38+
RIGHT_BRACKET,
39+
RIGHT_PAREN,
40+
STRING_TYPE,
41+
UNIT_TYPE,
2742
};
2843

2944
pub fn parse_type(input: &str) -> IResult<&str, Type> {

src/tc.rs

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)