Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit4d70f508db318dfcea62668f21890f7db953ede1 (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-10-20 19:04:23 +0300
Committer
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-10-20 19:04:23 +0300
Filesd2ec76cd2fb2f9f34539aa8a51566dc42219b993
IPL-4d70f508db318dfcea62668f21890f7db953ede1.tar
IPL-4d70f508db318dfcea62668f21890f7db953ede1.tar.gz
IPL-4d70f508db318dfcea62668f21890f7db953ede1.zip
Parent35e4200d95d12030296f98acff463652904c052e (diff)
Fixed slides for parsing
1 files changed, 15 insertions, 19 deletions
-rw-r--r--website/content/slides/03_parsing/_index.md34
diff --git a/website/content/slides/03_parsing/_index.md b/website/content/slides/03_parsing/_index.md
index 8b55212..92d3433 100644
--- a/website/content/slides/03_parsing/_index.md
+++ b/website/content/slides/03_parsing/_index.md
@@ -15,6 +15,7 @@ outputs: ["Reveal"]
3. Visitor pattern
4. Hand-crafted parsers
+---
### Parser
> Recognizes the rules from stream of tokens and builds the Abstract Syntax Tree
@@ -34,11 +35,11 @@ Context Free Grammars are:
1. formal grammars - they describe all the strings in a formal language
2. context free - there is only one non-terminal on left hand side of each rule
- <expr> ::= <expr> <op> <expr> | (<expr>) | <term>
- <op> ::= + | - | * | /
- <term> ::= [0-9]+
+ <expr> ::= <expr> <op> <expr> | (<expr>) | <term>
+ <op> ::= + | - | * | /
+ <term> ::= [0-9]+
-> Does this grammar allow for operator precedence?
+> Does this grammar allow for operator precedence? (No, more later)
---
##### Terminals and Non-terminals
@@ -78,10 +79,10 @@ specifications for EBNF, but they have the same power, just different syntax.
- https://www.w3.org/TR/REC-xml/#sec-notation
- expr = expr , op , expr | "(" , expr , ")" | term
- op = "+" | "-" | "*" | "/"
- term = { digit }
- digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
+ expr = expr , op , expr | "(" , expr , ")" | term
+ op = "+" | "-" | "*" | "/"
+ term = { digit }
+ digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
---
@@ -375,7 +376,7 @@ Where `XXX` is a token (aka *terminal*).
AST parse_sum() {
AST left = parse_prod();
auto token = next_token();
- while (token != '+' || token != '-') {
+ while (token == '+' || token == '-') {
AST right = parse_prod();
left = make_op(token, left, right);
}
@@ -390,7 +391,7 @@ Where `XXX` is a token (aka *terminal*).
AST parse_prod() {
AST left = parse_value();
auto token = next_token();
- while (token != '*' || token != '/') {
+ while (token == '*' || token == '/') {
AST right = parse_value();
left = make_op(token, left, right);
}
@@ -452,15 +453,10 @@ Where `XXX` is a token (aka *terminal*).
---
void handle_token(token, output, operators) {
- switch (token) {
- case NUMBER:
- output.push(make_number(token));
- break;
- case OPERATOR:
- case ')':
- case '(':
- handle_operator(token, output, operators);
- break;
+ if (token == NUMBER) {
+ output.push(make_number(token));
+ } else {
+ handle_operator(token, output, operators);
}
}