changeset 535:289908469e02

parse numeric constants to ints or longs if possible
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 31 May 2015 00:00:17 -0600
parents 115cae4ac8fd
children 3058870cbe83
files core/src/luan/impl/LuanParser.java
diffstat 1 files changed, 26 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/core/src/luan/impl/LuanParser.java	Fri May 29 01:08:30 2015 -0600
+++ b/core/src/luan/impl/LuanParser.java	Sun May 31 00:00:17 2015 -0600
@@ -1146,15 +1146,29 @@
 
 	private Number DecNumber() {
 		int start = parser.begin();
+		boolean isInt = true;
 		if( Int() ) {
-			if( parser.match('.') )
+			if( parser.match('.') ) {
+				isInt = false;
 				Int();  // optional
+			}
 		} else if( parser.match('.') && Int() ) {
 			// ok
+			isInt = false;
 		} else
 			return parser.failure(null);
-		Exponent();  // optional
-		return parser.success(Double.valueOf(parser.textFrom(start)));
+		if( Exponent() )  // optional
+			isInt = false;
+		String s = parser.textFrom(start);
+		if( isInt ) {
+			try {
+				return parser.success(Integer.valueOf(s));
+			} catch(NumberFormatException e) {}
+			try {
+				return parser.success(Long.valueOf(s));
+			} catch(NumberFormatException e) {}
+		}
+		return parser.success(Double.valueOf(s));
 	}
 
 	private boolean Exponent() {
@@ -1180,9 +1194,11 @@
 
 	private Number HexNumber() {
 		int start = parser.begin();
+		long nLong = 0;
 		double n;
 		if( HexInt() ) {
-			n = (double)Long.parseLong(parser.textFrom(start),16);
+			nLong = Long.parseLong(parser.textFrom(start),16);
+			n = (double)nLong;
 			if( parser.match('.') ) {
 				start = parser.currentIndex();
 				if( HexInt() ) {
@@ -1203,6 +1219,12 @@
 				return parser.failure(null);
 			n *= Math.pow(2,(double)Long.parseLong(parser.textFrom(start)));
 		}
+		if( nLong == n ) {
+			int nInt = (int)nLong;
+			if( nInt == nLong )
+				return parser.success(Integer.valueOf(nInt));
+			return parser.success(Long.valueOf(nLong));
+		}
 		return parser.success(Double.valueOf(n));
 	}