diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index 4b01aef..42c462e 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -142,7 +142,12 @@ impl GoCodegen { self.indent -= 1; self.add_indentedln("}\n"); } - Statement::VarDecl { kind, name, init } => { + Statement::VarDecl { + kind, + name, + init, + type_, + } => { let go_kind = match kind { VarKind::Let | VarKind::Const => "var", VarKind::Var => "var", @@ -151,7 +156,14 @@ impl GoCodegen { .as_ref() .map(|e| format!(" = {}", self.generate_expression(e))) .unwrap_or_else(|| "".to_string()); - self.add_indentedln(&format!("{} {}{};\n", go_kind, name, init_expr)); + let type_expr = type_ + .clone() + .map(|t| self.translate_type(&t)) + .unwrap_or_default(); + self.add_indentedln(&format!( + "{} {} {}{};\n", + go_kind, name, type_expr, init_expr + )); } Statement::VarAssign { target, value } => { self.add_indentedln(&format!( diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 0313478..3c0f3d1 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -67,6 +67,7 @@ pub enum Statement { kind: VarKind, name: String, init: Option, + type_: Option, }, VarAssign { diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 40d5351..058b782 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -63,10 +63,10 @@ continue_stmt = { "continue" ~ ";" } // --- variable declarations --- -var_decl_kind = { "let" | "const" | "var" } +// var_decl_kind = { "let" | "const" | "var" } var_decl = { - var_decl_kind ~ identifier ~ ("=" ~ expr)? ~ ";" + type_expr ~ identifier ~ ("=" ~ expr)? ~ ";" } var_assign = { diff --git a/parser/src/lib.rs b/parser/src/lib.rs index fb8e1ea..bd9c374 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -43,7 +43,7 @@ impl TryFrom> for TypeExpr { TypeExpr::try_from(inner)? } Rule::identifier => TypeExpr::Identifier(pair.as_str().to_string()), - _ => unimplemented!("TypeExpr parsing not implemented yet"), + _ => unimplemented!("{pair:#?}"), }) } } @@ -188,22 +188,15 @@ impl From> for Statement { Rule::var_decl => { let mut inner = pair.into_inner(); - let kind_pair = inner.next().unwrap(); // let/const/var - let name_pair = inner.next().unwrap(); // identifier - + let type_ = inner.next().map(TypeExpr::try_from).unwrap().ok(); + let name = inner.next().unwrap().as_str().to_string(); let init = inner.next().map(Expression::from); - let kind = match kind_pair.as_str() { - "let" => VarKind::Let, - "const" => VarKind::Const, - "var" => VarKind::Var, - _ => unreachable!(), - }; - Statement::VarDecl { - kind, - name: name_pair.as_str().to_string(), + kind: VarKind::Var, + name: name.as_str().to_string(), init, + type_, } } diff --git a/parser/src/script_parser.rs b/parser/src/script_parser.rs index b9becff..cff3b6f 100644 --- a/parser/src/script_parser.rs +++ b/parser/src/script_parser.rs @@ -193,6 +193,7 @@ impl From> for Statement { kind, name: name_pair.as_str().to_string(), init, + type_: None, } } diff --git a/test/src/main.mist b/test/src/main.mist index 31511e8..9a686bb 100644 --- a/test/src/main.mist +++ b/test/src/main.mist @@ -3,5 +3,6 @@ package main; import "fmt"; void main() { - + string test = "Hello, World"; + fmt.println(test); }