Add parsing for label refs, shorthand sends
This commit is contained in:
+47
-2
@@ -46,12 +46,45 @@ fn bare_if() -> impl Rule {
|
|||||||
condition,
|
condition,
|
||||||
w,
|
w,
|
||||||
Opt(("then", w)),
|
Opt(("then", w)),
|
||||||
Box::new(line) as Box<dyn Rule>,
|
Alt((shorthand_send, Box::new(line) as Box<dyn Rule>)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `send` without a preceding `#`
|
||||||
fn bare_send() -> impl Rule {
|
fn bare_send() -> impl Rule {
|
||||||
(NoCase("send"), ww, Tag("ref", label_name), w, eol)
|
(NoCase("send"), ww, label_reference, w, eol)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `send` without a send keyword
|
||||||
|
fn shorthand_send() -> impl Rule {
|
||||||
|
let af = (
|
||||||
|
And('a'..='f'),
|
||||||
|
Alt((
|
||||||
|
"become", "bind", "change", "char", "clear", "cycle", "die", "end", "endgame",
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
let gr = (
|
||||||
|
And('g'..='r'),
|
||||||
|
Alt((
|
||||||
|
"go", "idle", "if", "lock", "play", "put", "restart", "restore",
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
let sz = (
|
||||||
|
And('s'..='z'),
|
||||||
|
Alt((
|
||||||
|
"send",
|
||||||
|
"set",
|
||||||
|
"shoot",
|
||||||
|
"take",
|
||||||
|
"throwstar",
|
||||||
|
"try",
|
||||||
|
"unlock",
|
||||||
|
"walk",
|
||||||
|
"zap",
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
let command = Alt((af, gr, sz));
|
||||||
|
(Not(command), label_reference, w, eol)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn any_line() -> impl Rule {
|
fn any_line() -> impl Rule {
|
||||||
@@ -138,6 +171,7 @@ fn condition() -> impl Rule {
|
|||||||
("blocked", ww, direction),
|
("blocked", ww, direction),
|
||||||
"contact",
|
"contact",
|
||||||
"energized",
|
"energized",
|
||||||
|
('a'..='z', star!(word_char)),
|
||||||
));
|
));
|
||||||
(star!("not", ww), base)
|
(star!("not", ww), base)
|
||||||
}
|
}
|
||||||
@@ -165,6 +199,16 @@ fn label_name() -> impl Rule {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn label_reference() -> impl Rule {
|
||||||
|
Tag(
|
||||||
|
"ref",
|
||||||
|
(
|
||||||
|
Opt((Tag("dest", plus!(word_char)), ":")),
|
||||||
|
Tag("name", label_name),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn word_char() -> impl Rule {
|
fn word_char() -> impl Rule {
|
||||||
Alt(('A'..='Z', 'a'..='z', '0'..='9', "_"))
|
Alt(('A'..='Z', 'a'..='z', '0'..='9', "_"))
|
||||||
}
|
}
|
||||||
@@ -263,6 +307,7 @@ mod test {
|
|||||||
let before = &input[last_index..group.span().start];
|
let before = &input[last_index..group.span().start];
|
||||||
let inner = match group.kind() {
|
let inner = match group.kind() {
|
||||||
"label" => format!("({})", group.text()),
|
"label" => format!("({})", group.text()),
|
||||||
|
"ref" => format!("[{}]", group.text()),
|
||||||
_ => group.text().into(),
|
_ => group.text().into(),
|
||||||
};
|
};
|
||||||
result.push_str(before);
|
result.push_str(before);
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ expression: result
|
|||||||
---
|
---
|
||||||
'Find all the labels and their references
|
'Find all the labels and their references
|
||||||
:(foo)
|
:(foo)
|
||||||
#send foo
|
#send [foo]
|
||||||
#if blocked n #send foo
|
#if blocked n #send [foo]
|
||||||
#if bar foo
|
#if bar [foo]
|
||||||
|
|||||||
Reference in New Issue
Block a user