Skip to content

Commit 79768ff

Browse files
committed
添加gwhile来解决while的条件拷贝与代码膨胀问题
1 parent 4dfadc2 commit 79768ff

File tree

8 files changed

+70
-5
lines changed

8 files changed

+70
-5
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mindustry_logic_bang_lang"
3-
version = "0.7.0"
3+
version = "0.7.1"
44
edition = "2021"
55

66
authors = ["A4-Tacks <wdsjxhno1001@163.com>"]

examples/control.mdtlbl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,34 @@ op add n n 1
8181
jump 0 lessThan n 9
8282
*#
8383
# 就如同do_while一样, 我们手动完成了它
84+
85+
86+
i = 0;
87+
gwhile i < 10 {
88+
op i i + 1;
89+
}
90+
91+
#* >>>
92+
set i 0
93+
jump 3 always 0 0
94+
op add i i 1
95+
jump 2 lessThan i 10
96+
*#
97+
# 这是为了避免普通while进行条件复制带来的副作用与代码膨胀而诞生的
98+
# 可以看到, 头部并不是对条件反转然后跳过循环体而是直接跳到条件部分
99+
# 然后就是一个do_while结构
100+
# 也就是说它的结构为
101+
i = 0;
102+
goto :x _;
103+
do {
104+
op i i + 1;
105+
:x
106+
} while i < 10;
107+
#* >>>
108+
set i 0
109+
jump 3 always 0 0
110+
op add i i 1
111+
jump 2 lessThan i 10
112+
*#
113+
# 它的缺点是, 需要多一条跳转, 所以这导致while并没有采用这种形式
114+
# 当然, 在手写逻辑时, 我们很喜欢这么写, 因为比较省力

src/syntax.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,24 @@ mod tests {
13701370
}
13711371
"#).unwrap(),
13721372
);
1373+
1374+
assert_eq!(
1375+
parse!(parser, r#"
1376+
gwhile a < b {
1377+
print 1;
1378+
}
1379+
"#).unwrap(),
1380+
parse!(parser, r#"
1381+
{
1382+
goto :___0 _;
1383+
:___1 {
1384+
print 1;
1385+
}
1386+
:___0
1387+
goto :___1 a < b;
1388+
}
1389+
"#).unwrap(),
1390+
);
13731391
}
13741392

13751393
#[test]

src/syntax_def.lalrpop

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,17 @@ pub Control: LogicLine = {
314314
]).into()
315315
},
316316

317+
"gwhile" <cmp:JumpCmp> <body:LogicLine> => {
318+
let [to, head] = [meta.get_tag(), meta.get_tag()];
319+
Expand(vec![
320+
Goto(to.clone(), JumpCmp::Always.into()).into(),
321+
LogicLine::new_label(head.clone(), meta),
322+
body,
323+
LogicLine::new_label(to, meta),
324+
Goto(head, cmp).into(),
325+
]).into()
326+
},
327+
317328
"switch" <value:Value>
318329
<cases:MBlock<(
319330
<LogicLine?> // append line

syntax/MindustryLogicBangLang.mtsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
{
6060
// control
6161
match: keywordsToRegex(
62-
"while do skip goto if elif else switch case"
62+
"while gwhile do skip goto if elif else switch case"
6363
),
6464
0: "keyword"
6565
},

syntax/mdtlbl.snippets

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ while ${1:_} {
33
$0
44
}
55
endsnippet
6+
snippet gwhile "gwhile" w
7+
gwhile ${1:_} {
8+
$0
9+
}
10+
endsnippet
611
snippet do_while "do_while" w
712
do {
813
$0

syntax/mdtlbl.vim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
" Vim syntax file
22
" Language: mindustry_logic_bang_lang (mdtlbl)
33
" Maintainer: A4-Tacks <wdsjxhno1001@163.com>
4-
" Last Change: 2023-7-25
4+
" Last Change: 2023-7-31
55
" URL: https://github.com/A4-Tacks/mindustry_logic_bang_lang
66

77
" 已加载高亮时就退出
@@ -24,7 +24,7 @@ syn case match
2424

2525

2626
" 控制语句 {{{1
27-
syn keyword mdtlblKeyword while do skip goto if elif else switch case const take
27+
syn keyword mdtlblKeyword while do skip goto if elif else switch case const take gwhile
2828
hi link mdtlblKeyword Keyword
2929

3030

0 commit comments

Comments
 (0)