From 511895d0f84c7d709dfb3f6aefb29a0d509b05b7 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 14 Apr 2026 02:23:37 +0200 Subject: [PATCH] Testing simple grammar --- .gitignore | 3 ++- src/main.rs | 27 +++++++++++++++++++++++++++ src/parser/ast.rs | 13 ++++++++++--- src/parser/grammar.pest | 11 +++-------- test/src/main.ms | 8 +------- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 7e6aa69..7811c03 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ target /target -/test/build \ No newline at end of file +/test/build +/test/output.json \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 56fd64a..d2d17ea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,13 @@ fn main() { } cmd_check(&args[2]); } + "parse" => { + if args.len() < 3 { + eprintln!("error: expected a file path\n usage: mist check "); + process::exit(1); + } + cmd_parse(&args[2]); + } "version" | "--version" | "-v" => { println!("mist {}", env!("CARGO_PKG_VERSION")); } @@ -61,6 +68,26 @@ fn cmd_check(path: &str) { } } +fn cmd_parse(path: &str) { + let source = read_ms_file(path); + match parser::parse(&source) { + Ok(output) => { + fs::write( + "output.json", + serde_json::to_string_pretty(&output).unwrap(), + ) + .unwrap_or_else(|e| { + eprintln!("error: could not write output.json: {}", e); + process::exit(1); + }); + } + Err(e) => { + eprintln!("parse error:\n{}", e); + process::exit(1); + } + } +} + fn read_ms_file(path: &str) -> String { let pb = PathBuf::from(path); diff --git a/src/parser/ast.rs b/src/parser/ast.rs index e0de358..80e3ad8 100644 --- a/src/parser/ast.rs +++ b/src/parser/ast.rs @@ -1,9 +1,11 @@ -#[derive(Debug, Clone)] +use serde::Serialize; + +#[derive(Debug, Clone, Serialize)] pub enum TypeExpr { Identifier(String), } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub enum TopLevel { Import(String), StructDecl { @@ -18,15 +20,20 @@ pub enum TopLevel { }, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub enum Statement { Expression(String), } +#[derive(Debug, Clone, Serialize)] pub enum Expression { Identifier(String), IntLiteral(i64), FloatLiteral(f64), BoolLiteral(bool), StringLiteral(String), + FunctionCall { + callee: Box, + args: Vec, + }, } diff --git a/src/parser/grammar.pest b/src/parser/grammar.pest index b8c4418..23f246c 100644 --- a/src/parser/grammar.pest +++ b/src/parser/grammar.pest @@ -2,7 +2,7 @@ WHITESPACE = _{ " " | "\t" | "\r" | "\n" } COMMENT = _{ "//" ~ (!"\n" ~ ANY)* } program = { SOI ~ item* ~ EOI } -item = _{ import_decl | function_decl | struct_decl } +item = _{ import_decl | function_decl } // primitives identifier = @{ (ASCII_ALPHA | "_") ~ (ASCII_ALPHANUMERIC | "_")* } @@ -16,20 +16,15 @@ inner_str = @{ (!"\"" ~ ANY)* } import_decl = { "import" ~ string_lit ~ ";" } -struct_field = { identifier ~ ":" ~ type_expr ~ ";" } -struct_decl = { - "struct" ~ identifier ~ "{" ~ struct_field* ~ "}" -} - param_list = { param ~ ("," ~ param)* ~ ","? } param = { identifier ~ ":" ~ type_expr } function_decl = { - "function" ~ identifier ~ "(" ~ param_list? ~ ")" ~ ("->" ~ type_expr)? ~ block + "function" ~ identifier ~ "(" ~ param_list? ~ ")" ~ (":" ~ type_expr)? ~ block } // ================= STATEMENTS ================= -block = { "{" ~ statement* ~ "}" } +block = { "{" ~ "}" } statement = _{ "idk" } diff --git a/test/src/main.ms b/test/src/main.ms index ce922de..9e8fa56 100644 --- a/test/src/main.ms +++ b/test/src/main.ms @@ -1,9 +1,3 @@ import "fmt"; -function add(a: int, b: int) -> int { - return a + b; -} - -function main() { - fmt.Println(add(10, 10) / 2); -} \ No newline at end of file +function add(a: int, b: int): int {}