LEFT | RIGHT |
1 // © 2017 and later: Unicode, Inc. and others. | 1 // © 2017 and later: Unicode, Inc. and others. |
2 // License & terms of use: http://www.unicode.org/copyright.html#License | 2 // License & terms of use: http://www.unicode.org/copyright.html#License |
3 package com.ibm.icu.impl.number.parse; | 3 package com.ibm.icu.impl.number.parse; |
4 | 4 |
5 import java.util.ArrayList; | 5 import java.util.ArrayList; |
6 import java.util.Comparator; | 6 import java.util.Comparator; |
7 import java.util.List; | 7 import java.util.List; |
| 8 |
| 9 import com.ibm.icu.impl.number.PatternStringParser; |
8 | 10 |
9 /** | 11 /** |
10 * Primary number parsing implementation class. | 12 * Primary number parsing implementation class. |
11 * | 13 * |
12 * @author sffc | 14 * @author sffc |
13 * | 15 * |
14 */ | 16 */ |
15 public class NumberParserImpl { | 17 public class NumberParserImpl { |
16 public static NumberParserImpl createDefaultParser() { | 18 public static NumberParserImpl createDefaultParser() { |
17 NumberParserImpl parser = new NumberParserImpl(); | 19 NumberParserImpl parser = new NumberParserImpl(); |
18 parser.addMatcher(MantissaMatcher.getInstance()); | 20 parser.addMatcher(MantissaMatcher.getInstance()); |
19 parser.addMatcher(WhitespaceMatcher.getInstance()); | 21 parser.addMatcher(WhitespaceMatcher.getInstance()); |
| 22 parser.addMatcher(new MinusSignMatcher()); |
| 23 PatternMatcher.make(PatternStringParser.parseToPatternInfo("a#¤¤¤"), par
ser.matchers); |
20 parser.setComparator(new Comparator<ParsedNumber>() { | 24 parser.setComparator(new Comparator<ParsedNumber>() { |
21 @Override | 25 @Override |
22 public int compare(ParsedNumber o1, ParsedNumber o2) { | 26 public int compare(ParsedNumber o1, ParsedNumber o2) { |
23 return 0; | 27 return AffixMatcher.affixLength(o1) - AffixMatcher.affixLength(o
2); |
24 } | 28 } |
25 | |
26 }); | 29 }); |
27 parser.freeze(); | 30 parser.freeze(); |
28 return parser; | 31 return parser; |
29 } | 32 } |
30 | 33 |
31 private final List<NumberParseMatcher> matchers; | 34 private final List<NumberParseMatcher> matchers; |
32 private Comparator<ParsedNumber> comparator; | 35 private Comparator<ParsedNumber> comparator; |
33 private boolean frozen; | 36 private boolean frozen; |
34 | 37 |
35 public NumberParserImpl() { | 38 public NumberParserImpl() { |
(...skipping 13 matching lines...) Expand all Loading... |
49 frozen = true; | 52 frozen = true; |
50 } | 53 } |
51 | 54 |
52 public void parse(String input, boolean greedy, ParsedNumber result) { | 55 public void parse(String input, boolean greedy, ParsedNumber result) { |
53 assert frozen; | 56 assert frozen; |
54 StringSegment segment = new StringSegment(input); | 57 StringSegment segment = new StringSegment(input); |
55 if (greedy) { | 58 if (greedy) { |
56 parseGreedyRecursive(segment, result); | 59 parseGreedyRecursive(segment, result); |
57 } else { | 60 } else { |
58 parseLongestRecursive(segment, result); | 61 parseLongestRecursive(segment, result); |
| 62 } |
| 63 for (NumberParseMatcher matcher : matchers) { |
| 64 matcher.postProcess(result); |
59 } | 65 } |
60 } | 66 } |
61 | 67 |
62 private void parseGreedyRecursive(StringSegment segment, ParsedNumber result
) { | 68 private void parseGreedyRecursive(StringSegment segment, ParsedNumber result
) { |
63 // Base Case | 69 // Base Case |
64 if (segment.length() == 0) { | 70 if (segment.length() == 0) { |
65 return; | 71 return; |
66 } | 72 } |
67 | 73 |
68 int initialOffset = segment.getOffset(); | 74 int initialOffset = segment.getOffset(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 segment.setOffset(initialOffset); | 125 segment.setOffset(initialOffset); |
120 | 126 |
121 // Unless the matcher wants to see the next char, continue to th
e next matcher. | 127 // Unless the matcher wants to see the next char, continue to th
e next matcher. |
122 if (!maybeMore) { | 128 if (!maybeMore) { |
123 break; | 129 break; |
124 } | 130 } |
125 } | 131 } |
126 } | 132 } |
127 } | 133 } |
128 } | 134 } |
LEFT | RIGHT |