Index: src/Boo.Lang.Compiler/Steps/NormalizeStatementModifiers.cs =================================================================== --- src/Boo.Lang.Compiler/Steps/NormalizeStatementModifiers.cs (revision 1773) +++ src/Boo.Lang.Compiler/Steps/NormalizeStatementModifiers.cs (working copy) @@ -141,19 +141,5 @@ ReplaceCurrentNode(CreateModifiedStatement(modifier, node)); } } - - override public void LeaveUnaryExpression(UnaryExpression node) - { - if (UnaryOperatorType.UnaryNegation == node.Operator) - { - if (NodeType.IntegerLiteralExpression == node.Operand.NodeType) - { - IntegerLiteralExpression integer = (IntegerLiteralExpression)node.Operand; - integer.Value *= -1; - integer.LexicalInfo = node.LexicalInfo; - ReplaceCurrentNode(integer); - } - } - } } } Index: src/Boo.Lang.Parser/boo.g =================================================================== --- src/Boo.Lang.Parser/boo.g (revision 1773) +++ src/Boo.Lang.Parser/boo.g (working copy) @@ -247,7 +247,7 @@ static double ParseDouble(string text) { - return double.Parse(text, CultureInfo.InvariantCulture); + return double.Parse(text, NumberStyles.Float, CultureInfo.InvariantCulture); } protected IntegerLiteralExpression ParseIntegerLiteralExpression( @@ -256,16 +256,31 @@ const string HEX_PREFIX = "0x"; long value; + NumberStyles style = NumberStyles.Integer; + int hex_start = s.IndexOf(HEX_PREFIX); + bool negative = false; - if (s.StartsWith(HEX_PREFIX)) + if (hex_start >=0) { - value = long.Parse( - s.Substring(HEX_PREFIX.Length), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); + if (s.StartsWith("-")) + { + negative = true; + } + s = s.Substring(hex_start+HEX_PREFIX.Length); + style = NumberStyles.HexNumber; } + if (isLong) + { + value = long.Parse(s, style, CultureInfo.InvariantCulture); + } else { - value = long.Parse(s, CultureInfo.InvariantCulture); + value = int.Parse(s, style, CultureInfo.InvariantCulture); } + if (hex_start >= 0 && negative) + { + value *= -1; + } return new IntegerLiteralExpression(ToLexicalInfo(token), value, isLong); } @@ -2283,17 +2298,23 @@ protected integer_literal returns [IntegerLiteralExpression e] { e = null; } : - i:INT - { - e = ParseIntegerLiteralExpression(i, i.getText(), false); - } - | - l:LONG - { - string s = l.getText(); - s = s.Substring(0, s.Length-1); - e = ParseIntegerLiteralExpression(l, s, true); - } + (neg:SUBTRACT)? + ( + i:INT + { + string val = i.getText(); + if (neg != null) val = neg.getText() + val; + e = ParseIntegerLiteralExpression(i, val, false); + } + | + l:LONG + { + string val = l.getText(); + val = val.Substring(0, val.Length-1); + if (neg != null) val = neg.getText() + val; + e = ParseIntegerLiteralExpression(l, val, true); + } + ) ; protected @@ -2407,14 +2428,24 @@ protected double_literal returns [DoubleLiteralExpression rle] { rle = null; }: + (neg:SUBTRACT)? value:DOUBLE - { rle = new DoubleLiteralExpression(ToLexicalInfo(value), ParseDouble(value.getText())); } + { + string val = value.getText(); + if (neg != null) val = neg.getText() + val; + rle = new DoubleLiteralExpression(ToLexicalInfo(value), ParseDouble(val)); + } ; protected timespan_literal returns [TimeSpanLiteralExpression tsle] { tsle = null; }: + (neg:SUBTRACT)? value:TIMESPAN - { tsle = new TimeSpanLiteralExpression(ToLexicalInfo(value), ParseTimeSpan(value.getText())); } + { + string val = value.getText(); + if (neg != null) val = neg.getText() + val; + tsle = new TimeSpanLiteralExpression(ToLexicalInfo(value), ParseTimeSpan(val)); + } ; protected Index: tests/testcases/errors/BCE0043-1.boo =================================================================== --- tests/testcases/errors/BCE0043-1.boo (revision 1773) +++ tests/testcases/errors/BCE0043-1.boo (working copy) @@ -1,5 +1,5 @@ """ -BCE0043-1.boo(4,12): BCE0043: Unexpected token: gf. +BCE0043-1.boo(4,8): BCE0043: Unexpected token: 0xab3. """ print(0xab3gf) Index: tests/testcases/compilation/negative0.boo =================================================================== --- tests/testcases/compilation/negative0.boo (revision 0) +++ tests/testcases/compilation/negative0.boo (revision 0) @@ -0,0 +1,14 @@ +""" +-1 +-1 +-01:00:00 +-1 +-170 +""" + +print(-1.0) +print(-1) +print(-1h) +print(- 1.0) +print(-0xAA) +