chapter 2 kinda sucked
This commit is contained in:
parent
44aae17334
commit
13c81ed05d
@ -1,220 +0,0 @@
|
|||||||
|
|
||||||
## 2 Specifying a language
|
|
||||||
|
|
||||||
**You can skip this chapter and come back to it, if you need.**
|
|
||||||
|
|
||||||
The language will at first consist of these features.
|
|
||||||
|
|
||||||
- Literals
|
|
||||||
- Expressions
|
|
||||||
- Variables
|
|
||||||
- Blocks
|
|
||||||
- If-conditions
|
|
||||||
- Loops
|
|
||||||
- Function calls
|
|
||||||
- Function definitions
|
|
||||||
|
|
||||||
## 2.1 Literals
|
|
||||||
|
|
||||||
Integers (ints) are numbers without decimal point.
|
|
||||||
|
|
||||||
Strings are text enclosed in double-quotes `" "`. Backslash `\` can be used to escape `"` and invoke specialt characters `\n` and `\t` for newline and tab characters.
|
|
||||||
|
|
||||||
Booleans (bools) represent logical true and false and are the symbols `true` and `false`.
|
|
||||||
|
|
||||||
Null represents a non-value (null value) and is the symbol `null`.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
0
|
|
||||||
123
|
|
||||||
"hello"
|
|
||||||
"{ \"key\": 123 }"
|
|
||||||
true
|
|
||||||
false
|
|
||||||
null
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2.2 Expressions
|
|
||||||
|
|
||||||
I'll be reusing the prefix notation expressions from chapter 1. These are also called S-expressions.
|
|
||||||
|
|
||||||
I'll be using logical expressions (`or`, `and` and `not`), comparison expressions (`==`, `!=`, `<` and `>`), arithmetic expressions (`+`, `-`, `*`, `/`) and group expressions (`(...)`).
|
|
||||||
|
|
||||||
The grammer, meaning the rules for the structure of the code, is the following:
|
|
||||||
```
|
|
||||||
expr ->
|
|
||||||
...
|
|
||||||
| "or" expr expr
|
|
||||||
| "and" expr expr
|
|
||||||
| "not" expr
|
|
||||||
| "==" expr expr
|
|
||||||
| "!=" expr expr
|
|
||||||
| "<" expr expr
|
|
||||||
| ">" expr expr
|
|
||||||
| "+" expr expr
|
|
||||||
| "-" expr expr
|
|
||||||
| "*" expr expr
|
|
||||||
| "/" expr expr
|
|
||||||
| "(" expr ")"
|
|
||||||
...
|
|
||||||
| literal
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice `not` only has 1 operand.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
+ 1 * 2 3
|
|
||||||
|
|
||||||
+ + + 1 2 3 4
|
|
||||||
|
|
||||||
* 3 (* 3 3)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2.3 Variables
|
|
||||||
|
|
||||||
A variable is a storage container for a value.
|
|
||||||
|
|
||||||
A variable is defined using a `let`-statement. A variable is used by refering to its name. A variable can be reassigned after definition.
|
|
||||||
|
|
||||||
Variables are block-scoped, more on this later.
|
|
||||||
|
|
||||||
Grammar:
|
|
||||||
```
|
|
||||||
let -> "let" ident "=" expr ";"
|
|
||||||
|
|
||||||
assign -> ident "=" expr ";"
|
|
||||||
|
|
||||||
expr ->
|
|
||||||
...
|
|
||||||
| ident
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
let a = 5;
|
|
||||||
|
|
||||||
a = 10;
|
|
||||||
|
|
||||||
+ a 10
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2.4 Blocks
|
|
||||||
|
|
||||||
A block is code enclosed in curly-braces (`{` and `}`). They can be used as both statements and expressions. Single-line statements in a block need semicolon (`;`) at the end. Expressions can be used as statements.
|
|
||||||
|
|
||||||
If the last entry in a block is an expression and the semicolon is omitted, the block as a whole yields that value.
|
|
||||||
|
|
||||||
Grammar:
|
|
||||||
```
|
|
||||||
block -> "{" statements expr:? "}"
|
|
||||||
|
|
||||||
expr ->
|
|
||||||
...
|
|
||||||
| block
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
{}
|
|
||||||
|
|
||||||
{
|
|
||||||
let a = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
let a = {
|
|
||||||
let b = 5;
|
|
||||||
+ b 5
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2.5 If-statements
|
|
||||||
|
|
||||||
An `if`-statement has a condition and a block it runs, if the condition evaluates to `true` ("truthy"), and an optional `else`-block, if it the condition evaluates to `false`.
|
|
||||||
|
|
||||||
Grammar:
|
|
||||||
```
|
|
||||||
if -> "if" expr block ("else" block):?
|
|
||||||
|
|
||||||
expr ->
|
|
||||||
...
|
|
||||||
| if
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
I've added `if` to `expr`, because, in addition to a statement, I want to be able to use `if` as an expression just like blocks.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
let a = 5;
|
|
||||||
if == b 5 {
|
|
||||||
a = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
let value = if > a b { c } else { d };
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2.6 Loops
|
|
||||||
|
|
||||||
`loop`-statements are blocks that run continually (from top to bottom, then from the top again) until a `break`-statement is evaluated.
|
|
||||||
|
|
||||||
Loops can also be expressions, as a value can be supplied when breaking.
|
|
||||||
|
|
||||||
Grammar:
|
|
||||||
```
|
|
||||||
loop -> "loop" block
|
|
||||||
|
|
||||||
break -> "break" expr:? ";"
|
|
||||||
|
|
||||||
expr ->
|
|
||||||
...
|
|
||||||
| loop
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
let i = 0;
|
|
||||||
let v = 1;
|
|
||||||
loop {
|
|
||||||
if not < i 10 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
v = * v 2;
|
|
||||||
i = + i 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
let v = loop {
|
|
||||||
break 5;
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2.7 Function calls
|
|
||||||
|
|
||||||
Grammar:
|
|
||||||
```
|
|
||||||
expr ->
|
|
||||||
...
|
|
||||||
| expr "(" args ")"
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
let a = pow(2, 3);
|
|
||||||
|
|
||||||
exit();
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2.8 Function definition
|
|
||||||
|
|
||||||
Grammar:
|
|
||||||
```
|
|
||||||
fn -> "fn" ident "(" params ")" block
|
|
||||||
|
|
||||||
return -> "return" expr:? ";"
|
|
||||||
```
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user