diff --git a/Cargo.lock b/Cargo.lock index 28b8f74..0f92771 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -261,7 +261,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mindustry_logic_bang_lang" -version = "0.7.7" +version = "0.7.8" dependencies = [ "lalrpop", "lalrpop-util", diff --git a/Cargo.toml b/Cargo.toml index 3d5f29e..8fcb74c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mindustry_logic_bang_lang" -version = "0.7.7" +version = "0.7.8" edition = "2021" authors = ["A4-Tacks "] diff --git a/examples/control.mdtlbl b/examples/control.mdtlbl index c4c3f25..86ef3a8 100644 --- a/examples/control.mdtlbl +++ b/examples/control.mdtlbl @@ -112,3 +112,23 @@ jump 2 lessThan i 10 *# # 它的缺点是, 需要多一条跳转, 所以这导致while并没有采用这种形式 # 当然, 在手写逻辑时, 我们很喜欢这么写, 因为比较省力 + + +select x { + print 0; + print 1 "is one!"; + print 2; +} +#* >>> +op mul __0 x 2 +op add @counter @counter __0 +print 0 +noop +print 1 +print "is one!" +print 2 +noop +*# +# select是原始版本, 没有switch那么多的功能, +# 但是相比switch的好处是不用编写case, 直接跳转到指定行 +# 第0行, 第1行 以此类推 diff --git a/src/syntax.rs b/src/syntax.rs index de417b7..6f1614c 100644 --- a/src/syntax.rs +++ b/src/syntax.rs @@ -2802,4 +2802,30 @@ mod tests { "print a", ]); } + + #[test] + fn select_test() { + let parser = ExpandParser::new(); + + let logic_lines = CompileMeta::new().compile(parse!(parser, r#" + select 1 { + print 0; + { + print 1 " is one!"; + } + print 2; + } + "#).unwrap()).compile().unwrap(); + assert_eq!(logic_lines, vec![ + "op mul __0 1 2", + "op add @counter @counter __0", + "print 0", + "noop", + "print 1", + "print \" is one!\"", + "print 2", + "noop", + ]); + + } } diff --git a/src/syntax_def.lalrpop b/src/syntax_def.lalrpop index 8f958c2..2cafd77 100644 --- a/src/syntax_def.lalrpop +++ b/src/syntax_def.lalrpop @@ -280,7 +280,8 @@ pub BuiltinCommand: LogicLine = { "setres" LEnd => LogicLine::SetResultHandle(<>), } -pub Block: LogicLine = MBlock => <>.into(); +BlockExpand: Expand = MBlock => <>; +pub Block: LogicLine = BlockExpand => <>.into(); pub DExp: DExp = MTuple<(<( ":")?> )> => DExp::new_optional_res(<>.0, <>.1); @@ -369,6 +370,8 @@ pub Control: LogicLine = { Select(value, Expand(cases_res)).into() }, + "select" => Select(value, lines).into(), + "if" )*> )?> => { diff --git a/syntax/vim/mdtlbl.snippets b/syntax/vim/mdtlbl.snippets index 4f3cf2e..82351a9 100644 --- a/syntax/vim/mdtlbl.snippets +++ b/syntax/vim/mdtlbl.snippets @@ -22,12 +22,12 @@ skip ${1:_} { } endsnippet snippet if "if" w -if ${1:_} { +if $1 { $0 } endsnippet snippet elif "elif" w -elif ${1:_} { +elif $1 { $0 } endsnippet @@ -53,7 +53,7 @@ snippet iop "op self" w op ${1:i} $1 ${2:+} ${3:1};$0 endsnippet snippet switch "switch" w -switch ${1:x} { +switch $1 { $0 } endsnippet @@ -87,3 +87,8 @@ endsnippet snippet drawflush "drawflush message1" w drawflush ${1:display1};$0 endsnippet +snippet select "select" w +select $1 { + $0 +} +endsnippet diff --git a/syntax/vim/mdtlbl.vim b/syntax/vim/mdtlbl.vim index afe0210..93b6c33 100644 --- a/syntax/vim/mdtlbl.vim +++ b/syntax/vim/mdtlbl.vim @@ -24,7 +24,9 @@ syn case match " 控制语句 {{{1 -syn keyword mdtlblKeyword while do skip goto if elif else switch case const take gwhile setres +syn keyword mdtlblKeyword + \ while do skip goto if elif else + \ switch case const take gwhile setres select hi link mdtlblKeyword Keyword