OLD | NEW |
| (Empty) |
1 part of petitparser; | |
2 | |
3 /** | |
4 * A parser that performs a transformation with a given function on the | |
5 * successful parse result of the delegate. | |
6 */ | |
7 class ActionParser extends DelegateParser { | |
8 final Function _function; | |
9 | |
10 ActionParser(parser, this._function) : super(parser); | |
11 | |
12 @override | |
13 Result parseOn(Context context) { | |
14 var result = _delegate.parseOn(context); | |
15 if (result.isSuccess) { | |
16 return result.success(_function(result.value)); | |
17 } else { | |
18 return result; | |
19 } | |
20 } | |
21 | |
22 @override | |
23 Parser copy() => new ActionParser(_delegate, _function); | |
24 | |
25 @override | |
26 bool hasEqualProperties(Parser other) { | |
27 return other is ActionParser | |
28 && super.hasEqualProperties(other) | |
29 && _function == other._function; | |
30 } | |
31 } | |
32 | |
33 /** | |
34 * A parser that silently consumes input of another parser around | |
35 * its delegate. | |
36 */ | |
37 class TrimmingParser extends DelegateParser { | |
38 Parser _left; | |
39 Parser _right; | |
40 | |
41 TrimmingParser(parser, this._left, this._right) : super(parser); | |
42 | |
43 @override | |
44 Result parseOn(Context context) { | |
45 var current = context; | |
46 do { | |
47 current = _left.parseOn(current); | |
48 } while (current.isSuccess); | |
49 var result = _delegate.parseOn(current); | |
50 if (result.isFailure) { | |
51 return result; | |
52 } | |
53 current = result; | |
54 do { | |
55 current = _right.parseOn(current); | |
56 } while (current.isSuccess); | |
57 return current.success(result.value); | |
58 } | |
59 | |
60 @override | |
61 Parser copy() => new TrimmingParser(_delegate, _left, _right); | |
62 | |
63 @override | |
64 List<Parser> get children => [_delegate, _left, _right]; | |
65 | |
66 @override | |
67 void replace(Parser source, Parser target) { | |
68 super.replace(source, target); | |
69 if (_left == source) { | |
70 _left = target; | |
71 } | |
72 if (_right == source) { | |
73 _right = target; | |
74 } | |
75 } | |
76 } | |
77 | |
78 /** | |
79 * A parser that answers a substring or sub-list of the range its delegate | |
80 * parses. | |
81 */ | |
82 class FlattenParser extends DelegateParser { | |
83 FlattenParser(parser) : super(parser); | |
84 | |
85 @override | |
86 Result parseOn(Context context) { | |
87 var result = _delegate.parseOn(context); | |
88 if (result.isSuccess) { | |
89 var output = context.buffer is String | |
90 ? context.buffer.substring(context.position, result.position) | |
91 : context.buffer.sublist(context.position, result.position); | |
92 return result.success(output); | |
93 } else { | |
94 return result; | |
95 } | |
96 } | |
97 | |
98 @override | |
99 Parser copy() => new FlattenParser(_delegate); | |
100 } | |
101 | |
102 /** | |
103 * A parser that answers a token of the result its delegate parses. | |
104 */ | |
105 class TokenParser extends DelegateParser { | |
106 TokenParser(parser) : super(parser); | |
107 | |
108 @override | |
109 Result parseOn(Context context) { | |
110 var result = _delegate.parseOn(context); | |
111 if (result.isSuccess) { | |
112 var token = new Token( | |
113 result.value, context.buffer, context.position, result.position); | |
114 return result.success(token); | |
115 } else { | |
116 return result; | |
117 } | |
118 } | |
119 | |
120 @override | |
121 Parser copy() => new TokenParser(_delegate); | |
122 } | |
OLD | NEW |