Skip to content

Commit 80515b8

Browse files
committed
feat: 타입 검사기(TypeChecker) 신규 구현
- Analyzer에서 분리해 TypeChecker 모듈로 타입 검사 로직 이관 - check_program, check_block, check_stmt, check_expr로 AST 재귀 순회 구조화 - 산술·비트·논리·비교 연산자 및 단항 연산자, 대입문, 함수 호출, 배열 인덱싱, 초기화 리스트 검사 구현 - char→int 암시 승격(promotion) 및 int→char 암시 축소 허용 - 고정 크기 배열 선언을 Pointer(T)로 등록해 arr[i] 인덱싱 검사 통과 - Analyzer::analyze()에서 name_resolution 후 type_check 호출로 책임 분리
1 parent a0caaa0 commit 80515b8

File tree

24 files changed

+738
-245
lines changed

24 files changed

+738
-245
lines changed

src/lexer/lexer.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::token::{LexError, SpannedToken, Token, lookup_ident};
22

33
/// 렉서 구조
4+
#[allow(dead_code)]
45
pub struct Lexer {
56
input: Vec<char>, // full codes
67
pos: usize, // current position
@@ -10,6 +11,7 @@ pub struct Lexer {
1011
column: usize, // current column
1112
}
1213

14+
#[allow(dead_code)]
1315
impl Lexer {
1416
pub fn new(input: &str) -> Self {
1517
let mut l = Lexer {

src/lexer/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
pub mod lexer;
1+
mod lexer;
22
pub mod token;
3-
43
pub use lexer::Lexer;
54
pub use token::LexError;
5+
pub use token::SpannedToken;
66
pub use token::Token;

src/lexer/token.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub struct SpannedToken {
1515
}
1616

1717
/// Token types
18+
#[allow(dead_code)]
1819
#[derive(Debug, PartialEq, Clone)]
1920
pub enum Token {
2021
// Special
@@ -88,6 +89,7 @@ pub enum Token {
8889
}
8990

9091
/// Lookup identifier keyword
92+
#[allow(dead_code)]
9193
pub fn lookup_ident(ident: &str) -> Token {
9294
match ident {
9395
"int" => Token::Int,

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@ pub mod ast;
22
pub mod lexer;
33
pub mod parser;
44
pub mod semantic;
5+
6+
pub use lexer::Lexer;
7+
pub use parser::Parser;
8+
pub use semantic::Analyzer as SemanticAnalyzer;

src/main.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
use rustc_tape4::lexer::Lexer;
2-
use rustc_tape4::parser::Parser;
3-
use rustc_tape4::semantic;
4-
use semantic::analyzer::analyzer::Analyzer;
5-
6-
mod lexer;
1+
use rustc_tape4::{Lexer, Parser, SemanticAnalyzer};
72

83
fn main() {
94
let source = std::fs::read_to_string("tests/fixtures/sample.c").expect("could not read file");
@@ -15,9 +10,7 @@ fn main() {
1510
let mut parser = Parser::new(tokens);
1611
let program = parser.parse_program().expect("Parsing Failed");
1712

18-
// println!("{:#?}", program);
1913
// semantic analysis
20-
let mut analyzer = Analyzer::new(&program);
21-
let result = analyzer.analyze().expect("Analyzing Failed");
22-
// println!("Hello, world!");
14+
let mut analyzer = SemanticAnalyzer::new(&program);
15+
let _result = analyzer.analyze().expect("Analyzing Failed");
2316
}

src/parser/error_helpers.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use crate::lexer::Token;
22
use crate::parser::Parser;
33
use crate::parser::error::ParserError;
44
use crate::parser::parser::ParseResult;
5-
65
// #[macro_export]
76
// macro_rules! expect {
87
// ($p:expr, $pat:pat_param) => {{

src/parser/mod.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
#[macro_use]
1+
mod error;
22
mod error_helpers;
3-
pub mod error;
4-
pub mod utils;
5-
6-
pub mod expression;
7-
pub mod function;
8-
pub mod parser;
9-
pub mod statements;
10-
3+
mod expression;
4+
mod function;
5+
mod parser;
6+
mod statements;
7+
mod utils;
8+
pub use parser::ParseResult;
119
pub use parser::Parser;

src/parser/parser.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::ast::Program;
2-
use crate::lexer::Token;
3-
use crate::lexer::token::SpannedToken;
2+
use crate::lexer::{SpannedToken, Token};
43
use crate::parser::error::ParserError;
54

65
pub type ParseResult<T> = Result<T, ParserError>;

src/parser/statements.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::ast::Stmt;
22
use crate::ast::Stmt::{Break, For, Return, While};
33
use crate::ast::stmt::{Block, Declarator};
4-
use crate::lexer::Token;
4+
use crate::lexer::token::Token;
55
use crate::parser::Parser;
66
use crate::parser::parser::ParseResult;
77

src/parser/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::ast::program::Pos;
2-
use crate::lexer::Token;
2+
use crate::lexer::token::Token;
33
use crate::parser::Parser;
44
use crate::parser::parser::ParseResult;
55

0 commit comments

Comments
 (0)