replace def = value
with def: value
, and let a = b
with a = b
in the name of terseness i'm also slipping in a new brush preset that i made closes #125
This commit is contained in:
parent
8fcf71661e
commit
9de4a8aecd
5 changed files with 67 additions and 45 deletions
|
@ -635,7 +635,7 @@ fn def_prepass<'a>(c: &mut Compiler<'a>, src: &Source<'a>, toplevel: NodeId) ->
|
||||||
while let Some(binary) = walk.node_of(NodeKind::Binary) {
|
while let Some(binary) = walk.node_of(NodeKind::Binary) {
|
||||||
let mut binary_walk = src.ast.walk(binary);
|
let mut binary_walk = src.ast.walk(binary);
|
||||||
if let (Some(ident), Some(op)) = (binary_walk.node(), binary_walk.get(NodeKind::Op)) {
|
if let (Some(ident), Some(op)) = (binary_walk.node(), binary_walk.get(NodeKind::Op)) {
|
||||||
if src.ast.span(op).slice(src.code) == "=" {
|
if src.ast.span(op).slice(src.code) == ":" {
|
||||||
let name = src.ast.span(ident).slice(src.code);
|
let name = src.ast.span(ident).slice(src.code);
|
||||||
match c.defs.add_def(name) {
|
match c.defs.add_def(name) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
|
@ -667,7 +667,7 @@ fn compile_toplevel_expr<'a>(
|
||||||
) -> CompileResult<ToplevelExpr> {
|
) -> CompileResult<ToplevelExpr> {
|
||||||
if src.ast.kind(node_id) == NodeKind::Binary {
|
if src.ast.kind(node_id) == NodeKind::Binary {
|
||||||
if let Some(op) = src.ast.walk(node_id).get(NodeKind::Op) {
|
if let Some(op) = src.ast.walk(node_id).get(NodeKind::Op) {
|
||||||
if src.ast.span(op).slice(src.code) == "=" {
|
if src.ast.span(op).slice(src.code) == ":" {
|
||||||
compile_def(c, src, node_id)?;
|
compile_def(c, src, node_id)?;
|
||||||
return Ok(ToplevelExpr::Def);
|
return Ok(ToplevelExpr::Def);
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,6 @@ fn ident(l: &mut Lexer<'_>) -> TokenKind {
|
||||||
"or" => TokenKind::Or,
|
"or" => TokenKind::Or,
|
||||||
"if" => TokenKind::If,
|
"if" => TokenKind::If,
|
||||||
"else" => TokenKind::Else,
|
"else" => TokenKind::Else,
|
||||||
"let" => TokenKind::Let,
|
|
||||||
_ => TokenKind::Ident,
|
_ => TokenKind::Ident,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -210,6 +209,7 @@ fn token(l: &mut Lexer<'_>) -> (TokenKind, Span) {
|
||||||
'[' => one(l, TokenKind::LBrack),
|
'[' => one(l, TokenKind::LBrack),
|
||||||
']' => one(l, TokenKind::RBrack),
|
']' => one(l, TokenKind::RBrack),
|
||||||
',' => one(l, TokenKind::Comma),
|
',' => one(l, TokenKind::Comma),
|
||||||
|
':' => one(l, TokenKind::Colon),
|
||||||
'\\' => one(l, TokenKind::Backslash),
|
'\\' => one(l, TokenKind::Backslash),
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
|
|
|
@ -306,7 +306,7 @@ enum Tighter {
|
||||||
fn tighter(left: TokenKind, right: TokenKind) -> Tighter {
|
fn tighter(left: TokenKind, right: TokenKind) -> Tighter {
|
||||||
fn tightness(kind: TokenKind) -> Option<usize> {
|
fn tightness(kind: TokenKind) -> Option<usize> {
|
||||||
match kind {
|
match kind {
|
||||||
TokenKind::Equal => Some(0),
|
TokenKind::Equal | TokenKind::Colon => Some(0),
|
||||||
TokenKind::EqualEqual
|
TokenKind::EqualEqual
|
||||||
| TokenKind::NotEqual
|
| TokenKind::NotEqual
|
||||||
| TokenKind::Less
|
| TokenKind::Less
|
||||||
|
@ -590,7 +590,6 @@ const PREFIX_TOKENS: TokenKindSet = TokenKindSet::new(&[
|
||||||
TokenKind::LParen,
|
TokenKind::LParen,
|
||||||
TokenKind::Backslash,
|
TokenKind::Backslash,
|
||||||
TokenKind::If,
|
TokenKind::If,
|
||||||
TokenKind::Let,
|
|
||||||
TokenKind::LBrack,
|
TokenKind::LBrack,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -606,7 +605,6 @@ fn prefix(p: &mut Parser) -> Closed {
|
||||||
TokenKind::LParen => paren(p),
|
TokenKind::LParen => paren(p),
|
||||||
TokenKind::Backslash => lambda(p),
|
TokenKind::Backslash => lambda(p),
|
||||||
TokenKind::If => if_expr(p),
|
TokenKind::If => if_expr(p),
|
||||||
TokenKind::Let => let_expr(p),
|
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
assert!(
|
assert!(
|
||||||
|
@ -637,7 +635,9 @@ fn infix(p: &mut Parser, op: TokenKind) -> NodeKind {
|
||||||
| TokenKind::LessEqual
|
| TokenKind::LessEqual
|
||||||
| TokenKind::Greater
|
| TokenKind::Greater
|
||||||
| TokenKind::GreaterEqual
|
| TokenKind::GreaterEqual
|
||||||
| TokenKind::Equal => infix_binary(p, op),
|
| TokenKind::Colon => infix_binary(p, op),
|
||||||
|
|
||||||
|
TokenKind::Equal => infix_let(p, op),
|
||||||
|
|
||||||
_ if PREFIX_TOKENS.contains(op) => infix_call(p),
|
_ if PREFIX_TOKENS.contains(op) => infix_call(p),
|
||||||
|
|
||||||
|
@ -666,6 +666,31 @@ fn infix_call(p: &mut Parser) -> NodeKind {
|
||||||
NodeKind::Call
|
NodeKind::Call
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn infix_let(p: &mut Parser, op: TokenKind) -> NodeKind {
|
||||||
|
p.advance();
|
||||||
|
|
||||||
|
if p.peek() == TokenKind::Newline {
|
||||||
|
p.advance();
|
||||||
|
}
|
||||||
|
|
||||||
|
precedence_parse(p, op);
|
||||||
|
|
||||||
|
if p.peek() == TokenKind::Newline {
|
||||||
|
p.advance();
|
||||||
|
} else {
|
||||||
|
let span = p.span();
|
||||||
|
p.emit(Diagnostic::error(
|
||||||
|
span,
|
||||||
|
"new line expected after variable definition `a = b`",
|
||||||
|
));
|
||||||
|
p.advance_with_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
expr(p);
|
||||||
|
|
||||||
|
NodeKind::Let
|
||||||
|
}
|
||||||
|
|
||||||
pub fn expr(p: &mut Parser) {
|
pub fn expr(p: &mut Parser) {
|
||||||
precedence_parse(p, TokenKind::Eof)
|
precedence_parse(p, TokenKind::Eof)
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,7 +316,7 @@ Binary @ 0..6
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_ast_eq(
|
assert_ast_eq(
|
||||||
"1 = 1",
|
"1 : 1",
|
||||||
expr,
|
expr,
|
||||||
"
|
"
|
||||||
Binary @ 0..5
|
Binary @ 0..5
|
||||||
|
@ -864,52 +864,49 @@ Toplevel @ 1..63
|
||||||
#[test]
|
#[test]
|
||||||
fn let_expr() {
|
fn let_expr() {
|
||||||
assert_ast_eq(
|
assert_ast_eq(
|
||||||
r#" let x = 1
|
r#" x = 1
|
||||||
x "#,
|
x "#,
|
||||||
toplevel,
|
toplevel,
|
||||||
"
|
"
|
||||||
Toplevel @ 1..24
|
Toplevel @ 1..20
|
||||||
Let @ 1..24
|
Let @ 1..20
|
||||||
Token @ 1..4
|
Ident @ 1..2
|
||||||
Ident @ 5..6
|
Token @ 1..2
|
||||||
|
Token @ 3..4
|
||||||
|
Number @ 5..6
|
||||||
Token @ 5..6
|
Token @ 5..6
|
||||||
Token @ 7..8
|
Token @ 6..7
|
||||||
Number @ 9..10
|
Ident @ 19..20
|
||||||
Token @ 9..10
|
Token @ 19..20",
|
||||||
Token @ 10..11
|
|
||||||
Ident @ 23..24
|
|
||||||
Token @ 23..24",
|
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_ast_eq(
|
assert_ast_eq(
|
||||||
r#" let x = 1
|
r#" x = 1
|
||||||
let y = 2
|
y = 2
|
||||||
x + y "#,
|
x + y "#,
|
||||||
toplevel,
|
toplevel,
|
||||||
"
|
"
|
||||||
Toplevel @ 1..50
|
Toplevel @ 1..42
|
||||||
Let @ 1..50
|
Let @ 1..42
|
||||||
Token @ 1..4
|
Ident @ 1..2
|
||||||
Ident @ 5..6
|
Token @ 1..2
|
||||||
|
Token @ 3..4
|
||||||
|
Number @ 5..6
|
||||||
Token @ 5..6
|
Token @ 5..6
|
||||||
Token @ 7..8
|
Token @ 6..7
|
||||||
Number @ 9..10
|
Let @ 19..42
|
||||||
Token @ 9..10
|
Ident @ 19..20
|
||||||
Token @ 10..11
|
Token @ 19..20
|
||||||
Let @ 23..50
|
Token @ 21..22
|
||||||
Token @ 23..26
|
Number @ 23..24
|
||||||
Ident @ 27..28
|
Token @ 23..24
|
||||||
Token @ 27..28
|
Token @ 24..25
|
||||||
Token @ 29..30
|
Binary @ 37..42
|
||||||
Number @ 31..32
|
Ident @ 37..38
|
||||||
Token @ 31..32
|
Token @ 37..38
|
||||||
Token @ 32..33
|
Op @ 39..40
|
||||||
Binary @ 45..50
|
Token @ 39..40
|
||||||
Ident @ 45..46
|
Ident @ 41..42
|
||||||
Token @ 45..46
|
Token @ 41..42",
|
||||||
Op @ 47..48
|
|
||||||
Token @ 47..48
|
|
||||||
Ident @ 49..50
|
|
||||||
Token @ 49..50",
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ pub enum TokenKind {
|
||||||
RBrack,
|
RBrack,
|
||||||
Comma,
|
Comma,
|
||||||
Equal,
|
Equal,
|
||||||
|
Colon,
|
||||||
Backslash,
|
Backslash,
|
||||||
RArrow,
|
RArrow,
|
||||||
|
|
||||||
|
@ -43,7 +44,6 @@ pub enum TokenKind {
|
||||||
Or,
|
Or,
|
||||||
If,
|
If,
|
||||||
Else,
|
Else,
|
||||||
Let,
|
|
||||||
|
|
||||||
// NOTE: This must be kept last for TokenSet to work correctly.
|
// NOTE: This must be kept last for TokenSet to work correctly.
|
||||||
Error,
|
Error,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue