diff options
| Commit | 4d70f508db318dfcea62668f21890f7db953ede1 (patch) | |
|---|---|---|
| Author | 2018-10-20 19:04:23 +0300 | |
| Committer | 2018-10-20 19:04:23 +0300 | |
| Files | d2ec76cd2fb2f9f34539aa8a51566dc42219b993 | |
| IPL-4d70f508db318dfcea62668f21890f7db953ede1.tar IPL-4d70f508db318dfcea62668f21890f7db953ede1.tar.gz IPL-4d70f508db318dfcea62668f21890f7db953ede1.zip | ||
| Parent | 35e4200d95d12030296f98acff463652904c052e (diff) | |
Fixed slides for parsing
1 files changed, 15 insertions, 19 deletions
| -rw-r--r-- | website/content/slides/03_parsing/_index.md | 34 |
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); } } |
