From 13c81ed05d1d1e88e3928bbd77c436364527ba21 Mon Sep 17 00:00:00 2001 From: Simon From Jakobsen Date: Thu, 22 Aug 2024 13:16:57 +0000 Subject: [PATCH] chapter 2 kinda sucked --- compiler/chapter_2.md | 220 ------------------------------------------ 1 file changed, 220 deletions(-) delete mode 100644 compiler/chapter_2.md diff --git a/compiler/chapter_2.md b/compiler/chapter_2.md deleted file mode 100644 index 912082b..0000000 --- a/compiler/chapter_2.md +++ /dev/null @@ -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:? ";" -``` -