The Easy Student Language — a tiny hand-built programming language written from scratch in C. Lexer, parser, interpreter. Compiled to a single standalone binary. No frameworks. No Python. No magic.
/// the classic. every language needs one. statuses start make count 5 make name "bob" rule count>0 return value alive if alive { out "still going" } loop rule count>0 status yes { out count make count count - 1 } out name out "done" statuses end
A complete programming language toolchain. ~1,200 lines of C. Zero dependencies. It actually runs.
Turns raw text into tokens: numbers, strings, names, operators.
Turns tokens into a tree. Enforces every rule with a named error.
Walks the tree and runs it: variables, math, branches, loops.
One way to do everything. No aliases. No shortcuts. No synonyms.
make is the only assignment keyword. Declare and overwrite use the same word.
No optional braces. No indentation rules. If there's a block, it has { }.
Ghost Variable. Type Clash. Code Leak, No Status End. No cryptic compiler goop.
Three types — number, string, bool (yes / no). That's it.
| YOU WRITE | IT DOES |
|---|---|
statuses start … statuses end | Wraps every program. Missing the end → Code Leak, No Status End. |
make x 5 | Declare or overwrite. Works for numbers, strings, bools. |
make name "bob" | Strings are real values. Stored, printed, passed around. |
make flag yes | Booleans are yes / no. Not true/false. |
out x · out "hi" | Print a variable or a literal string. |
rule a>b return value c | Compare, store yes/no in c. Comparators: < > = !! |
if c { … } | Run the block once if c is yes. |
loop rule a>b status yes { … } | Repeat while comparison matches yes (or no). Re-checked each pass. |
+ - * / % ( ) | Integer math with normal precedence. / is integer division. |
/// | Comment to end of line. |
/// every failure has a name Statuses Error: Ghost Variable (line 2) Statuses Error: Type Clash (line 4) Statuses Error: Divide By Zero (line 4) Statuses Error: Code Leak, No Status End
One binary. No runtime, no package manager, no dependencies.
statuses tokens f.stat — dump tokens
statuses ast f.stat — dump the tree
statuses run f.stat — interpret
statuses build f.stat — compile (coming soon)
Needs only cc. Clone the repo, run make, you've got the same binary — compiled from the C sources on your own machine.
Writing a language is the fastest way to understand pointers, memory, and how text becomes running code. This is a study project that happens to work.