Go to file
Corey Johnson a33f6cd191 fix(parser): clear pendingIdentifiers after FunctionCall to prevent test state leakage
The scope tracker uses module-level state (pendingIdentifiers) that was not being
cleared after FunctionCall reductions, causing identifier state to leak between
tests. This caused the test 'readme.txt is Word when used in function' to break
the following test by leaving 'echo' in pendingIdentifiers.

- Add FunctionCall to the list of terms that clear pendingIdentifiers
- Un-skip the previously failing test 'readme.txt is Word when used in function'

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 10:44:14 -07:00
packages refactor(parser): rename PropertyAccess to DotGet 2025-10-16 18:10:21 -07:00
src fix(parser): clear pendingIdentifiers after FunctionCall to prevent test state leakage 2025-10-17 10:44:14 -07:00
.gitignore wip 2025-10-14 16:12:17 -07:00
.gitmodules yessss 2025-10-08 13:56:17 -07:00
bun.lock yessss 2025-10-08 13:56:17 -07:00
bunfig.toml emoji 2025-09-29 11:40:32 -07:00
CLAUDE.md wip 2025-10-15 16:18:18 -07:00
example.shrimp works better 2025-10-08 17:30:30 -07:00
package.json works better 2025-10-08 17:30:30 -07:00
README.md works better 2025-10-08 17:30:30 -07:00
today.md wip 2025-10-14 16:12:17 -07:00
tsconfig.json works better 2025-10-08 17:30:30 -07:00

Shrimp Language

Overview

Shrimp is a shell-like scripting language that combines the simplicity of command-line interfaces with functional programming concepts. Built using Lezer (CodeMirror's parser system) with TypeScript.

Use it

Go to http://localhost:3000 to try out the playground.

echo "Hello, world!"
tail log.txt lines=50

name = "Shrimp"
greet = fn person: echo "Hello" person

result = tail log.txt lines=10

Language Design Philosophy

  • Shell-like command syntax - echo hello world works naturally
  • Everything is an expression - Commands, assignments, and functions all return values
  • Whitespace matters in binary operations - Spaces distinguish operators from identifiers (e.g., x-1 is an identifier, x - 1 is subtraction)
  • Unbound symbols become strings - echo hello treats hello as a string if not defined
  • Simplicity over cleverness - Each feature should work one way, consistently. Two simple features that are easy to explain beat one complex feature that requires lots of explanation

Parser Features

  • Distinguishes identifiers from words to enable shell-like syntax - paths like ./file.txt work without quotes
  • Smart tokenization for named args (lines=30 splits, but ./path=value stays together)
  • Handles ambiguous cases (bare identifier could be function call or variable reference)

Architecture

parser/ - Lezer grammar and tokenizers that parse Shrimp code into syntax trees editor/ - CodeMirror integration with syntax highlighting and language support
compiler/ - Transforms syntax trees into ReefVM bytecode for execution

The flow: Shrimp source → parser (CST) → compiler (bytecode) → ReefVM (execution)

See example.shrimp for language examples and src/parser/shrimp.grammar for the full grammar.