From c9c3ebfa2f03d4b75918aaba4069024e442e1666 Mon Sep 17 00:00:00 2001 From: Sergey Kacheev Date: Wed, 28 Mar 2018 01:09:15 +0700 Subject: [PATCH] add samples, fix derivation path --- sample/pda/0k1n-0_lt_k_le_n.yaml | 36 +++++++++++++++++++ sample/pda/0k1n-k_ge_n_gt_0.yaml | 36 +++++++++++++++++++ sample/pda/0n1n0k1k.yaml | 14 ++++++++ ...w_for_ab_and_count-a-and-count-b_even.yaml | 14 ++++++++ .../pda/w_for_ab_and_count-a-eq-count-b.yaml | 16 +++++++++ src/main.rs | 7 ++-- 6 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 sample/pda/0k1n-0_lt_k_le_n.yaml create mode 100644 sample/pda/0k1n-k_ge_n_gt_0.yaml create mode 100644 sample/pda/0n1n0k1k.yaml create mode 100644 sample/pda/w_for_ab_and_count-a-and-count-b_even.yaml create mode 100644 sample/pda/w_for_ab_and_count-a-eq-count-b.yaml diff --git a/sample/pda/0k1n-0_lt_k_le_n.yaml b/sample/pda/0k1n-0_lt_k_le_n.yaml new file mode 100644 index 0000000..4803a35 --- /dev/null +++ b/sample/pda/0k1n-0_lt_k_le_n.yaml @@ -0,0 +1,36 @@ +start_state: 0 +bottom_character: Z +accept_by_empty_stack: false +accept_states: [0] +rulebook: + rules: + - state: 0 + character: '0' + pop_character: Z + next_state: 2 + push_characters: ['0', Z] + - state: 2 + character: '0' + pop_character: '0' + next_state: 2 + push_characters: ['0', '0'] + - state: 2 + character: '1' + pop_character: '0' + next_state: 1 + push_characters: [] + - state: 1 + character: '1' + pop_character: '0' + next_state: 1 + push_characters: [] + - state: 1 + character: '1' + pop_character: Z + next_state: 1 + push_characters: [Z] + - state: 1 + character: ~ + pop_character: Z + next_state: 0 + push_characters: [] diff --git a/sample/pda/0k1n-k_ge_n_gt_0.yaml b/sample/pda/0k1n-k_ge_n_gt_0.yaml new file mode 100644 index 0000000..4236d2c --- /dev/null +++ b/sample/pda/0k1n-k_ge_n_gt_0.yaml @@ -0,0 +1,36 @@ +start_state: 0 +bottom_character: Z +accept_by_empty_stack: false +accept_states: [0] +rulebook: + rules: + - state: 0 + character: '0' + pop_character: Z + next_state: 2 + push_characters: ['0', Z] + - state: 2 + character: '0' + pop_character: '0' + next_state: 2 + push_characters: ['0', '0'] + - state: 2 + character: '1' + pop_character: '0' + next_state: 1 + push_characters: [] + - state: 1 + character: '1' + pop_character: '0' + next_state: 1 + push_characters: [] + - state: 1 + character: ~ + pop_character: '0' + next_state: 1 + push_characters: [] + - state: 1 + character: ~ + pop_character: Z + next_state: 0 + push_characters: [] diff --git a/sample/pda/0n1n0k1k.yaml b/sample/pda/0n1n0k1k.yaml new file mode 100644 index 0000000..b4a367e --- /dev/null +++ b/sample/pda/0n1n0k1k.yaml @@ -0,0 +1,14 @@ +start_state: 0 +bottom_character: $ +accept_by_empty_stack: false +accept_states: [0] +rulebook: + rules: + - {state: 0, character: '0', pop_character: $, next_state: 1, push_characters: [a, $]} + - {state: 1, character: '0', pop_character: a, next_state: 1, push_characters: [a, a]} + - {state: 1, character: '1', pop_character: a, next_state: 2, push_characters: []} + - {state: 2, character: '1', pop_character: a, next_state: 2, push_characters: []} + - {state: 2, character: '0', pop_character: $, next_state: 3, push_characters: [a, $]} + - {state: 3, character: '0', pop_character: a, next_state: 3, push_characters: [a, a]} + - {state: 3, character: '1', pop_character: a, next_state: 3, push_characters: []} + - {state: 3, character: ~, pop_character: $, next_state: 0, push_characters: []} diff --git a/sample/pda/w_for_ab_and_count-a-and-count-b_even.yaml b/sample/pda/w_for_ab_and_count-a-and-count-b_even.yaml new file mode 100644 index 0000000..c1d8dfd --- /dev/null +++ b/sample/pda/w_for_ab_and_count-a-and-count-b_even.yaml @@ -0,0 +1,14 @@ +start_state: 0 +bottom_character: $ +accept_by_empty_stack: false +accept_states: [0] +rulebook: + rules: + - {state: 0, character: a, pop_character: $, next_state: 1, push_characters: [$]} + - {state: 0, character: b, pop_character: $, next_state: 2, push_characters: [$]} + - {state: 1, character: a, pop_character: $, next_state: 0, push_characters: [$]} + - {state: 1, character: b, pop_character: $, next_state: 3, push_characters: [$]} + - {state: 2, character: b, pop_character: $, next_state: 0, push_characters: [$]} + - {state: 2, character: a, pop_character: $, next_state: 3, push_characters: [$]} + - {state: 3, character: b, pop_character: $, next_state: 1, push_characters: [$]} + - {state: 3, character: a, pop_character: $, next_state: 2, push_characters: [$]} diff --git a/sample/pda/w_for_ab_and_count-a-eq-count-b.yaml b/sample/pda/w_for_ab_and_count-a-eq-count-b.yaml new file mode 100644 index 0000000..e5f3786 --- /dev/null +++ b/sample/pda/w_for_ab_and_count-a-eq-count-b.yaml @@ -0,0 +1,16 @@ +start_state: 0 +bottom_character: $ +accept_by_empty_stack: false +accept_states: [0] +rulebook: + rules: + - {state: 0, character: a, pop_character: $, next_state: 1, push_characters: [a, $]} + - {state: 0, character: b, pop_character: $, next_state: 2, push_characters: [b, $]} + - {state: 1, character: a, pop_character: a, next_state: 1, push_characters: [a, a]} + - {state: 1, character: b, pop_character: a, next_state: 1, push_characters: []} + - {state: 1, character: b, pop_character: $, next_state: 2, push_characters: [b, $]} + - {state: 1, character: ~, pop_character: $, next_state: 0, push_characters: [$]} + - {state: 2, character: b, pop_character: b, next_state: 2, push_characters: [b, b]} + - {state: 2, character: a, pop_character: b, next_state: 2, push_characters: []} + - {state: 2, character: a, pop_character: $, next_state: 1, push_characters: [a, $]} + - {state: 2, character: ~, pop_character: $, next_state: 0, push_characters: [$]} diff --git a/src/main.rs b/src/main.rs index 10159f1..ab225a7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,8 +4,8 @@ extern crate itertools; #[macro_use] extern crate serde_derive; -extern crate serde_yaml; extern crate serde; +extern crate serde_yaml; mod args; mod cfg; @@ -135,7 +135,7 @@ fn main() { let result = dpda_design.accepts(text.clone()); if let Some(path) = result.path { println!( - "{}", + "{} -> [{}]", join( path.iter() .cloned() @@ -146,7 +146,8 @@ fn main() { }) .collect::>(), " -> " - ) + ), + result.cfg.state, ); } if result.ok {