diff --git a/TypeCobol/Compiler/CodeElements/Expressions/Expression.cs b/TypeCobol/Compiler/CodeElements/Expressions/Expression.cs
index 38ddc9551..c528bb13b 100644
--- a/TypeCobol/Compiler/CodeElements/Expressions/Expression.cs
+++ b/TypeCobol/Compiler/CodeElements/Expressions/Expression.cs
@@ -3,8 +3,9 @@
namespace TypeCobol.Compiler.CodeElements.Expressions
{
public class Expression { }
+ public class ArithmeticExpression : Expression { }
- public class Addition : Expression
+ public class Addition : ArithmeticExpression
{
public Expression left { get; set; }
public Expression right { get; set; }
@@ -29,13 +30,13 @@ public Identifier(Token token, bool rounded = false)
}
public override string ToString() { return token.Text; }
}
- public class Literal : Expression
+ public class Number : ArithmeticExpression
{
- public Token token { get; set; }
- public Literal(Token token)
+ public SyntaxNumber number { get; set; }
+ public Number(SyntaxNumber number)
{
- this.token = token;
+ this.number = number;
}
- public override string ToString() { return token.Text; }
+ public override string ToString() { return number.ToString(); }
}
}
diff --git a/TypeCobol/Compiler/CodeElements/Expressions/SyntaxInteger.cs b/TypeCobol/Compiler/CodeElements/Expressions/SyntaxInteger.cs
deleted file mode 100644
index a0d7ddd1c..000000000
--- a/TypeCobol/Compiler/CodeElements/Expressions/SyntaxInteger.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-using TypeCobol.Compiler.Scanner;
-
-namespace TypeCobol.Compiler.CodeElements
-{
- ///
- /// Integer value defined by a single Token in the Cobol syntax
- ///
- public class SyntaxInteger
- {
- public SyntaxInteger(Token token)
- {
- Token = token;
- }
-
- ///
- /// Token defining the integer value
- ///
- public Token Token { get; private set; }
-
- ///
- /// Integer value defined by the Token
- ///
- public long Value
- {
- get
- {
- if (Token.TokenType == TokenType.IntegerLiteral)
- {
- return ((IntegerLiteralValue)Token.LiteralValue).Number;
- }
- else
- {
- throw new InvalidOperationException("An integer value can not be defined by a token of type : " + Token.TokenType);
- }
- }
- }
-
- ///
- /// Debug string
- ///
- public override string ToString()
- {
- return Value.ToString();
- }
- }
-}
diff --git a/TypeCobol/Compiler/CodeElements/Expressions/SyntaxNumber.cs b/TypeCobol/Compiler/CodeElements/Expressions/SyntaxNumber.cs
new file mode 100644
index 000000000..0474df746
--- /dev/null
+++ b/TypeCobol/Compiler/CodeElements/Expressions/SyntaxNumber.cs
@@ -0,0 +1,130 @@
+using System;
+using TypeCobol.Compiler.Scanner;
+
+namespace TypeCobol.Compiler.CodeElements
+{
+
+ ///
+ /// Integer, Decimal or Floating Point value defined by a single Token in the Cobol syntax
+ ///
+ public class SyntaxNumber
+ {
+ public SyntaxNumber(Token token)
+ {
+ Token = token;
+ }
+
+ ///
+ /// Token defining the number value
+ ///
+ public Token Token { get; private set; }
+ }
+
+ ///
+ /// Integer value defined by a single Token in the Cobol syntax
+ ///
+ public class SyntaxInteger : SyntaxNumber
+ {
+ public SyntaxInteger(Token token)
+ : base(token)
+ { }
+
+ ///
+ /// Integer value defined by the Token
+ ///
+ public long Value
+ {
+ get
+ {
+ if (Token.TokenType == TokenType.IntegerLiteral)
+ {
+ return ((IntegerLiteralValue)Token.LiteralValue).Number;
+ }
+ else
+ {
+ throw new InvalidOperationException("An integer value can not be defined by a token of type : " + Token.TokenType);
+ }
+ }
+ }
+
+ ///
+ /// Debug string
+ ///
+ public override string ToString()
+ {
+ return Value.ToString();
+ }
+ }
+
+ ///
+ /// Decimal value defined by a single Token in the Cobol syntax
+ ///
+ public class SyntaxDecimal : SyntaxNumber
+ {
+ public SyntaxDecimal(Token token)
+ : base(token)
+ { }
+
+ ///
+ /// Integer value defined by the Token
+ ///
+ public double Value
+ {
+ get
+ {
+ if (Token.TokenType == TokenType.DecimalLiteral)
+ {
+ return ((DecimalLiteralValue)Token.LiteralValue).Number;
+ }
+ else
+ {
+ throw new InvalidOperationException("A decimal value can not be defined by a token of type : " + Token.TokenType);
+ }
+ }
+ }
+
+ ///
+ /// Debug string
+ ///
+ public override string ToString()
+ {
+ return Value.ToString();
+ }
+ }
+
+ ///
+ /// Decimal value defined by a single Token in the Cobol syntax
+ ///
+ public class SyntaxFloat : SyntaxNumber
+ {
+ public SyntaxFloat(Token token)
+ : base(token)
+ { }
+
+ ///
+ /// Integer value defined by the Token
+ ///
+ public double Value
+ {
+ get
+ {
+ if (Token.TokenType == TokenType.FloatingPointLiteral)
+ {
+ return ((DecimalLiteralValue)Token.LiteralValue).Number;
+ }
+ else
+ {
+ throw new InvalidOperationException("A floating point value can not be defined by a token of type : " + Token.TokenType);
+ }
+ }
+ }
+
+ ///
+ /// Debug string
+ ///
+ public override string ToString()
+ {
+ return Value.ToString();
+ }
+ }
+}
diff --git a/TypeCobol/Compiler/Parser/CodeElementBuilder.cs b/TypeCobol/Compiler/Parser/CodeElementBuilder.cs
index 69c4fc38b..4f60f5025 100644
--- a/TypeCobol/Compiler/Parser/CodeElementBuilder.cs
+++ b/TypeCobol/Compiler/Parser/CodeElementBuilder.cs
@@ -429,6 +429,31 @@ public override void EnterAcceptStatement(CobolCodeElementsParser.AcceptStatemen
CodeElement = new AcceptStatement();
}
+
+ public SyntaxNumber createNumber(CobolCodeElementsParser.NumericLiteralContext context)
+ {
+ if (context.IntegerLiteral() != null)
+ {
+ Token token = ParseTreeUtils.GetTokenFromTerminalNode(context.IntegerLiteral());
+ return new SyntaxInteger(token);
+ }
+ if (context.DecimalLiteral() != null)
+ {
+ Token token = ParseTreeUtils.GetTokenFromTerminalNode(context.DecimalLiteral());
+ return new SyntaxDecimal(token);
+ }
+ if (context.FloatingPointLiteral() != null)
+ {
+ Token token = ParseTreeUtils.GetTokenFromTerminalNode(context.FloatingPointLiteral());
+ return new SyntaxFloat(token);
+ }
+ if (context.ZERO() != null || context.ZEROS() != null || context.ZEROES() != null)
+ {
+ throw new System.Exception("TODO!");
+ }
+ throw new System.Exception("This is not a number!");
+ }
+
private Expression createLeftOperand(IReadOnlyList operands)
{
Expression left = null;
@@ -441,7 +466,12 @@ private Expression createLeftOperand(IReadOnlyList
-
+
@@ -296,6 +296,7 @@
+