mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'lemu/src/lexer.rs')
-rw-r--r--lemu/src/lexer.rs213
1 files changed, 0 insertions, 213 deletions
diff --git a/lemu/src/lexer.rs b/lemu/src/lexer.rs
deleted file mode 100644
index e6b85c6..0000000
--- a/lemu/src/lexer.rs
+++ /dev/null
@@ -1,213 +0,0 @@
-use atools::prelude::*;
-use beef::lean::Cow;
-use fimg::Pack;
-use logos::{Lexer as RealLexer, Logos, Span};
-
-macro_rules! instrs {
- ($($z:literal => $v:ident,)+) => {
- #[derive(Logos, Debug, PartialEq, Clone)]
- #[logos(skip r"[ \t]+")]
- pub enum Token<'strings> {
- #[token("\n")]
- #[token(";")]
- Newline,
- #[regex("#[^\n]+", priority = 8)]
- Comment(&'strings str),
- #[regex(r"-?[0-9]+(\.[0-9]+)?", |lex| lex.slice().parse().ok())]
- #[regex(r"(true)|(false)", |lex| lex.slice().parse::<bool>().ok().map(f64::from), priority = 10)]
- #[regex(r#"0[xX][0-9a-fA-F]+"#, |lex| u64::from_str_radix(&lex.slice()[2..], 16).map(|v| v as f64).ok())]
- #[regex(r#"0[bB][01]+"#, |lex| u64::from_str_radix(&lex.slice()[2..], 2).map(|v| v as f64).ok())]
- #[regex(r#""[0-9]+(\.[0-9]+)?""#, callback = |lex| lex.slice()[1..lex.slice().len()-1].parse().ok(), priority = 13)]
- #[regex(r#"%\[([a-z]+)\]"#, |lex| COLORS.get(dbg!(&lex.slice()[2..lex.slice().len()-1])).copied().unwrap_or_default().join(255).pack() as f64)]
- #[regex(r#"%[0-9a-fA-F]+"#, callback = |lex| {
- let mut x = lex.slice()[1..].bytes()
- .map(|b| (b & 0xF) + 9 * (b >> 6))
- .array_chunks::<2>()
- .map(|[a, b]| a * 16 + b);
- if lex.slice()[1..].len() == 6 { x.carr::<3>().join(255) }
- else if lex.slice()[1..].len() == 8 { x.carr::<4>() }
- else { [255; 4] }.pack() as f64
- })]
- Num(f64), // TODO have bool and integer tokens, and parser converts
- #[regex(r#""([^\\"\n])*""#, callback = |lex| Cow::from(&lex.slice()[1..lex.slice().len()-1]), priority = 12)]
- #[regex(r#"@[^ "\n]*"#, |lex| Cow::from(lex.slice()))]
- #[regex(r#""[^"]*""#, callback = |lex| Cow::from(lex.slice()[1..lex.slice().len()-1].replace(r"\n", "\n")), priority = 8)]
- String(Cow<'strings, str>),
- #[regex("[^%0-9- \t\n][^ \t\n]*", priority = 7)]
- Ident(&'strings str),
-
- $(#[token($z, priority = 8)] $v,)+
- }
-
- impl std::fmt::Display for Token<'_> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
- match self {
- $(Self::$v => write!(f, $z,),)+
- Self::Ident(s)| Self::Comment(s) => write!(f, "{s}"),
- Self::String(s) => write!(f, "{s}"),
- Self::Num(n) => write!(f, "{n}"),
- Self::Newline => write!(f, "\n"),
- }
- }
- }
- }
-}
-
-instrs! {
- "null" => Null,
- "read" => Read,
- "write" => Write,
- "set" => Set,
- "op" => Op,
- "end" => End,
- "packcolor" => PackColor,
- "drawflush" => DrawFlush,
- "draw" => Draw,
- "select" => Select,
- "print" => Print,
- "jump" => Jump,
- "stop" => Stop,
- "equal" => Equal,
- "notEqual" => NotEqual,
- "lessThan" => LessThan,
- "lessThanEq" => LessThanEq,
- "greaterThan" => GreaterThan,
- "greaterThanEq" => GreaterThanEq,
- "strictEqual" => StrictEqual,
- "always" => Always,
- "add" => Add,
- "sub" => Sub,
- "mul" => Mul,
- "div" => Div,
- "idiv" => IDiv,
- "mod" => Mod,
- "pow" => Pow,
- "land" => And,
- "not" => Not,
- "shl" => ShiftLeft,
- "shr" => ShiftRight,
- "or" => BitOr,
- "and" => BitAnd,
- "xor" => ExclusiveOr,
- "max" => Max,
- "min" => Min,
- "angle" => Angle,
- "angleDiff" => AngleDiff,
- "len" => Len,
- "noise" => Noise,
- "abs" => Abs,
- "log" => Log,
- "log10" => Log10,
- "floor" => Floor,
- "ceil" => Ceil,
- "sqrt" => Sqrt,
- "rand" => Rand,
- "sin" => Sin,
- "cos" => Cos,
- "tan" => Tan,
- "asin" => ASin,
- "acos" => ACos,
- "atan" => ATan,
-}
-
-pub fn lex(s: &str) -> Lexer<'_> {
- Lexer {
- inner: Token::lexer(s),
- }
-}
-
-pub struct Lexer<'s> {
- inner: RealLexer<'s, Token<'s>>,
-}
-
-impl<'s> Lexer<'s> {
- pub fn next(&mut self) -> Option<Token<'s>> {
- self.inner.find_map(Result::ok)
- }
-
- pub fn span(&self) -> Span {
- self.inner.span()
- }
-}
-
-#[allow(dead_code)]
-pub fn print_stream(mut stream: Lexer) {
- print!("[");
- let Some(tok) = stream.next() else {
- println!("]");
- return;
- };
- print!("{tok:?}");
- while let Some(tok) = stream.next() {
- print!(", {tok:?}");
- }
- println!("]");
-}
-
-#[test]
-fn lexer() {
- let mut lex = lex(r#"
- start:
- print "xd"
- jump start always
- set x "4""#);
- macro_rules! test {
- ($($tok:ident$(($var:literal))?),+ $(,)?) => {{
- $(assert_eq!(lex.next(), Some(Token::$tok$(($var.into()))?));)+
- assert_eq!(lex.next(), None);
- }}
- }
- test![
- Newline,
- Ident("start:"),
- Newline,
- Print,
- String("xd"),
- Newline,
- Jump,
- Ident("start"),
- Always,
- Newline,
- Set,
- Ident("x"),
- Num(4),
- ];
-}
-
-const COLORS: phf::Map<&str, [u8; 3]> = phf::phf_map! {
- "clear" => [0, 0, 0],
- "black" => [0, 0, 0],
- "white" => [255, 255, 255],
- "lightgray" => [191, 191, 191],
- "gray" => [127, 127, 127],
- "darkgray" => [63, 63, 63],
- "blue" => [0, 0, 255],
- "navy" => [0, 0, 128],
- "royal" => [65, 105, 225],
- "slate" => [112, 128, 144],
- "sky" => [135, 206, 235],
- "cyan" => [0, 255, 255],
- "teal" => [0, 128, 128],
- "green" => [0, 255, 0],
- "acid" => [127, 255, 0],
- "lime" => [50, 205, 50],
- "forest" => [34, 139, 34],
- "olive" => [107, 142, 35],
- "yellow" => [255, 255, 0],
- "gold" => [255, 215, 0],
- "goldenrod" => [218, 165, 32],
- "orange" => [255, 165, 0],
- "brown" => [139, 69, 19],
- "tan" => [210, 180, 140],
- "brick" => [178, 34, 34],
- "red" => [255, 0, 0],
- "scarlet" => [255, 52, 28],
- "coral" => [255, 127, 80],
- "salmon" => [250, 128, 114],
- "pink" => [255, 105, 180],
- "magenta" => [255, 0, 255],
- "purple" => [160, 32, 240],
- "violet" => [238, 130, 238],
- "maroon" => [176, 48, 96],
- "accent" => [255, 211, 127],
-};