Extends documentation
This commit is contained in:
parent
6e151be2b1
commit
97c3e05856
145
README.md
145
README.md
@ -5,8 +5,151 @@ The base of language; a language designed to be just a compiler for other langua
|
|||||||
|
|
||||||
And you probably won't write _your_ custom language in lang0, but in a system language built in lang0.
|
And you probably won't write _your_ custom language in lang0, but in a system language built in lang0.
|
||||||
|
|
||||||
|
The language
|
||||||
|
---
|
||||||
|
|
||||||
|
lang0 is designed for building small compilers. As such, it has a number of primitives specific for that.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
See `example0.lang0`:
|
||||||
|
```
|
||||||
|
main:
|
||||||
|
declare char
|
||||||
|
declare isa
|
||||||
|
declare isnota
|
||||||
|
calc char peek
|
||||||
|
calc isa eq char "a"
|
||||||
|
calc isnota not isa
|
||||||
|
if isa
|
||||||
|
emit "Got a"
|
||||||
|
emit eol
|
||||||
|
/
|
||||||
|
if isnota
|
||||||
|
emit "Did not get a"
|
||||||
|
emit eol
|
||||||
|
/
|
||||||
|
return
|
||||||
|
/
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make it2
|
||||||
|
cat example0.lang0 | ./it2-out > example0.c
|
||||||
|
gcc example0.c -o example0
|
||||||
|
echo 'a' | ./example0
|
||||||
|
# Got a
|
||||||
|
echo 'b' | ./example0
|
||||||
|
# Did not get a
|
||||||
|
```
|
||||||
|
|
||||||
|
### Formatting
|
||||||
|
|
||||||
|
Indentation is done using tabs.
|
||||||
|
|
||||||
|
### Parsing
|
||||||
|
|
||||||
|
### Variables
|
||||||
|
|
||||||
|
#### calc var func args*
|
||||||
|
|
||||||
|
Calls func with args and stores the output in var.
|
||||||
|
|
||||||
|
#### declare var
|
||||||
|
|
||||||
|
Pre-declares var.
|
||||||
|
|
||||||
|
#### set var "const"
|
||||||
|
|
||||||
|
Sets var to "const".
|
||||||
|
|
||||||
|
### Flow control
|
||||||
|
|
||||||
|
#### break
|
||||||
|
|
||||||
|
Exits the deepest `forever` loop.
|
||||||
|
|
||||||
|
#### if arg
|
||||||
|
|
||||||
|
Evaluates arg. If found to be true, descends in the block. Otherwise, skips the block
|
||||||
|
|
||||||
|
#### forever
|
||||||
|
|
||||||
|
Repeats the block until `break` or `return` is called.
|
||||||
|
|
||||||
|
#### return var?
|
||||||
|
|
||||||
|
Returns the given value. You can not give an argument if your function is never used in `call`.
|
||||||
|
|
||||||
|
#### func args*
|
||||||
|
|
||||||
|
Calls the given function with the given arguments. The result, if any, is ignored.
|
||||||
|
|
||||||
|
### Builtins
|
||||||
|
|
||||||
|
#### emit arg
|
||||||
|
|
||||||
|
Writes the given string to standard output.
|
||||||
|
|
||||||
|
? Does this need to be a builtin ?
|
||||||
|
|
||||||
|
#### skipchar
|
||||||
|
|
||||||
|
? Does this need to be a builtin ?
|
||||||
|
|
||||||
|
#### trace
|
||||||
|
|
||||||
|
? Does this need to be a builtin ?
|
||||||
|
|
||||||
|
#### Standard library functions
|
||||||
|
|
||||||
|
#### eq a b
|
||||||
|
|
||||||
|
Return true if the given strings are the same.
|
||||||
|
|
||||||
|
#### lt a b
|
||||||
|
|
||||||
|
Return true if a would sort before b.
|
||||||
|
|
||||||
|
#### addstringchar a b
|
||||||
|
|
||||||
|
b is expected to have length 1.
|
||||||
|
|
||||||
|
Creates a new string with b appended to a.
|
||||||
|
|
||||||
|
#### peek
|
||||||
|
|
||||||
|
Checks stdin for the next character and returns it.
|
||||||
|
|
||||||
|
#### skip
|
||||||
|
|
||||||
|
Advances stdin a single character.
|
||||||
|
|
||||||
|
### Typing
|
||||||
|
|
||||||
|
Every variable is of type string. Every function gets a number of strings as output, and returns another string.
|
||||||
|
The `if` statement accept all non-empty strings as true, and the empty string as false.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
---
|
||||||
|
|
||||||
|
You can declare variables and functions ahead of time. This is necessary for some interpreters.
|
||||||
|
|
||||||
|
Bootstrap stairs
|
||||||
|
---
|
||||||
|
|
||||||
|
The first iteration is written by hand, both the compiler and the compiler compiler.
|
||||||
|
It targets python3 as an interpreter.
|
||||||
|
|
||||||
|
The second version only has the compile written by hand, with the compiler compiler being the output of iteration 1.
|
||||||
|
It targets gcc as interpreter.
|
||||||
|
|
||||||
|
We compile every iteration 3 times, to ensure that the the compiler round trips properly.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
How to run
|
How to run
|
||||||
===
|
---
|
||||||
|
|
||||||
Install python3 and make
|
Install python3 and make
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user