示例#1
0
        private void SetNumericalExpression(IdentifierValueNode identifierValueNode,
                                            ExpressionNode expressionNode, SymbolType expressionType)
        {
            switch (expressionType)
            {
            case SymbolType.Float:
            {
                FloatValueNode floatValueNode = new FloatValueNode();
                ExpressionEvaluator <float> expressionEvaluator = new ExpressionEvaluator <float>(new FloatCalculator(expressionNode.Token));

                expressionNode.Accept(expressionEvaluator);

                floatValueNode.Value          = expressionEvaluator.Result;
                identifierValueNode.ValueNode = floatValueNode;
                break;
            }

            case SymbolType.Integer:
            {
                IntValueNode intValueNode = new IntValueNode();
                ExpressionEvaluator <int> expressionEvaluator = new ExpressionEvaluator <int>(new IntCalculator(expressionNode.Token));

                expressionNode.Accept(expressionEvaluator);

                intValueNode.Value            = expressionEvaluator.Result;
                identifierValueNode.ValueNode = intValueNode;
                break;
            }
            }
        }
        public override StatementNode VisitMemberAssignStatement([NotNull] CoronaParser.MemberAssignStatementContext context)
        {
            BuildValueAst      valueVisitor = new BuildValueAst();
            BuildExpressionAst exprVisitor  = new BuildExpressionAst();

            try
            {
                // Get GridPoint
                GridValueNode gridPoint = null;
                if (context.gridPoint() != null)
                {
                    gridPoint = (GridValueNode)valueVisitor.Visit(context.gridPoint());
                }

                // Get Member
                IdentifierValueNode memberID = new IdentifierValueNode(context.identifierValue().GetText());

                // Get value
                ValueNode value;
                if (context.expr() != null)
                {
                    value = exprVisitor.Visit(context.expr());
                }
                else
                {
                    value = new StringValueNode(context.STRING().GetText());
                }

                return(new MemberAssignmentStatementNode(gridPoint, memberID, value));
            }
            catch (TheLanguageErrorException e) { throw new TheLanguageErrorException("Member assignment statement", e); }
        }
        public override StatementNode VisitAdvancedReturn([NotNull] CoronaParser.AdvancedReturnContext context)
        {
            BuildValueAst valueVisitor = new BuildValueAst();

            try
            {
                IdentifierValueNode id = (IdentifierValueNode)valueVisitor.Visit(context.identifierValue());

                // Get returnMembers
                List <ReturnMemberNode> returnMembers = new List <ReturnMemberNode>();
                foreach (var rMember in context.returnMember())
                {
                    // Get ReturnMember value
                    ValueNode value;
                    if (rMember.expr() != null)
                    {
                        value = new BuildExpressionAst().Visit(rMember.expr());
                    }
                    else
                    {
                        value = new StringValueNode(rMember.STRING().GetText());
                    }

                    // Add new ReturnMember to list
                    returnMembers.Add(new ReturnMemberNode(
                                          (IdentifierValueNode)valueVisitor.Visit(rMember.identifierValue()),
                                          value)
                                      );
                }

                return(new AdvancedReturnStatementNode(id, returnMembers));
            }
            catch (TheLanguageErrorException e) { throw new TheLanguageErrorException("Return statement", e); }
        }
        public override StatementNode VisitGridAssignStatement([NotNull] CoronaParser.GridAssignStatementContext context)
        {
            BuildValueAst valueVisitor = new BuildValueAst();

            try
            {
                IdentifierValueNode id        = new IdentifierValueNode(context.ID().GetText());
                GridValueNode       gridpoint = (GridValueNode)valueVisitor.Visit(context.gridPoint());

                return(new GridAssignmentStatementNode(gridpoint, id));
            }
            catch (TheLanguageErrorException e) { throw new TheLanguageErrorException("Grid assignment statement", e); }
        }
        private void AddIdentifierElement(IdentifierValueNode node, List <ValueNode> values)
        {
            Symbol sym = Stbl.st.Retrieve(node.Label);

            if (sym != null)
            {
                values.Add(sym switch
                {
                    VariableSymbol <int> v => new IntValueNode(v.Value),
                    VariableSymbol <string> v => new StringValueNode(v.Value),
                    VariableSymbol <StateSymbol> v => new StateValueNode(v.Value),
                    StateSymbol s => new StateValueNode(s),
                    _ => throw new TheLanguageErrorException($"Unexpected variable type \"{ sym.GetType().Name }\""),
                });
示例#6
0
        public override ValueNode VisitGridPoint(CoronaParser.GridPointContext context)
        {
            BuildExpressionAst exprVisitor = new BuildExpressionAst();

            // Extract the two expressions
            CoronaParser.ExprContext[] exprs  = context.expr();
            ExpressionNode             first  = exprVisitor.Visit(exprs[0]);
            ExpressionNode             second = exprVisitor.Visit(exprs[1]);

            // Extract member if present
            IdentifierValueNode member = null;

            if (context.member() != null)
            {
                member = (IdentifierValueNode)Visit(context.member());
            }

            return(new GridValueNode(first, second, member));
        }
        public override StatementNode VisitIdentifierAssignStatement([NotNull] CoronaParser.IdentifierAssignStatementContext context)
        {
            BuildValueAst      valueVisitor = new BuildValueAst();
            BuildExpressionAst exprVisitor  = new BuildExpressionAst();

            try
            {
                IdentifierValueNode id = valueVisitor.Visit(context.identifierValue()) as IdentifierValueNode;

                // Get value
                ValueNode value;
                if (context.expr() != null)
                {
                    value = exprVisitor.Visit(context.expr());
                }
                else
                {
                    value = new StringValueNode(context.STRING().GetText());
                }

                return(new IdentifierAssignmentStatementNode(id, value));
            }
            catch (TheLanguageErrorException e) { throw new TheLanguageErrorException("Identifier assignment statement", e); }
        }
示例#8
0
        public void Visit(IdentifierValueNode identifierValueNode)
        {
            SymbolTableEntry entry;

            try
            {
                entry = symbolTable.RetrieveSymbolInParentScope(identifierValueNode.Identifier);
            }
            catch (Exception e)
            {
                DazelLogger.EmitError(e.Message, identifierValueNode.Token);
                return;
            }

            if (entry is VariableSymbolTableEntry variableSymbolTableEntry)
            {
                ExpressionNode expression = variableSymbolTableEntry.ValueNode;
                SetNumericalExpression(identifierValueNode, expression, entry.Type);
            }

            SymbolTableEntry symbolTableEntry = symbolTable.RetrieveSymbolInParentScope(identifierValueNode.Identifier);

            typeHandler.SetType(symbolTableEntry.Type, identifierValueNode.Token);
        }
示例#9
0
 public void Visit(IdentifierValueNode identifierValueNode)
 {
     sb.Append(identifierValueNode.Identifier);
 }
示例#10
0
 public ReturnMemberNode(IdentifierValueNode id, ValueNode value)
 {
     ID    = id;
     Value = value;
 }
示例#11
0
 public MemberAssignmentStatementNode(GridValueNode gridPoint, IdentifierValueNode memberID, ValueNode value)
 {
     GridPoint = gridPoint;
     MemberID  = memberID;
     Value     = value;
 }
示例#12
0
 public void Visit(IdentifierValueNode identifierValueNode)
 {
 }
示例#13
0
 public ReturnStatementNode(IdentifierValueNode id)
 {
     Identifier = id;
 }
 public GridAssignmentStatementNode(GridValueNode gridPoint, IdentifierValueNode id)
 {
     GridPoint  = gridPoint;
     Identifier = id;
 }
示例#15
0
 public void Visit(IdentifierValueNode identifierValueNode)
 {
     identifierValueNode.ValueNode.Accept(this);
 }
 public IdentifierAssignmentStatementNode(IdentifierValueNode id, ValueNode value)
 {
     Identifier = id;
     Value      = value;
 }
示例#17
0
 public AdvancedReturnStatementNode(IdentifierValueNode id, List <ReturnMemberNode> returnMembers)
     : base(id)
 {
     ReturnMembers = returnMembers;
 }