Compare commits

...

3 Commits

Author SHA1 Message Date
c22297ea82 fix <| not parsing 2022-05-08 00:06:38 +02:00
c59b35f9c6 fix #<= and #>= not parsing 2022-05-07 23:59:40 +02:00
2cf47085c1 add support for +:= etc. 2022-05-07 23:51:25 +02:00
3 changed files with 71 additions and 43 deletions

View File

@@ -1,15 +1,16 @@
import "env.memory" memory(2); import "env.memory" memory(2);
import "env.time" fn time() -> f32;
export fn tic(time: i32) { export fn upd() {
let i: i32; let i: i32;
loop pixels { loop pixels {
let lazy x = (i % 320) as f32 - 160.1; let lazy x = (i % 320) as f32 - 160.1;
let lazy y = (i / 320 - 120) as f32; let lazy y = (i / 320 - 120) as f32;
let lazy dist = 10000.0 / (x*x + y*y); let lazy dist = 1024_f / (x*x + y*y);
let lazy t = time as f32 / 20 as f32; let inline t = time() * 4_f;
i?120 = (x * dist + t) as i32 ^ (y * dist + t) as i32; i?120 = (x * dist + t) as i32 ^ (y * dist + t) as i32 | -32;
branch_if (i := i + 1) < 320*240: pixels branch_if (i +:= 1) < 320*240: pixels
} }
} }

View File

@@ -18,14 +18,14 @@ fn rng(state: i32) -> i32 {
} }
fn set_color(color: i32) -> i32 { fn set_color(color: i32) -> i32 {
?20 = color; 0?20 = color;
6 6
} }
export fn update() { export fn update() {
let y: i32; let y: i32;
let score = pz; let score = pz;
let lazy pad = ?22; let lazy pad = 0?22;
let lazy zero = 0.0; let lazy zero = 0.0;
let lazy control_speed = 0.03; let lazy control_speed = 0.03;
@@ -33,7 +33,7 @@ export fn update() {
f = f * 0.7; f = f * 0.7;
loop lines { loop lines {
?(8003-y) = (score := score / 10) % 10 + 48; (8003-y)?0 = (score := score / 10) % 10 + 48;
let lazy z = (4000 / (y := y + 1) + pz) / 20; let lazy z = (4000 / (y := y + 1) + pz) / 20;
let lazy x = (rng(rng(rng(rng(z)))) >> 30) as f32 - px; let lazy x = (rng(rng(rng(rng(z)))) >> 30) as f32 - px;
let lazy w = 9 as f32 / sqrt(z as f32); let lazy w = 9 as f32 / sqrt(z as f32);

View File

@@ -324,16 +324,17 @@ fn lexer() -> impl Parser<char, Vec<(Token, Span)>, Error = LexerError> {
just("<<"), just("<<"),
just(">>"), just(">>"),
just("#>>"), just("#>>"),
just("#<"),
just("#>"),
just(">="), just(">="),
just("<="), just("<="),
just("=="), just("=="),
just("!="), just("!="),
just("#>="), just("#>="),
just("#<="), just("#<="),
just("#<"),
just("#>"),
just("->"), just("->"),
just(":="), just(":="),
just("<|"),
)) ))
.map(|s| s.to_string()) .map(|s| s.to_string())
.or(one_of("+-*/%&^|<=>").map(|s: char| s.to_string())) .or(one_of("+-*/%&^|<=>").map(|s: char| s.to_string()))
@@ -376,16 +377,9 @@ fn lexer() -> impl Parser<char, Vec<(Token, Span)>, Error = LexerError> {
let comment = single_line.or(multi_line); let comment = single_line.or(multi_line);
let token = float let token = choice((
.or(float64) float, float64, int64, int_float, int, str_, char_, op, ctrl, ident,
.or(int64) ))
.or(int_float)
.or(int)
.or(str_)
.or(char_)
.or(op)
.or(ctrl)
.or(ident)
.recover_with(skip_then_retry_until([])); .recover_with(skip_then_retry_until([]));
token token
@@ -522,6 +516,36 @@ fn script_parser() -> impl Parser<Token, ast::Script, Error = ScriptError> + Clo
}) })
.boxed(); .boxed();
let local_tee_op = identifier
.then(
product_op
.clone()
.or(sum_op.clone())
.or(shift_op.clone())
.or(bit_op.clone()),
)
.then_ignore(just(Token::Op(":=".to_string())))
.then(expression.clone())
.map_with_span(|((name, op), expr), span| ast::Expr::LocalTee {
name: name.clone(),
value: Box::new(
ast::Expr::BinOp {
left: Box::new(
ast::Expr::Variable {
name,
local_id: None,
}
.with_span(span.clone()),
),
right: Box::new(expr),
op,
}
.with_span(span),
),
local_id: None,
})
.boxed();
let loop_expr = just(Token::Loop) let loop_expr = just(Token::Loop)
.ignore_then(identifier) .ignore_then(identifier)
.then(block.clone()) .then(block.clone())
@@ -632,16 +656,19 @@ fn script_parser() -> impl Parser<Token, ast::Script, Error = ScriptError> + Clo
value: value.map(Box::new), value: value.map(Box::new),
}); });
let atom = val let atom = choice((
.or(function_call) val,
.or(local_tee) function_call,
.or(variable) local_tee,
.or(block_expr) local_tee_op,
.or(branch) variable,
.or(branch_if) block_expr,
.or(let_) branch,
.or(select) branch_if,
.or(return_) let_,
select,
return_,
))
.map_with_span(|expr, span| expr.with_span(span)) .map_with_span(|expr, span| expr.with_span(span))
.or(expression .or(expression
.clone() .clone()