Skip to content

Commit 9103660

Browse files
authored
Merge pull request #9 from dimacurrentai/unittests
Added a trivial unit test.
2 parents 95b02e0 + 5c976be commit 9103660

File tree

6 files changed

+78
-0
lines changed

6 files changed

+78
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
Cargo.lock
22
target/
33

4+
.vscode/
5+
46
# Using the `Dockerfile.template` in the root directory now.
57
Dockerfile

step05_test/code/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[package]
2+
name = "pest_example"
3+
edition = "2024"
4+
5+
[dependencies]
6+
pest = "2.7"
7+
pest_derive = "2.7"

step05_test/code/src/golden.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[Pair { rule: identifier, span: Span { str: "a", start: 0, end: 1 }, inner: [Pair { rule: alpha, span: Span { str: "a", start: 0, end: 1 }, inner: [] }] }, Pair { rule: op, span: Span { str: "+", start: 2, end: 3 }, inner: [Pair { rule: plus, span: Span { str: "+", start: 2, end: 3 }, inner: [] }] }, Pair { rule: identifier, span: Span { str: "b", start: 4, end: 5 }, inner: [Pair { rule: alpha, span: Span { str: "b", start: 4, end: 5 }, inner: [] }] }, Pair { rule: identifier, span: Span { str: "a2", start: 6, end: 8 }, inner: [Pair { rule: alpha, span: Span { str: "a", start: 6, end: 7 }, inner: [] }, Pair { rule: digit, span: Span { str: "2", start: 7, end: 8 }, inner: [] }] }, Pair { rule: op, span: Span { str: "-", start: 9, end: 10 }, inner: [Pair { rule: minus, span: Span { str: "-", start: 9, end: 10 }, inner: [] }] }, Pair { rule: identifier, span: Span { str: "b2", start: 11, end: 13 }, inner: [Pair { rule: alpha, span: Span { str: "b", start: 11, end: 12 }, inner: [] }, Pair { rule: digit, span: Span { str: "2", start: 12, end: 13 }, inner: [] }] }, Pair { rule: op, span: Span { str: "+", start: 14, end: 15 }, inner: [Pair { rule: plus, span: Span { str: "+", start: 14, end: 15 }, inner: [] }] }, Pair { rule: number, span: Span { str: "42", start: 16, end: 18 }, inner: [Pair { rule: digit, span: Span { str: "4", start: 16, end: 17 }, inner: [] }, Pair { rule: digit, span: Span { str: "2", start: 17, end: 18 }, inner: [] }] }]

step05_test/code/src/grammar.pest

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
alpha = { 'a'..'z' | 'A'..'Z' }
2+
digit = { '0'..'9' }
3+
4+
identifier = { alpha ~ (alpha | digit)* }
5+
number = { digit+ }
6+
7+
plus = { "+" }
8+
minus = { "-" }
9+
op = { plus | minus }
10+
11+
term = _{ identifier | number | op }
12+
13+
toplevel = _{ term ~ (" "+ ~ term)* }

step05_test/code/src/main.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use pest::Parser;
2+
use pest::iterators::Pair;
3+
use pest_derive::Parser;
4+
5+
#[derive(Parser)]
6+
#[grammar = "grammar.pest"]
7+
struct Grammar;
8+
9+
fn traverse(token: Pair<'_, Rule>, indent: usize) {
10+
let (next_indent, proceed) = match token.as_rule() {
11+
// These next two lines are unnecessary, since the terms are declared as `_{ ... }`, where `_` means "silent".
12+
// Rule::toplevel => (0, true),
13+
// Rule::term => (0, true),
14+
Rule::identifier => {
15+
println!("{}S: {}", " ".repeat(indent), token.as_str());
16+
(2, true)
17+
}
18+
Rule::number => {
19+
println!("{}N: {}", " ".repeat(indent), token.as_str());
20+
(0, false)
21+
}
22+
Rule::op => {
23+
println!("{}V: {}", " ".repeat(indent), token.as_str());
24+
(0, false)
25+
}
26+
_ => {
27+
println!("{}INTERNAL {:?} {}", " ".repeat(indent), token.as_rule(), token.as_str());
28+
(2, true)
29+
}
30+
};
31+
if proceed {
32+
token.into_inner().for_each(|e| traverse(e, next_indent));
33+
}
34+
}
35+
36+
fn main() {
37+
Grammar::parse(Rule::toplevel, "a + b a2 - b2 + 42").unwrap().for_each(|e| traverse(e, 0));
38+
}
39+
40+
#[cfg(test)]
41+
mod tests {
42+
use super::*;
43+
44+
#[test]
45+
fn test_parser() {
46+
const GOLDEN: &str = include_str!("golden.txt");
47+
assert_eq!(format!("{:?}", Grammar::parse(Rule::toplevel, "a + b a2 - b2 + 42").unwrap()), GOLDEN.trim());
48+
}
49+
}

step05_test/run.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
docker build -f ../Dockerfile.template . -t demo
6+
docker run --rm -t demo

0 commit comments

Comments
 (0)