|
|
@@ -28,78 +28,86 @@
|
|
|
|
|
|
- **Literals**. Numbers,strings,Booleans, and nil
|
|
|
- **Unary expressions.** A prefix ! to perform a logical not, and - to negate a number.
|
|
|
-- **Binary expressions.** The infix arithmetic(+,-,*,/) and logic operators (==, !=, <, <=,>,>=)
|
|
|
- - **Parentheses.** A pair of ( and ) wrapped around and expression.
|
|
|
+ - **Binary expressions.** The infix arithmetic(+,-,*,/) and logic operators (==, !=, <, <=,>,>=)
|
|
|
+ - **Parentheses.** A pair of ( and ) wrapped around and expression.
|
|
|
|
|
|
- - Syntax tree - Expression
|
|
|
+ - Syntax tree - Expression
|
|
|
|
|
|
- ```
|
|
|
- expression → literal
|
|
|
- | unary
|
|
|
- | binary
|
|
|
- | grouping ;
|
|
|
+ ```
|
|
|
+ expression → literal
|
|
|
+ | unary
|
|
|
+ | binary
|
|
|
+ | grouping ;
|
|
|
|
|
|
- literal → NUMBER | STRING | "true" | "false" | "nil" ;
|
|
|
- grouping → "(" expression ")" ;
|
|
|
- unary → ( "-" | "!" ) expression ;
|
|
|
- binary → expression operator expression ;
|
|
|
- operator → "==" | "!=" | "<" | "<=" | ">" | ">="
|
|
|
- | "+" | "-" | "*" | "/" ;
|
|
|
+ literal → NUMBER | STRING | "true" | "false" | "nil" ;
|
|
|
+ grouping → "(" expression ")" ;
|
|
|
+ unary → ( "-" | "!" ) expression ;
|
|
|
+ binary → expression operator expression ;
|
|
|
+ operator → "==" | "!=" | "<" | "<=" | ">" | ">="
|
|
|
+ | "+" | "-" | "*" | "/" ;
|
|
|
|
|
|
- ```
|
|
|
+ ```
|
|
|
|
|
|
- | Name | Operators | Associates |
|
|
|
- |------------|-----------|------------|
|
|
|
- | Equality | == != | Left |
|
|
|
- | Comparison | > >= < <= | Left |
|
|
|
- | Term | - + | Left |
|
|
|
- | Factor | / * | Left |
|
|
|
- | Unary | ! - | Right |
|
|
|
+ | Name | Operators | Associates |
|
|
|
+ |------------|-----------|------------|
|
|
|
+ | Equality | == != | Left |
|
|
|
+ | Comparison | > >= < <= | Left |
|
|
|
+ | Term | - + | Left |
|
|
|
+ | Factor | / * | Left |
|
|
|
+ | Unary | ! - | Right |
|
|
|
|
|
|
- ```
|
|
|
- expression → equality ;
|
|
|
- equality → comparison ( ( "!=" | "==" ) comparison )* ;
|
|
|
- comparison → term ( ( ">" | ">=" | "<" | "<=" ) term )* ;
|
|
|
- term → factor ( ( "-" | "+" ) factor )* ;
|
|
|
- factor → unary ( ( "/" | "*" ) unary )* ;
|
|
|
- unary → ( "!" | "-" ) unary
|
|
|
- | primary ;
|
|
|
- primary → NUMBER | STRING | "true" | "false" | "nil"
|
|
|
- | "(" expression ")" | IDENTIFIER ;
|
|
|
- ```
|
|
|
+ ```
|
|
|
+ expression → equality ;
|
|
|
+ equality → comparison ( ( "!=" | "==" ) comparison )* ;
|
|
|
+ comparison → term ( ( ">" | ">=" | "<" | "<=" ) term )* ;
|
|
|
+ term → factor ( ( "-" | "+" ) factor )* ;
|
|
|
+ factor → unary ( ( "/" | "*" ) unary )* ;
|
|
|
+ unary → ( "!" | "-" ) unary
|
|
|
+ | primary ;
|
|
|
+ primary → NUMBER | STRING | "true" | "false" | "nil"
|
|
|
+ | "(" expression ")" | IDENTIFIER ;
|
|
|
+ ```
|
|
|
|
|
|
- - Syntax tree - Statement
|
|
|
+ - Syntax tree - Statement
|
|
|
|
|
|
- ```
|
|
|
- program → statement* EOF ;
|
|
|
+ ```
|
|
|
+ program → statement* EOF ;
|
|
|
|
|
|
- statement → exprStmt
|
|
|
- | printStmt
|
|
|
- | block;
|
|
|
+ statement → exprStmt
|
|
|
+ | printStmt
|
|
|
+ | block;
|
|
|
|
|
|
- block → "{" declaration* "}"
|
|
|
+ block → "{" declaration* "}"
|
|
|
|
|
|
- exprStmt → expression ";" ;
|
|
|
- printStmt → "print" expression ";" ;
|
|
|
- ```
|
|
|
+ exprStmt → expression ";" ;
|
|
|
+ printStmt → "print" expression ";" ;
|
|
|
+ ```
|
|
|
|
|
|
- A program is a list of statements followed by the special "end of file" token.
|
|
|
- The mandatory end token ensures the parse consumes the entire input and don't
|
|
|
- silently ignore erroneous unconsumed tokens at the end of a script.
|
|
|
- - Syntax tree - add Variable syntax
|
|
|
- ```
|
|
|
- program → declaration* EOF ;
|
|
|
+ A program is a list of statements followed by the special "end of file" token.
|
|
|
+ The mandatory end token ensures the parse consumes the entire input and don't
|
|
|
+ silently ignore erroneous unconsumed tokens at the end of a script.
|
|
|
+ - Syntax tree - add Variable syntax
|
|
|
+ ```
|
|
|
+ program → declaration* EOF ;
|
|
|
|
|
|
- declaration → varDecl
|
|
|
- | statement ;
|
|
|
+ declaration → varDecl
|
|
|
+ | statement ;
|
|
|
|
|
|
- statement → exprStmt
|
|
|
- | ifStmt
|
|
|
- | printStmt
|
|
|
- | block;
|
|
|
+ statement → exprStmt
|
|
|
+ | ifStmt
|
|
|
+ | printStmt
|
|
|
+ | block;
|
|
|
|
|
|
- block → "{" declaration* "}"
|
|
|
- ifStmt → "if" "(" expression ")" statement ( "else" statement)? ;
|
|
|
+ block → "{" declaration* "}"
|
|
|
+ ifStmt → "if" "(" expression ")" statement ( "else" statement)? ;
|
|
|
|
|
|
- varDecl → "var" IDENTIFIER ( "=" expression )? ";" ;
|
|
|
- ```
|
|
|
+ varDecl → "var" IDENTIFIER ( "=" expression )? ";" ;
|
|
|
+ ```
|
|
|
+ - Syntax tree -- Logical Operators
|
|
|
+ ```
|
|
|
+ expression → assignment ;
|
|
|
+ assignment → IDENTIFIER "=" assignment
|
|
|
+ | logic_or ;
|
|
|
+ logic_or → logic_and ( "or" logic_and )* ;
|
|
|
+ logic_and → equality ( "and" equality )* ;
|
|
|
+ ```
|