Skip to content

Commit 2cf75b5

Browse files
committed
More parser improvements
1 parent 4f11e05 commit 2cf75b5

File tree

4 files changed

+19
-8
lines changed

4 files changed

+19
-8
lines changed

convex-core/src/main/antlr4/convex/core/lang/reader/antlr/Convex.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ DECIMAL:
123123

124124
fragment
125125
EPART:
126-
[eE] (DIGITS | SIGNED_DIGITS);
126+
[eE] (DIGITS | SIGNED_DIGITS) SYMBOL_FOLLOWING*;
127127

128128
ADDRESS:
129129
'#' [0-9]+;

convex-core/src/main/java/convex/core/data/prim/CVMDouble.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,16 @@ public double doubleValue() {
145145
/**
146146
* Parses a CVM Double value.
147147
* @param s String to parse
148-
* @return CVMDouble value
149-
* @throws NumberFormatException If number format is invalid
148+
* @return CVMDouble value, or null if not parseable as a double
150149
*/
151150
public static CVMDouble parse(String s) {
152-
return create(Double.parseDouble(s));
151+
try {
152+
double d=Double.parseDouble(s);
153+
return create(d);
154+
} catch (NumberFormatException e) {
155+
return null;
156+
}
157+
153158
}
154159

155160
@Override

convex-core/src/main/java/convex/core/lang/reader/AntlrReader.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ public void enterDoubleValue(DoubleValueContext ctx) {
234234
@Override
235235
public void exitDoubleValue(DoubleValueContext ctx) {
236236
String s=ctx.getText();
237-
push( CVMDouble.parse(s));
237+
CVMDouble v=CVMDouble.parse(s);
238+
if (v==null) throw new ParseException("Bad double format: "+s);
239+
push(v);
238240
}
239241

240242
@Override

convex-core/src/test/java/convex/core/lang/ReaderTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ public void testSymbols() {
116116
public void testSymbolPath() {
117117
ACell form=Reader.read("foo/bar/baz");
118118
assertEquals(Lists.of(Symbols.LOOKUP,Lists.of(Symbols.LOOKUP,Symbols.FOO,Symbols.BAR),Symbols.BAZ),form) ;
119+
120+
assertParseException(()->Reader.read("foo/12"));
121+
122+
// TODO: is this sane?
123+
// assertParseException(()->Reader.read("foo/ bar"));
124+
119125
}
120126

121127
@Test
@@ -174,9 +180,7 @@ public void testNumbers() {
174180
assertParseException(() -> {
175181
Reader.read("2.0e0.1234");
176182
});
177-
// assertNull( Reader.read("[2.0e0.1234]"));
178-
// TODO: do we want this?
179-
//assertThrows(Error.class, () -> Reader.read("[2.0e0.1234]")); // Issue #70
183+
assertParseException( () -> Reader.read("[2.0e0.1234]")); // Issue #70
180184

181185
// metadata ignored
182186
assertEquals(Syntax.create(RT.cvm(3.23),Maps.of(Keywords.FOO, CVMBool.TRUE)), Reader.read("^:foo 3.23"));

0 commit comments

Comments
 (0)