Various additions and improvements

This commit is contained in:
2025-03-15 21:04:45 -04:00
parent ecfef2274f
commit 98739ba63a
31 changed files with 1421 additions and 341 deletions

View File

@@ -34,3 +34,11 @@ fn lex_with_keywords() {
insta::assert_debug_snapshot!(tokens)
}
#[test]
fn lex_multiline() {
let input = "echo hello world\necho foo bar\necho boo biz";
let tokens: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
insta::assert_debug_snapshot!(tokens)
}

View File

@@ -35,3 +35,15 @@ fn parse_conjunction_and_pipeline() {
insta::assert_debug_snapshot!(nodes)
}
#[test]
fn parse_multiline() {
let input = "
echo hello world
echo foo bar
echo boo biz";
let tk_stream: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
let nodes: Vec<_> = ParseStream::new(tk_stream).collect();
insta::assert_debug_snapshot!(nodes)
}

View File

@@ -0,0 +1,162 @@
---
source: src/tests/lexer.rs
expression: tokens
---
[
Tk {
class: SOI,
err_span: None,
err: Null,
span: Span {
range: 0..0,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..10,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..16,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 16..17,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 17..21,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 22..25,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 26..29,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 29..30,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 30..34,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 35..38,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 39..42,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: EOI,
err_span: None,
err: Null,
span: Span {
range: 42..42,
source: "echo hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
]

View File

@@ -24,7 +24,7 @@ expression: tokens
source: "echo \"foo bar\" biz baz",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -24,7 +24,7 @@ expression: tokens
source: "echo foo > bar.txt",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -24,7 +24,7 @@ expression: tokens
source: "echo foo 1>&2",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -24,7 +24,7 @@ expression: tokens
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -72,7 +72,7 @@ expression: tokens
source: "if true; then echo foo; fi",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -24,7 +24,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -55,7 +55,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -89,7 +89,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -125,7 +125,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -156,7 +156,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -190,7 +190,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -225,7 +225,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -261,7 +261,7 @@ expression: nodes
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -24,7 +24,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -55,7 +55,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -150,7 +150,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -222,7 +222,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -253,7 +253,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -348,7 +348,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -420,7 +420,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -463,7 +463,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -618,7 +618,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -725,7 +725,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -797,7 +797,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -869,7 +869,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -0,0 +1,639 @@
---
source: src/tests/parser.rs
expression: nodes
---
[
Ok(
Node {
class: CmdList {
elements: [
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 1..5,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 6..11,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..17,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 1..5,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 6..11,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..17,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 17..18,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 1..5,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 6..11,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..17,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 17..18,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Null,
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 1..5,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 6..11,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..17,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 17..18,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
),
Ok(
Node {
class: CmdList {
elements: [
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 18..22,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 23..26,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 27..30,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 18..22,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 23..26,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 27..30,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 30..31,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 18..22,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 23..26,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 27..30,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 30..31,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Null,
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 18..22,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 23..26,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 27..30,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 30..31,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
),
Ok(
Node {
class: CmdList {
elements: [
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 31..35,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 36..39,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 40..43,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 31..35,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 36..39,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 40..43,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 31..35,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 36..39,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 40..43,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Null,
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 31..35,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
IS_CMD | BUILTIN,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 36..39,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 40..43,
source: "\necho hello world\necho foo bar\necho boo biz",
},
flags: TkFlags(
0x0,
),
},
],
},
),
]

View File

@@ -24,7 +24,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -55,7 +55,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -150,7 +150,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -221,7 +221,7 @@ expression: nodes
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {

View File

@@ -24,7 +24,7 @@ expression: nodes
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -67,7 +67,7 @@ expression: nodes
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -113,7 +113,7 @@ expression: nodes
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {
@@ -160,7 +160,7 @@ expression: nodes
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
IS_CMD | BUILTIN,
),
},
Tk {