Skip to content

Commit

Permalink
fix: examples precedence
Browse files Browse the repository at this point in the history
  • Loading branch information
kamadorueda committed May 14, 2022
1 parent 264bf39 commit 1b85ae6
Show file tree
Hide file tree
Showing 9 changed files with 302 additions and 342 deletions.
2 changes: 1 addition & 1 deletion examples/calculator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ fn main() -> Result<(), ()> {
let ast = parse_tree.as_abstract_syntax_tree();

println!("Abstract Syntax Tree:");
println!("{ast:?}");
println!("{ast:#?}");

println!("Evaluated:");
println!("{}", eval(&ast));
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
//! It provides you:
//! - A library for defining any
//! [context-free grammar](https://en.wikipedia.org/wiki/Context-free_grammar),
//! - A [Lexical analysis](https://en.wikipedia.org/wiki/Lexical_analysis) module,
//! - A [Lexical analysis](https://en.wikipedia.org/wiki/Lexical_analysis)
//! module,
//! - And facilities for building interpreters or compilers of the language.
//!
//! With Santiago you have everything that is needed
Expand Down Expand Up @@ -444,7 +445,7 @@
//!
//! let ast = parse_tree.as_abstract_syntax_tree();
//!
//! assert_eq!(eval(&ast), -6);
//! assert_eq!(eval(&ast), -5);
//! ```
//!
//! ## JavaScript string interpolations
Expand Down Expand Up @@ -562,8 +563,7 @@
//! # Next steps
//!
//! This tutorial ends here,
//! you should now have everything to lex,
//! parse, and as_abstract_syntax_tree the world,
//! you should now have everything to lex and parse the world,
//! and build your own programming languages, compilers and interpreters!
//!
//! You can checkout more examples in the tests folder:
Expand Down
245 changes: 115 additions & 130 deletions tests/calculator/cases/example/earley
Original file line number Diff line number Diff line change
@@ -1,173 +1,158 @@
0
"Γ" := rules • "expr" [0-0]
"expr" := rules • "bin_op" [0-0]
"expr" := rules • "int" [0-0]
"bin_op" := rules • "expr" "add" "expr" [0-0]
"bin_op" := rules • "expr" "subtract" "expr" [0-0]
"bin_op" := rules • "expr" "multiply" "expr" [0-0]
"bin_op" := rules • "expr" "divide" "expr" [0-0]
"expr" := rules • "expr" "add" "expr" [0-0]
"expr" := rules • "expr" "subtract" "expr" [0-0]
"expr" := rules • "expr" "multiply" "expr" [0-0]
"expr" := rules • "expr" "divide" "expr" [0-0]
"int" := lexemes • "INT" [0-0]
1
"int" := lexemes "INT" • [0-1]
"expr" := rules "int" • [0-1]
"Γ" := rules "expr" • [0-1]
"bin_op" := rules "expr" • "add" "expr" [0-1]
"bin_op" := rules "expr" • "subtract" "expr" [0-1]
"bin_op" := rules "expr" • "multiply" "expr" [0-1]
"bin_op" := rules "expr" • "divide" "expr" [0-1]
"expr" := rules "expr" • "add" "expr" [0-1]
"expr" := rules "expr" • "subtract" "expr" [0-1]
"expr" := rules "expr" • "multiply" "expr" [0-1]
"expr" := rules "expr" • "divide" "expr" [0-1]
"add" := lexemes • "+" [1-1]
2
"add" := lexemes "+" • [1-2]
"bin_op" := rules "expr" "add" • "expr" [0-2]
"expr" := rules • "bin_op" [2-2]
"expr" := rules "expr" "add" • "expr" [0-2]
"expr" := rules • "int" [2-2]
"bin_op" := rules • "expr" "add" "expr" [2-2]
"bin_op" := rules • "expr" "subtract" "expr" [2-2]
"bin_op" := rules • "expr" "multiply" "expr" [2-2]
"bin_op" := rules • "expr" "divide" "expr" [2-2]
"expr" := rules • "expr" "add" "expr" [2-2]
"expr" := rules • "expr" "subtract" "expr" [2-2]
"expr" := rules • "expr" "multiply" "expr" [2-2]
"expr" := rules • "expr" "divide" "expr" [2-2]
"int" := lexemes • "INT" [2-2]
3
"int" := lexemes "INT" • [2-3]
"expr" := rules "int" • [2-3]
"bin_op" := rules "expr" "add" "expr" • [0-3]
"bin_op" := rules "expr" • "add" "expr" [2-3]
"bin_op" := rules "expr" • "subtract" "expr" [2-3]
"bin_op" := rules "expr" • "multiply" "expr" [2-3]
"bin_op" := rules "expr" • "divide" "expr" [2-3]
"expr" := rules "bin_op" • [0-3]
"multiply" := lexemes • "*" [3-3]
"expr" := rules "expr" "add" "expr" • [0-3]
"expr" := rules "expr" • "add" "expr" [2-3]
"expr" := rules "expr" • "subtract" "expr" [2-3]
"expr" := rules "expr" • "multiply" "expr" [2-3]
"expr" := rules "expr" • "divide" "expr" [2-3]
"Γ" := rules "expr" • [0-3]
"bin_op" := rules "expr" • "add" "expr" [0-3]
"bin_op" := rules "expr" • "subtract" "expr" [0-3]
"bin_op" := rules "expr" • "multiply" "expr" [0-3]
"bin_op" := rules "expr" • "divide" "expr" [0-3]
"expr" := rules "expr" • "add" "expr" [0-3]
"expr" := rules "expr" • "subtract" "expr" [0-3]
"expr" := rules "expr" • "multiply" "expr" [0-3]
"expr" := rules "expr" • "divide" "expr" [0-3]
"multiply" := lexemes • "*" [3-3]
4
"multiply" := lexemes "*" • [3-4]
"bin_op" := rules "expr" "multiply" • "expr" [2-4]
"bin_op" := rules "expr" "multiply" • "expr" [0-4]
"expr" := rules • "bin_op" [4-4]
"expr" := rules "expr" "multiply" • "expr" [2-4]
"expr" := rules "expr" "multiply" • "expr" [0-4]
"expr" := rules • "int" [4-4]
"bin_op" := rules • "expr" "add" "expr" [4-4]
"bin_op" := rules • "expr" "subtract" "expr" [4-4]
"bin_op" := rules • "expr" "multiply" "expr" [4-4]
"bin_op" := rules • "expr" "divide" "expr" [4-4]
"expr" := rules • "expr" "add" "expr" [4-4]
"expr" := rules • "expr" "subtract" "expr" [4-4]
"expr" := rules • "expr" "multiply" "expr" [4-4]
"expr" := rules • "expr" "divide" "expr" [4-4]
"int" := lexemes • "INT" [4-4]
5
"int" := lexemes "INT" • [4-5]
"expr" := rules "int" • [4-5]
"bin_op" := rules "expr" "multiply" "expr" • [2-5]
"bin_op" := rules "expr" "multiply" "expr" • [0-5]
"bin_op" := rules "expr" • "add" "expr" [4-5]
"bin_op" := rules "expr" • "subtract" "expr" [4-5]
"bin_op" := rules "expr" • "multiply" "expr" [4-5]
"bin_op" := rules "expr" • "divide" "expr" [4-5]
"expr" := rules "bin_op" • [2-5]
"expr" := rules "bin_op" • [0-5]
"divide" := lexemes • "/" [5-5]
"bin_op" := rules "expr" "add" "expr" • [0-5]
"bin_op" := rules "expr" • "add" "expr" [2-5]
"bin_op" := rules "expr" • "subtract" "expr" [2-5]
"bin_op" := rules "expr" • "multiply" "expr" [2-5]
"bin_op" := rules "expr" • "divide" "expr" [2-5]
"expr" := rules "expr" "multiply" "expr" • [2-5]
"expr" := rules "expr" "multiply" "expr" • [0-5]
"expr" := rules "expr" • "add" "expr" [4-5]
"expr" := rules "expr" • "subtract" "expr" [4-5]
"expr" := rules "expr" • "multiply" "expr" [4-5]
"expr" := rules "expr" • "divide" "expr" [4-5]
"expr" := rules "expr" "add" "expr" • [0-5]
"expr" := rules "expr" • "add" "expr" [2-5]
"expr" := rules "expr" • "subtract" "expr" [2-5]
"expr" := rules "expr" • "multiply" "expr" [2-5]
"expr" := rules "expr" • "divide" "expr" [2-5]
"Γ" := rules "expr" • [0-5]
"bin_op" := rules "expr" • "add" "expr" [0-5]
"bin_op" := rules "expr" • "subtract" "expr" [0-5]
"bin_op" := rules "expr" • "multiply" "expr" [0-5]
"bin_op" := rules "expr" • "divide" "expr" [0-5]
"expr" := rules "expr" • "add" "expr" [0-5]
"expr" := rules "expr" • "subtract" "expr" [0-5]
"expr" := rules "expr" • "multiply" "expr" [0-5]
"expr" := rules "expr" • "divide" "expr" [0-5]
"divide" := lexemes • "/" [5-5]
6
"divide" := lexemes "/" • [5-6]
"bin_op" := rules "expr" "divide" • "expr" [4-6]
"bin_op" := rules "expr" "divide" • "expr" [2-6]
"bin_op" := rules "expr" "divide" • "expr" [0-6]
"expr" := rules • "bin_op" [6-6]
"expr" := rules "expr" "divide" • "expr" [4-6]
"expr" := rules "expr" "divide" • "expr" [2-6]
"expr" := rules "expr" "divide" • "expr" [0-6]
"expr" := rules • "int" [6-6]
"bin_op" := rules • "expr" "add" "expr" [6-6]
"bin_op" := rules • "expr" "subtract" "expr" [6-6]
"bin_op" := rules • "expr" "multiply" "expr" [6-6]
"bin_op" := rules • "expr" "divide" "expr" [6-6]
"expr" := rules • "expr" "add" "expr" [6-6]
"expr" := rules • "expr" "subtract" "expr" [6-6]
"expr" := rules • "expr" "multiply" "expr" [6-6]
"expr" := rules • "expr" "divide" "expr" [6-6]
"int" := lexemes • "INT" [6-6]
7
"int" := lexemes "INT" • [6-7]
"expr" := rules "int" • [6-7]
"bin_op" := rules "expr" "divide" "expr" • [4-7]
"bin_op" := rules "expr" "divide" "expr" • [2-7]
"bin_op" := rules "expr" "divide" "expr" • [0-7]
"bin_op" := rules "expr" • "add" "expr" [6-7]
"bin_op" := rules "expr" • "subtract" "expr" [6-7]
"bin_op" := rules "expr" • "multiply" "expr" [6-7]
"bin_op" := rules "expr" • "divide" "expr" [6-7]
"expr" := rules "bin_op" • [4-7]
"expr" := rules "bin_op" • [2-7]
"expr" := rules "bin_op" • [0-7]
"subtract" := lexemes • "-" [7-7]
"bin_op" := rules "expr" "multiply" "expr" • [2-7]
"bin_op" := rules "expr" "multiply" "expr" • [0-7]
"bin_op" := rules "expr" • "add" "expr" [4-7]
"bin_op" := rules "expr" • "subtract" "expr" [4-7]
"bin_op" := rules "expr" • "multiply" "expr" [4-7]
"bin_op" := rules "expr" • "divide" "expr" [4-7]
"bin_op" := rules "expr" "add" "expr" • [0-7]
"bin_op" := rules "expr" • "add" "expr" [2-7]
"bin_op" := rules "expr" • "subtract" "expr" [2-7]
"bin_op" := rules "expr" • "multiply" "expr" [2-7]
"bin_op" := rules "expr" • "divide" "expr" [2-7]
"expr" := rules "expr" "divide" "expr" • [4-7]
"expr" := rules "expr" "divide" "expr" • [2-7]
"expr" := rules "expr" "divide" "expr" • [0-7]
"expr" := rules "expr" • "add" "expr" [6-7]
"expr" := rules "expr" • "subtract" "expr" [6-7]
"expr" := rules "expr" • "multiply" "expr" [6-7]
"expr" := rules "expr" • "divide" "expr" [6-7]
"expr" := rules "expr" "multiply" "expr" • [2-7]
"expr" := rules "expr" "multiply" "expr" • [0-7]
"expr" := rules "expr" • "add" "expr" [4-7]
"expr" := rules "expr" • "subtract" "expr" [4-7]
"expr" := rules "expr" • "multiply" "expr" [4-7]
"expr" := rules "expr" • "divide" "expr" [4-7]
"expr" := rules "expr" "add" "expr" • [0-7]
"expr" := rules "expr" • "add" "expr" [2-7]
"expr" := rules "expr" • "subtract" "expr" [2-7]
"expr" := rules "expr" • "multiply" "expr" [2-7]
"expr" := rules "expr" • "divide" "expr" [2-7]
"Γ" := rules "expr" • [0-7]
"bin_op" := rules "expr" • "add" "expr" [0-7]
"bin_op" := rules "expr" • "subtract" "expr" [0-7]
"bin_op" := rules "expr" • "multiply" "expr" [0-7]
"bin_op" := rules "expr" • "divide" "expr" [0-7]
"expr" := rules "expr" • "add" "expr" [0-7]
"expr" := rules "expr" • "subtract" "expr" [0-7]
"expr" := rules "expr" • "multiply" "expr" [0-7]
"expr" := rules "expr" • "divide" "expr" [0-7]
"subtract" := lexemes • "-" [7-7]
8
"subtract" := lexemes "-" • [7-8]
"bin_op" := rules "expr" "subtract" • "expr" [6-8]
"bin_op" := rules "expr" "subtract" • "expr" [4-8]
"bin_op" := rules "expr" "subtract" • "expr" [2-8]
"bin_op" := rules "expr" "subtract" • "expr" [0-8]
"expr" := rules • "bin_op" [8-8]
"expr" := rules "expr" "subtract" • "expr" [6-8]
"expr" := rules "expr" "subtract" • "expr" [4-8]
"expr" := rules "expr" "subtract" • "expr" [2-8]
"expr" := rules "expr" "subtract" • "expr" [0-8]
"expr" := rules • "int" [8-8]
"bin_op" := rules • "expr" "add" "expr" [8-8]
"bin_op" := rules • "expr" "subtract" "expr" [8-8]
"bin_op" := rules • "expr" "multiply" "expr" [8-8]
"bin_op" := rules • "expr" "divide" "expr" [8-8]
"expr" := rules • "expr" "add" "expr" [8-8]
"expr" := rules • "expr" "subtract" "expr" [8-8]
"expr" := rules • "expr" "multiply" "expr" [8-8]
"expr" := rules • "expr" "divide" "expr" [8-8]
"int" := lexemes • "INT" [8-8]
9
"int" := lexemes "INT" • [8-9]
"expr" := rules "int" • [8-9]
"bin_op" := rules "expr" "subtract" "expr" • [6-9]
"bin_op" := rules "expr" "subtract" "expr" • [4-9]
"bin_op" := rules "expr" "subtract" "expr" • [2-9]
"bin_op" := rules "expr" "subtract" "expr" • [0-9]
"bin_op" := rules "expr" • "add" "expr" [8-9]
"bin_op" := rules "expr" • "subtract" "expr" [8-9]
"bin_op" := rules "expr" • "multiply" "expr" [8-9]
"bin_op" := rules "expr" • "divide" "expr" [8-9]
"expr" := rules "bin_op" • [6-9]
"expr" := rules "bin_op" • [4-9]
"expr" := rules "bin_op" • [2-9]
"expr" := rules "bin_op" • [0-9]
"expr" := rules "expr" "subtract" "expr" • [6-9]
"expr" := rules "expr" "subtract" "expr" • [4-9]
"expr" := rules "expr" "subtract" "expr" • [2-9]
"expr" := rules "expr" "subtract" "expr" • [0-9]
"expr" := rules "expr" • "add" "expr" [8-9]
"expr" := rules "expr" • "subtract" "expr" [8-9]
"expr" := rules "expr" • "multiply" "expr" [8-9]
"expr" := rules "expr" • "divide" "expr" [8-9]
"expr" := rules "expr" "divide" "expr" • [4-9]
"expr" := rules "expr" "divide" "expr" • [2-9]
"expr" := rules "expr" "divide" "expr" • [0-9]
"expr" := rules "expr" • "add" "expr" [6-9]
"expr" := rules "expr" • "subtract" "expr" [6-9]
"expr" := rules "expr" • "multiply" "expr" [6-9]
"expr" := rules "expr" • "divide" "expr" [6-9]
"expr" := rules "expr" "multiply" "expr" • [2-9]
"expr" := rules "expr" "multiply" "expr" • [0-9]
"expr" := rules "expr" • "add" "expr" [4-9]
"expr" := rules "expr" • "subtract" "expr" [4-9]
"expr" := rules "expr" • "multiply" "expr" [4-9]
"expr" := rules "expr" • "divide" "expr" [4-9]
"expr" := rules "expr" "add" "expr" • [0-9]
"expr" := rules "expr" • "add" "expr" [2-9]
"expr" := rules "expr" • "subtract" "expr" [2-9]
"expr" := rules "expr" • "multiply" "expr" [2-9]
"expr" := rules "expr" • "divide" "expr" [2-9]
"Γ" := rules "expr" • [0-9]
"expr" := rules "expr" • "add" "expr" [0-9]
"expr" := rules "expr" • "subtract" "expr" [0-9]
"expr" := rules "expr" • "multiply" "expr" [0-9]
"expr" := rules "expr" • "divide" "expr" [0-9]
"add" := lexemes • "+" [9-9]
"subtract" := lexemes • "-" [9-9]
"multiply" := lexemes • "*" [9-9]
"divide" := lexemes • "/" [9-9]
"bin_op" := rules "expr" "divide" "expr" • [4-9]
"bin_op" := rules "expr" "divide" "expr" • [2-9]
"bin_op" := rules "expr" "divide" "expr" • [0-9]
"bin_op" := rules "expr" • "add" "expr" [6-9]
"bin_op" := rules "expr" • "subtract" "expr" [6-9]
"bin_op" := rules "expr" • "multiply" "expr" [6-9]
"bin_op" := rules "expr" • "divide" "expr" [6-9]
"bin_op" := rules "expr" "multiply" "expr" • [2-9]
"bin_op" := rules "expr" "multiply" "expr" • [0-9]
"bin_op" := rules "expr" • "add" "expr" [4-9]
"bin_op" := rules "expr" • "subtract" "expr" [4-9]
"bin_op" := rules "expr" • "multiply" "expr" [4-9]
"bin_op" := rules "expr" • "divide" "expr" [4-9]
"bin_op" := rules "expr" "add" "expr" • [0-9]
"bin_op" := rules "expr" • "add" "expr" [2-9]
"bin_op" := rules "expr" • "subtract" "expr" [2-9]
"bin_op" := rules "expr" • "multiply" "expr" [2-9]
"bin_op" := rules "expr" • "divide" "expr" [2-9]
"Γ" := rules "expr" • [0-9]
"bin_op" := rules "expr" • "add" "expr" [0-9]
"bin_op" := rules "expr" • "subtract" "expr" [0-9]
"bin_op" := rules "expr" • "multiply" "expr" [0-9]
"bin_op" := rules "expr" • "divide" "expr" [0-9]
"divide" := lexemes • "/" [9-9]
54 changes: 25 additions & 29 deletions tests/calculator/cases/example/parse_trees
Original file line number Diff line number Diff line change
@@ -1,33 +1,29 @@
---
Γ := rules "expr"
expr := rules "bin_op"
bin_op := rules "expr" "subtract" "expr"
expr := rules "bin_op"
bin_op := rules "expr" "divide" "expr"
expr := rules "bin_op"
bin_op := rules "expr" "multiply" "expr"
expr := rules "bin_op"
bin_op := rules "expr" "add" "expr"
expr := rules "int"
int := lexemes "INT"
INT "1" (1, 1)
add := lexemes "+"
+ "+" (1, 3)
expr := rules "int"
int := lexemes "INT"
INT "2" (1, 5)
multiply := lexemes "*"
* "*" (1, 7)
expr := rules "int"
int := lexemes "INT"
INT "3" (1, 9)
divide := lexemes "/"
/ "/" (1, 11)
expr := rules "int"
int := lexemes "INT"
INT "6" (1, 13)
subtract := lexemes "-"
- "-" (1, 15)
expr := rules "expr" "subtract" "expr"
expr := rules "expr" "add" "expr"
expr := rules "int"
int := lexemes "INT"
INT "7" (1, 17)
INT "1" (1, 1)
add := lexemes "+"
+ "+" (1, 3)
expr := rules "expr" "divide" "expr"
expr := rules "expr" "multiply" "expr"
expr := rules "int"
int := lexemes "INT"
INT "2" (1, 5)
multiply := lexemes "*"
* "*" (1, 7)
expr := rules "int"
int := lexemes "INT"
INT "3" (1, 9)
divide := lexemes "/"
/ "/" (1, 11)
expr := rules "int"
int := lexemes "INT"
INT "6" (1, 13)
subtract := lexemes "-"
- "-" (1, 15)
expr := rules "int"
int := lexemes "INT"
INT "7" (1, 17)
Loading

0 comments on commit 1b85ae6

Please sign in to comment.