parser_pda/
parser_nondet_pda.rs1
2use crate::defs::{ SegmentDelimSyms::*, SegmentTypes,
3 ParserCtx, PDAStackCtx, ParsedSegment };
4
5fsm!( ParserNonDetPDA<ParserCtx, PDAStackCtx> [
6 Idle on Start
7 => NewSentence on LeftBracket => PlainSegment,
8
9 NewSentence on RightBracket => InvalidSegment,
10 NewSentence on Letter(char)
11 => PlainSegment on LeftBracket
12 => PlainSegment on RightBracket => ?,
13
14 PlainSegment on EndOfSentence => NewSentence,
15 _ on EndOfSentence => NewSentence,
16 _ on EndOfInput => Idle,
17 ],
18 [
19 Idle entry, NewSentence exit
20 ]
21);
22
23on_state_handler!( Idle entry for ParserNonDetPDA {
24 data.index = 0;
25});
26on_state_handler!( NewSentence exit for ParserNonDetPDA {
27 stack.push(PDAStackCtx { sym: SentenceStart, seg_start: data.index} );
28});
29
30transition_handler!( Idle on Start for ParserNonDetPDA {
31});
32
33transition_handler!( NewSentence on Letter(char) for ParserNonDetPDA {
34});
35
36transition_handler!( NewSentence on LeftBracket for ParserNonDetPDA {
37 stack.push(PDAStackCtx { sym: Bracket, seg_start: data.index } );
38});
39
40transition_handler!( NewSentence on RightBracket for ParserNonDetPDA {
41});
42
43
44transition_handler!( PlainSegment on LeftBracket for ParserNonDetPDA {
45 let top = stack.last().unwrap();
46 if top.sym == SegmentStart || top.sym == SentenceStart {
47 data.segments.push(ParsedSegment {
48 tp: SegmentTypes::Plain,
49 seg: (top.seg_start, data.index),
50 rank: stack.len(),
51 });
52 }
53 stack.push(PDAStackCtx { sym: Bracket, seg_start: data.index} );
54});
55
56conditional_handler!(PlainSegment on RightBracket for ParserNonDetPDA {
57 if &Bracket == stack.last().unwrap() {
58 let top = stack.pop().unwrap();
59 data.segments.push(ParsedSegment {
60 tp: SegmentTypes::Bracketed,
61 seg: (top.seg_start + 1, data.index),
62 rank: stack.len(),
63 });
64 PlainSegment
65 } else {
66 let top = stack.last().unwrap();
67 data.segments.push(ParsedSegment {
68 tp: SegmentTypes::Plain,
69 seg: (top.seg_start, data.index),
70 rank: stack.len(),
71 });
72 stack.push(PDAStackCtx { sym: SegmentStart, seg_start: data.index } );
73 InvalidSegment
74 }
75});
76
77transition_handler!(PlainSegment on EndOfSentence for ParserNonDetPDA {
78 if let Some(_) = stack.last() {
79 let top = stack.pop().unwrap();
80 let tp = if SentenceStart == top {
81 SegmentTypes::Sentence
82 } else if SegmentStart == top {
83 SegmentTypes::Plain
84 } else { unimplemented!(); };
85 data.segments.push(ParsedSegment {
86 tp,
87 seg: (top.seg_start, data.index),
88 rank: stack.len(),
89 });
90 }
91});
92
93transition_handler!(_ on EndOfSentence for ParserNonDetPDA {
94 Self::drain_unbalanced(data, stack);
95});
96
97transition_handler!( _ on EndOfInput for ParserNonDetPDA {
98 if let Some(top) = stack.last() {
99 if &SentenceStart == top {
100 data.segments.push(ParsedSegment {
101 tp: SegmentTypes::Tail,
102 seg: (stack.pop().unwrap().seg_start, data.index),
103 rank: stack.len(),
104 });
105 } else {
106 Self::drain_unbalanced(data, stack);
107 }
108 }
109});
110
111transition_handler!( NewSentence on EndOfSentence for ParserNonDetPDA {
112});
113
114impl ParserNonDetPDA {
115 pub fn start(&mut self) {
116 self.signal(&Start);
117 }
118 pub fn next(&mut self, signal: &ParserNonDetPDASignals) {
119 self.signal(signal);
120 self.data.index += 1;
121 }
122 pub fn stop(&mut self) {
123 self.signal(&EndOfInput);
124 }
125
126 fn drain_unbalanced(
127 data: &mut <Self as ParserNonDetPDATrait>::DataItem,
128 stack: &mut Vec<<Self as ParserNonDetPDATrait>::StackSymbolItem>,
129 ) {
130 while let Some(top) = stack.pop() {
131 let tp =
132 if Bracket == top { SegmentTypes::UnbalancedLeftBracket }
133 else if SegmentStart == top { SegmentTypes::UnbalancedRightSth}
134 else if SentenceStart == top { SegmentTypes::InvalidSentence}
135 else {
136 unimplemented!();
137 };
138 data.segments.push(ParsedSegment {
139 tp,
140 seg: (top.seg_start, data.index),
141 rank: stack.len(),
142 });
143 }
144 }
145}
146