diff --git a/moon.mod.json b/moon.mod.json index ca0a064..daf9820 100644 --- a/moon.mod.json +++ b/moon.mod.json @@ -7,5 +7,6 @@ "license": "Apache-2.0", "keywords": ["Cirru"], "source": "src", - "description": "parser for Cirru Syntax" + "description": "parser for Cirru Syntax", + "preferred-target": "js" } diff --git a/src/lib/lib.mbti b/src/lib/lib.mbti index 6bfde94..75eba86 100644 --- a/src/lib/lib.mbti +++ b/src/lib/lib.mbti @@ -1,63 +1,44 @@ -package tiye/cirru-parser/lib +// Generated using `moon info`, DON'T EDIT IT +package "tiye/cirru-parser/lib" + +import( + "moonbitlang/core/json" +) // Values -fn format(Array[Cirru], CirruWriterOptions) -> String!FormatCirruError +fn format_to_lisp(Array[Cirru]) -> String raise FormatError -fn format_to_lisp(Array[Cirru]) -> String!FormatError +// Errors +type CirruParseError +fn CirruParseError::to_string(Self) -> String -fn parse(String) -> Array[Cirru]!CirruParseError +pub(all) suberror FormatCirruError String +impl Show for FormatCirruError + +type FormatError // Types and methods pub(all) enum Cirru { Leaf(String) List(Array[Cirru]) } -impl Cirru { - compare(Self, Self) -> Int - debug_write(Self, Buffer) -> Unit - is_comment(Self) -> Bool - is_empty(Self) -> Bool - is_nested(Self) -> Bool - length(Self) -> Int - op_equal(Self, Self) -> Bool - output(Self, Logger) -> Unit - to_json(Self) -> Json - to_string(Self) -> String -} +fn Cirru::format(Array[Self], CirruWriterOptions) -> String raise FormatCirruError +fn Cirru::is_comment(Self) -> Bool +fn Cirru::is_empty(Self) -> Bool +fn Cirru::is_nested(Self) -> Bool +fn Cirru::length(Self) -> Int +fn Cirru::parse(String) -> Array[Self] raise CirruParseError +impl Compare for Cirru impl Eq for Cirru impl Hash for Cirru -impl @moonbitlang/core/json.FromJson for Cirru - -type CirruLexItem - -type CirruLexState -impl CirruLexState { - to_string(Self) -> String -} -impl Show for CirruLexState - -type CirruParseError -impl CirruParseError { - to_string(Self) -> String -} +impl Show for Cirru +impl ToJson for Cirru +impl @json.FromJson for Cirru pub(all) struct CirruWriterOptions { use_inline : Bool } -pub(all) type! FormatCirruError String -impl FormatCirruError { - to_string(Self) -> String -} - -type FormatError - -type WriterNode -impl WriterNode { - op_equal(Self, Self) -> Bool -} -impl Eq for WriterNode - // Type aliases // Traits diff --git a/src/lib/parser.mbt b/src/lib/parser.mbt index 4e9e6ed..c8688d9 100644 --- a/src/lib/parser.mbt +++ b/src/lib/parser.mbt @@ -1,6 +1,6 @@ ///| fn build_exprs( - tokens : Array[CirruLexItem] + tokens : Array[CirruLexItem], ) -> Array[Cirru] raise CirruParseError { let acc : Array[Cirru] = Array::new() let mut idx = 0 diff --git a/src/lib/parser_test.mbt b/src/lib/parser_test.mbt index b70b01f..d540957 100644 --- a/src/lib/parser_test.mbt +++ b/src/lib/parser_test.mbt @@ -16,14 +16,14 @@ test "existed demos" { for demo in demos { let demo_file = fsReadSync("./test/cirru/\{demo}.cirru") let json_file = fsReadSync("./test/data/\{demo}.json") - let tree = Cirru::parse?(demo_file).unwrap().to_json().stringify() - let defined = @json.parse?(json_file).unwrap() + let tree = (try? Cirru::parse(demo_file)).unwrap().to_json().stringify() + let defined = (try? @json.parse(json_file)).unwrap() let defined_str = defined.stringify() assert_eq(tree, defined_str) let formatted = Cirru::format(@json.from_json(defined), { use_inline: false, }) - let ret = Cirru::parse?(formatted).unwrap().to_json().stringify() + let ret = (try? Cirru::parse(formatted)).unwrap().to_json().stringify() assert_eq(ret, defined_str) } } diff --git a/src/lib/primes.mbt b/src/lib/primes.mbt index 6f7e41a..1a932cf 100644 --- a/src/lib/primes.mbt +++ b/src/lib/primes.mbt @@ -64,11 +64,6 @@ pub impl @json.FromJson for Cirru with from_json(json, path) { } } -///| -impl Default for Cirru with default() -> Cirru { - List(Array::new()) -} - ///| pub impl Show for Cirru with output(self : Cirru, logger : &Logger) -> Unit { match self { @@ -97,7 +92,7 @@ pub impl Compare for Cirru with compare(self, other) -> Int { match (self, other) { (Leaf(a), Leaf(b)) => a.compare(b) (List(xs), List(ys)) => { - let size = @math.minimum(xs.length(), ys.length()) + let size = @cmp.minimum(xs.length(), ys.length()) for i = 0; i < size; i = i + 1 { let x = xs[i] let y = ys[i] @@ -148,7 +143,7 @@ pub fn Cirru::is_nested(self : Cirru) -> Bool { ///| pub fn Cirru::is_comment(self : Cirru) -> Bool { match self { - Leaf(s) => s.char_at(0) == ';' + Leaf(s) => s.get_char(0).unwrap() == ';' _ => false } } @@ -165,7 +160,7 @@ priv enum CirruLexState { Indent /// Working on a string Str -} derive(Show) +} ///| lexer is a simpler state machine to tokenize Cirru code priv enum CirruLexItem { @@ -198,7 +193,7 @@ fn CirruLexItem::is_normal_str(tok : String) -> Bool { } let mut i = 0 while i < size { - let c = tok.char_at(i) + let c = tok.get_char(i).unwrap() match c { 'A'..='Z' => () 'a'..='z' => () @@ -236,7 +231,7 @@ fn escape_cirru_leaf(s : String) -> String { let size = s.length() let mut i = 0 while i < size { - let c = s.char_at(i) + let c = s.get_char(i).unwrap() match c { '\n' => out += "\\n" '\t' => out += "\\t" diff --git a/src/lib/s_expr.mbt b/src/lib/s_expr.mbt index 145e5cd..ad3ce83 100644 --- a/src/lib/s_expr.mbt +++ b/src/lib/s_expr.mbt @@ -49,7 +49,7 @@ fn format_lispy_expr(self : Cirru, indent : Int) -> String raise FormatError { if token.is_empty() { raise FormatError("empty string is invalid") } else { - let s0 = token.char_at(0) + let s0 = token.get_char(0).unwrap() if s0 == '|' || s0 == '"' { "\"" + escape_string(token.substring(start=1)) + "\"" } else if token.contains(" ") || diff --git a/src/lib/writer.mbt b/src/lib/writer.mbt index 49b22f8..5a1c998 100644 --- a/src/lib/writer.mbt +++ b/src/lib/writer.mbt @@ -172,7 +172,7 @@ fn generate_tree( insist_head : Bool, options : CirruWriterOptions, base_level : Int, - in_tail : Bool + in_tail : Bool, ) -> String raise FormatCirruError { let mut prev_kind : WriterNode = Nil let mut level = base_level @@ -299,7 +299,7 @@ fn generate_tree( ///| fn generate_statements( ys : Array[Cirru], - options : CirruWriterOptions + options : CirruWriterOptions, ) -> String raise FormatCirruError { let mut zs = "" for y in ys { @@ -318,7 +318,7 @@ fn generate_statements( ///| format Cirru code, use options to control `use_inline` option pub fn Cirru::format( xs : Array[Cirru], - options : CirruWriterOptions + options : CirruWriterOptions, ) -> String raise FormatCirruError { generate_statements(xs, options) } diff --git a/src/main/main.mbt b/src/main/main.mbt index 046a915..5327d51 100644 --- a/src/main/main.mbt +++ b/src/main/main.mbt @@ -13,11 +13,12 @@ pub fn main_parser() -> Unit { let demo_file = fsReadSync("./test/cirru/unfolding.cirru") let json_file = fsReadSync("./test/data/unfolding.json") - let tree = Cirru::parse?(demo_file) + let tree = try? Cirru::parse(demo_file) match tree { Ok(tree) => { println(tree.to_json().stringify()) - match @json.parse?(json_file) { + let json_result = try? @json.parse(json_file) + match json_result { Ok(json) => println(json.stringify()) Err(err) => println(err.to_string()) } @@ -32,13 +33,13 @@ pub fn main_writer() -> Unit { let demo = "unfolding" let demo_file = fsReadSync("./test/cirru/\{demo}.cirru") let json_file = fsReadSync("./test/data/\{demo}.json") - let defined = @json.parse?(json_file).unwrap() - let tree : Array[Cirru] = @json.from_json?(defined).unwrap() + let defined = (try? @json.parse(json_file)).unwrap() + let tree : Array[Cirru] = (try? @json.from_json(defined)).unwrap() println("TREE:") for item in tree { println(item.to_json().stringify()) } - let ret = Cirru::format?(tree, { use_inline: false }).unwrap() + let ret = (try? Cirru::format(tree, { use_inline: false })).unwrap() println("Generated:") println(ret) println("Expected:") diff --git a/src/main/main.mbti b/src/main/main.mbti index f49045a..21245fb 100644 --- a/src/main/main.mbti +++ b/src/main/main.mbti @@ -1,4 +1,5 @@ -package tiye/cirru-parser/main +// Generated using `moon info`, DON'T EDIT IT +package "tiye/cirru-parser/main" // Values fn fsReadSync(String) -> String @@ -7,6 +8,8 @@ fn main_parser() -> Unit fn main_writer() -> Unit +// Errors + // Types and methods // Type aliases