Skip to content

Commit b592f19

Browse files
authored
Merge pull request #70 from LunaStev/develop
Revert and Refactor: Restore Functionality and Add Tests
2 parents 734c276 + 6992ac5 commit b592f19

File tree

3 files changed

+33
-68
lines changed

3 files changed

+33
-68
lines changed

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ fn run_wave_file(file_path: &str) {
9292
.map(|token| token.lexeme.clone())
9393
.unwrap_or_default();
9494

95-
let mut peekable_tokens = tokens.iter().peekable();
95+
let params = extract_parameters(&tokens);
9696

97-
let params = extract_parameters(&mut peekable_tokens);
97+
let mut peekable_tokens = tokens.iter().peekable();
9898

9999
let body = extract_body(&mut peekable_tokens);
100100

src/parser/parser.rs

Lines changed: 27 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -19,46 +19,38 @@ pub fn param(parameter: String, param_type: String, initial_value: Option<String
1919
}
2020
}
2121

22-
pub fn extract_parameters(tokens: &mut Peekable<Iter<Token>>) -> Vec<ParameterNode> {
22+
pub fn extract_parameters(tokens: &Vec<Token>) -> Vec<ParameterNode> {
2323
let mut params = vec![];
24+
let mut i = 0;
2425

25-
while let Some(token) = tokens.next() {
26-
match &token.token_type {
27-
TokenType::RPAREN => break,
28-
TokenType::VAR => {
29-
let name = if let Some(Token { token_type: TokenType::IDENTIFIER(name), .. }) = tokens.next() {
30-
name.clone()
31-
} else {
32-
continue;
33-
};
26+
while i < tokens.len() {
27+
if matches!(tokens[i].token_type, TokenType::VAR) {
28+
// parameter name
29+
let name = if let Some(TokenType::IDENTIFIER(name)) = tokens.get(i + 1).map(|t| &t.token_type) {
30+
name.clone()
31+
} else {
32+
continue; // Skip if no name exists
33+
};
3434

35-
// 타입 추출
36-
let param_type = match tokens.next() {
37-
Some(Token { token_type: TokenType::TypeInt(_), lexeme, .. }) => lexeme.clone(),
38-
Some(Token { token_type: TokenType::TypeFloat(_), lexeme, .. }) => lexeme.clone(),
39-
Some(Token { token_type: TokenType::STRING(_), lexeme, .. }) => lexeme.clone(),
40-
_ => "unknown".to_string(),
41-
};
35+
// parameter type
36+
let param_type = if let Some(TokenType::TypeInt(_)) = tokens.get(i + 3)
37+
.map(|t| &t.token_type) {
38+
tokens[i + 3].lexeme.clone()
39+
} else {
40+
"unknown".to_string() // If you don't have type information, you don't know
41+
};
4242

43-
let initial_value = if let Some(Token { token_type: TokenType::EQUAL, .. }) = tokens.peek() {
44-
tokens.next();
45-
if let Some(Token { lexeme, .. }) = tokens.next() {
46-
Some(lexeme.clone())
47-
} else {
48-
None
49-
}
50-
} else {
51-
None
52-
};
43+
let initial_value = if let Some(TokenType::EQUAL) = tokens.get(i + 4)
44+
.map(|t| &t.token_type) {
45+
Some(tokens[i + 5].lexeme.clone())
46+
} else {
47+
None
48+
};
5349

54-
params.push(ParameterNode {
55-
name,
56-
param_type,
57-
initial_value,
58-
});
59-
}
60-
_ => continue,
50+
params.push(ParameterNode { name, param_type, initial_value });
51+
i += 6; // Move to the next token
6152
}
53+
i += 1;
6254
}
6355

6456
params
@@ -69,13 +61,12 @@ pub fn extract_body<'a>(tokens: &mut Peekable<Iter<'a, Token>>) -> Vec<ASTNode>
6961

7062
while let Some(token) = tokens.next() {
7163
match &token.token_type {
72-
/*
64+
TokenType::EOF => break,
7365
TokenType::VAR => {
7466
if let Some(ast_node) = parse_var(tokens) {
7567
body.push(ast_node);
7668
}
7769
}
78-
*/
7970
TokenType::PRINTLN => {
8071
if let Some(ast_node) = parse_println(tokens) {
8172
body.push(ast_node);
@@ -110,33 +101,6 @@ pub fn extract_body<'a>(tokens: &mut Peekable<Iter<'a, Token>>) -> Vec<ASTNode>
110101
body
111102
}
112103

113-
pub fn parse_function(tokens: &mut Peekable<Iter<Token>>) -> Option<ASTNode> {
114-
let function_name = if let Some(Token { token_type: TokenType::IDENTIFIER(name), .. }) = tokens.next() {
115-
name.clone()
116-
} else {
117-
return None;
118-
};
119-
120-
let parameters = if let Some(Token { token_type: TokenType::LPAREN, .. }) = tokens.next() {
121-
extract_parameters(tokens)
122-
} else {
123-
vec![]
124-
};
125-
126-
let body = if let Some(Token { token_type: TokenType::LBRACE, .. }) = tokens.next() {
127-
extract_body(tokens)
128-
} else {
129-
vec![]
130-
};
131-
132-
Some(ASTNode::Function(FunctionNode {
133-
name: function_name,
134-
parameters,
135-
body,
136-
}))
137-
}
138-
139-
/*
140104
// VAR parsing
141105
fn parse_var(tokens: &mut Peekable<Iter<'_, Token>>) -> Option<ASTNode> {
142106
if let Some(Token { token_type: TokenType::IDENTIFIER(name), .. }) = tokens.next() {
@@ -229,8 +193,6 @@ fn parse_var(tokens: &mut Peekable<Iter<'_, Token>>) -> Option<ASTNode> {
229193
None
230194
}
231195

232-
*/
233-
234196
// PRINTLN parsing
235197
fn parse_println(tokens: &mut Peekable<Iter<Token>>) -> Option<ASTNode> {
236198
if let Some(Token { token_type: TokenType::LPAREN, .. }) = tokens.next() {

test/test4.wave

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
fun main(var i :i32768 = 0; var j :i4 = 2; var e :i32 = 10;) { }
1+
fun main(var i :i32768 = 0; var j :i4 = 2; var e :i32 = 10;) {
2+
var b :i32 = 5;
3+
println("Hello World");
4+
}

0 commit comments

Comments
 (0)