rable 0.2.0

A Rust implementation of the Parable bash parser — complete GNU Bash 5.3-compatible parsing with Python bindings
Documentation
# Iteration 2: Simple commands - comprehensive edge cases

# === Basic commands ===

=== single word command
echo
---
(command (word "echo"))
---


=== command with one argument
echo hello
---
(command (word "echo") (word "hello"))
---


=== command with multiple arguments
echo hello world
---
(command (word "echo") (word "hello") (word "world"))
---


=== command with many arguments
echo a b c d e f g
---
(command (word "echo") (word "a") (word "b") (word "c") (word "d") (word "e") (word "f") (word "g"))
---


=== command with quoted argument
echo "hello world"
---
(command (word "echo") (word "\"hello world\""))
---


=== command with single quoted argument
echo 'hello world'
---
(command (word "echo") (word "'hello world'"))
---


=== command with mixed arguments
echo hello "beautiful world" goodbye
---
(command (word "echo") (word "hello") (word "\"beautiful world\"") (word "goodbye"))
---


# === Path commands ===

=== absolute path command
/usr/bin/ls
---
(command (word "/usr/bin/ls"))
---


=== absolute path with arguments
/usr/bin/ls -la /tmp
---
(command (word "/usr/bin/ls") (word "-la") (word "/tmp"))
---


=== relative path command
./script.sh
---
(command (word "./script.sh"))
---


=== relative path with arguments
./build.sh --release --target=x86
---
(command (word "./build.sh") (word "--release") (word "--target=x86"))
---


=== parent directory command
../bin/tool
---
(command (word "../bin/tool"))
---


# === Commands with flags ===

=== short flag
ls -l
---
(command (word "ls") (word "-l"))
---


=== combined short flags
ls -la
---
(command (word "ls") (word "-la"))
---


=== multiple short flags
tar -x -v -f archive.tar
---
(command (word "tar") (word "-x") (word "-v") (word "-f") (word "archive.tar"))
---


=== long flag
grep --color
---
(command (word "grep") (word "--color"))
---


=== long flag with value
grep --color=auto
---
(command (word "grep") (word "--color=auto"))
---


=== long flag with quoted value
docker run --name="my container"
---
(command (word "docker") (word "run") (word "--name=\"my container\""))
---


=== double dash separator
rm -- -file-starting-with-dash
---
(command (word "rm") (word "--") (word "-file-starting-with-dash"))
---


# === Commands with special arguments ===

=== glob pattern argument
ls *.txt
---
(command (word "ls") (word "*.txt"))
---


=== question mark glob
ls file?.txt
---
(command (word "ls") (word "file?.txt"))
---


=== bracket glob
ls file[0-9].txt
---
(command (word "ls") (word "file[0-9].txt"))
---


=== brace argument
echo {a,b,c}
---
(command (word "echo") (word "{a,b,c}"))
---


=== range brace
echo {1..10}
---
(command (word "echo") (word "{1..10}"))
---


=== tilde argument
cd ~
---
(command (word "cd") (word "~"))
---


=== tilde user
cd ~root
---
(command (word "cd") (word "~root"))
---


# === Special word combinations ===

=== argument with equals
grep pattern file=name
---
(command (word "grep") (word "pattern") (word "file=name"))
---


=== argument with colon
echo foo:bar:baz
---
(command (word "echo") (word "foo:bar:baz"))
---


=== argument starting with dash
echo -n hello
---
(command (word "echo") (word "-n") (word "hello"))
---


=== numeric argument
exit 1
---
(command (word "exit") (word "1"))
---


=== negative number argument
expr 5 - 3
---
(command (word "expr") (word "5") (word "-") (word "3"))
---


# === Edge cases from tree-sitter-bash ===

=== command name with special chars
echo {o[k]}
---
(command (word "echo") (word "{o[k]}"))
---


=== closing braces as argument
echo }}}
---
(command (word "echo") (word "}}}"))
---


=== closing brackets and equals
echo ]]] ===
---
(command (word "echo") (word "]]]") (word "==="))
---


=== words with colons like paths
echo foo::bar
---
(command (word "echo") (word "foo::bar"))
---