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