mirror of
https://github.com/exoticorn/curlywas.git
synced 2026-01-20 11:46:43 +01:00
warptunnel parses
This commit is contained in:
@@ -16,6 +16,7 @@ enum Token {
|
|||||||
Loop,
|
Loop,
|
||||||
BranchIf,
|
BranchIf,
|
||||||
Defer,
|
Defer,
|
||||||
|
As,
|
||||||
Ident(String),
|
Ident(String),
|
||||||
Str(String),
|
Str(String),
|
||||||
Int(i32),
|
Int(i32),
|
||||||
@@ -37,6 +38,7 @@ impl fmt::Display for Token {
|
|||||||
Token::Loop => write!(f, "loop"),
|
Token::Loop => write!(f, "loop"),
|
||||||
Token::BranchIf => write!(f, "branch_if"),
|
Token::BranchIf => write!(f, "branch_if"),
|
||||||
Token::Defer => write!(f, "defer"),
|
Token::Defer => write!(f, "defer"),
|
||||||
|
Token::As => write!(f, "as"),
|
||||||
Token::Ident(s) => write!(f, "{}", s),
|
Token::Ident(s) => write!(f, "{}", s),
|
||||||
Token::Str(s) => write!(f, "{:?}", s),
|
Token::Str(s) => write!(f, "{:?}", s),
|
||||||
Token::Int(v) => write!(f, "{}", v),
|
Token::Int(v) => write!(f, "{}", v),
|
||||||
@@ -186,6 +188,7 @@ fn lexer() -> impl Parser<char, Vec<(Token, Span)>, Error = Simple<char>> {
|
|||||||
"loop" => Token::Loop,
|
"loop" => Token::Loop,
|
||||||
"branch_if" => Token::BranchIf,
|
"branch_if" => Token::BranchIf,
|
||||||
"defer" => Token::Defer,
|
"defer" => Token::Defer,
|
||||||
|
"as" => Token::As,
|
||||||
_ => Token::Ident(ident),
|
_ => Token::Ident(ident),
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -496,31 +499,47 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
|span| ast::Expr::Error.with_span(span),
|
|span| ast::Expr::Error.with_span(span),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
let op_cast = atom
|
||||||
|
.clone()
|
||||||
|
.then(
|
||||||
|
just(Token::As)
|
||||||
|
.ignore_then(type_parser())
|
||||||
|
.map_with_span(|type_, span| (type_, span))
|
||||||
|
.repeated(),
|
||||||
|
)
|
||||||
|
.foldl(|value, (type_, span)| {
|
||||||
|
ast::Expr::Cast {
|
||||||
|
value: Box::new(value),
|
||||||
|
type_,
|
||||||
|
}
|
||||||
|
.with_span(span)
|
||||||
|
});
|
||||||
|
|
||||||
let mem_size = just(Token::Ctrl('?'))
|
let mem_size = just(Token::Ctrl('?'))
|
||||||
.to(ast::MemSize::Byte)
|
.to(ast::MemSize::Byte)
|
||||||
.or(just(Token::Ctrl('!')).to(ast::MemSize::Word));
|
.or(just(Token::Ctrl('!')).to(ast::MemSize::Word));
|
||||||
|
|
||||||
let memory_op = atom
|
let memory_op = op_cast
|
||||||
.clone()
|
.clone()
|
||||||
.then(
|
.then(
|
||||||
mem_size
|
mem_size
|
||||||
.then(atom.clone())
|
.then(op_cast.clone())
|
||||||
.then_ignore(just(Token::Op("=".to_string())))
|
.then_ignore(just(Token::Op("=".to_string())))
|
||||||
.then(expression.clone())
|
.then(expression.clone())
|
||||||
.repeated(),
|
.repeated(),
|
||||||
)
|
)
|
||||||
.foldl(|left, ((size, right), value)| ast::Expression {
|
.foldl(|left, ((size, right), value)| {
|
||||||
span: left.span.start..value.span.end,
|
let span = left.span.start..value.span.end;
|
||||||
expr: ast::Expr::Poke {
|
ast::Expr::Poke {
|
||||||
mem_location: ast::MemoryLocation {
|
mem_location: ast::MemoryLocation {
|
||||||
span: left.span.start..right.span.end,
|
span: span.clone(),
|
||||||
left: Box::new(left),
|
left: Box::new(left),
|
||||||
size,
|
size,
|
||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
},
|
},
|
||||||
value: Box::new(value),
|
value: Box::new(value),
|
||||||
},
|
}
|
||||||
type_: None,
|
.with_span(span)
|
||||||
});
|
});
|
||||||
|
|
||||||
let op_product = memory_op
|
let op_product = memory_op
|
||||||
@@ -533,14 +552,14 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.then(memory_op.clone())
|
.then(memory_op.clone())
|
||||||
.repeated(),
|
.repeated(),
|
||||||
)
|
)
|
||||||
.foldl(|left, (op, right)| ast::Expression {
|
.foldl(|left, (op, right)| {
|
||||||
span: left.span.start..right.span.end,
|
let span = left.span.start..right.span.end;
|
||||||
expr: ast::Expr::BinOp {
|
ast::Expr::BinOp {
|
||||||
op,
|
op,
|
||||||
left: Box::new(left),
|
left: Box::new(left),
|
||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
},
|
}
|
||||||
type_: None,
|
.with_span(span)
|
||||||
});
|
});
|
||||||
|
|
||||||
let op_sum = op_product
|
let op_sum = op_product
|
||||||
@@ -552,14 +571,14 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.then(op_product.clone())
|
.then(op_product.clone())
|
||||||
.repeated(),
|
.repeated(),
|
||||||
)
|
)
|
||||||
.foldl(|left, (op, right)| ast::Expression {
|
.foldl(|left, (op, right)| {
|
||||||
span: left.span.start..right.span.end,
|
let span = left.span.start..right.span.end;
|
||||||
expr: ast::Expr::BinOp {
|
ast::Expr::BinOp {
|
||||||
op,
|
op,
|
||||||
left: Box::new(left),
|
left: Box::new(left),
|
||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
},
|
}
|
||||||
type_: None,
|
.with_span(span)
|
||||||
});
|
});
|
||||||
|
|
||||||
let op_cmp = op_sum
|
let op_cmp = op_sum
|
||||||
@@ -575,14 +594,14 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.then(op_sum.clone())
|
.then(op_sum.clone())
|
||||||
.repeated(),
|
.repeated(),
|
||||||
)
|
)
|
||||||
.foldl(|left, (op, right)| ast::Expression {
|
.foldl(|left, (op, right)| {
|
||||||
span: left.span.start..right.span.end,
|
let span = left.span.start..right.span.end;
|
||||||
expr: ast::Expr::BinOp {
|
ast::Expr::BinOp {
|
||||||
op,
|
op,
|
||||||
left: Box::new(left),
|
left: Box::new(left),
|
||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
},
|
}
|
||||||
type_: None,
|
.with_span(span)
|
||||||
});
|
});
|
||||||
|
|
||||||
let op_bit = op_cmp
|
let op_bit = op_cmp
|
||||||
@@ -595,14 +614,14 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.then(op_cmp.clone())
|
.then(op_cmp.clone())
|
||||||
.repeated(),
|
.repeated(),
|
||||||
)
|
)
|
||||||
.foldl(|left, (op, right)| ast::Expression {
|
.foldl(|left, (op, right)| {
|
||||||
span: left.span.start..right.span.end,
|
let span = left.span.start..right.span.end;
|
||||||
expr: ast::Expr::BinOp {
|
ast::Expr::BinOp {
|
||||||
op,
|
op,
|
||||||
left: Box::new(left),
|
left: Box::new(left),
|
||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
},
|
}
|
||||||
type_: None,
|
.with_span(span)
|
||||||
});
|
});
|
||||||
|
|
||||||
op_bit
|
op_bit
|
||||||
|
|||||||
Reference in New Issue
Block a user