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 @@ +