示例#1
0
        public override ASTNode VisitReference([NotNull] DaedalusParser.ReferenceContext context)
        {
            List <ReferencePartNode> referencePartNodes = new List <ReferencePartNode>();

            foreach (var referenceAtomContext in context.referenceAtom())
            {
                AttributeNode attributeNode = new AttributeNode(
                    referenceAtomContext.nameNode().GetText(),
                    GetLocation(referenceAtomContext)
                    );
                referencePartNodes.Add(attributeNode);

                if (referenceAtomContext.arrayIndex() != null)
                {
                    ArrayIndexNode arrayIndexNode = (ArrayIndexNode)VisitArrayIndex(referenceAtomContext.arrayIndex());
                    attributeNode.ArrayIndexNode = arrayIndexNode;
                    referencePartNodes.Add(arrayIndexNode);
                }
            }

            string name = ((AttributeNode)referencePartNodes[0]).Name;

            referencePartNodes.RemoveAt(0);
            ReferenceNode referenceNode = new ReferenceNode(name, referencePartNodes, GetLocation(context));

            ReferenceNodes.Add(referenceNode);
            return(referenceNode);
        }
示例#2
0
 public LazyReferenceAtomInstructions(
     AssemblyBuilderSnapshot assemblyBuilderSnapshot,
     DaedalusParser.ReferenceContext referenceContext)
 {
     AssemblyBuilderSnapshot = assemblyBuilderSnapshot;
     ReferenceContext        = referenceContext;
 }
        public bool IsDottedReference(DaedalusParser.ReferenceContext referenceContext)
        {
            DaedalusParser.ReferenceAtomContext[] nodes = referenceContext.referenceAtom();

            if (nodes.Length > 2)
            {
                throw new Exception("Too many nodes in reference.");
            }
            return(nodes.Length == 2);
        }
        public DatSymbolReference GetDatSymbolReference(DaedalusParser.ReferenceContext referenceContext)
        {
            ErrorContext.Context = referenceContext;

            DaedalusParser.ReferenceAtomContext[] referenceAtoms = referenceContext.referenceAtom();
            DaedalusParser.ReferenceAtomContext   objectPart     = referenceAtoms[0];

            DatSymbolReference reference = new DatSymbolReference();

            DatSymbol symbol;

            try
            {
                symbol = GetReferenceAtomSymbol(referenceContext);
            }
            catch (UndeclaredIdentifierException)
            {
                Errors.Add(new UndeclaredIdentifierError(ErrorContext));
                return(reference);
            }

            if (IsDottedReference(referenceContext))
            {
                DaedalusParser.ReferenceAtomContext attributePart = referenceAtoms[1];
                string attributeName = attributePart.Identifier().GetText();
                try
                {
                    reference.Attribute = ResolveAttribute(symbol, attributeName);
                }
                catch (AttributeNotFoundException)
                {
                    Errors.Add(new AttributeNotFoundError(ErrorContext));
                    return(reference);
                }

                reference.Index = GetArrayIndex(attributePart);
            }
            else
            {
                reference.Index = GetArrayIndex(objectPart);
            }

            reference.Object = symbol;

            return(reference);
        }
        public DatSymbol GetReferenceAtomSymbol(DaedalusParser.ReferenceContext referenceContext)
        {
            var    referenceAtoms          = referenceContext.referenceAtom();
            var    referenceAtom           = referenceAtoms[0];
            string symbolNameLower         = referenceAtom.Identifier().GetText().ToLower();
            bool   isSymbolNameSelfKeyword = symbolNameLower == "slf" || symbolNameLower == "self";


            if (ActiveExecBlock != null && isSymbolNameSelfKeyword)
            {
                bool          isDottedReference = IsDottedReference(referenceContext);
                DatSymbolType activeSymbolType  = ActiveExecBlock.GetSymbol().Type;

                if (
                    activeSymbolType == DatSymbolType.Instance ||
                    (activeSymbolType == DatSymbolType.Prototype && isDottedReference)
                    )
                {
                    return(ActiveExecBlock.GetSymbol());
                }
            }

            return(ResolveSymbol(referenceAtom.Identifier().GetText()));
        }
示例#6
0
        public override void ExitReference(DaedalusParser.ReferenceContext referenceContext)
        {
            if (referenceContext.Parent is DaedalusParser.AssignmentContext)
            {
                // left side of assignment
                return;
            }

            List <AssemblyElement> instructions = new List <AssemblyElement>();

            if (_assemblyBuilder.IsInsideArgList || _assemblyBuilder.IsInsideAssignment || _assemblyBuilder.IsInsideIfCondition || _assemblyBuilder.IsInsideReturnStatement)
            {
                instructions.Add(new LazyReferenceAtomInstructions(_assemblyBuilder.MakeSnapshot(), referenceContext));
            }
            else
            {
                instructions = _assemblyBuilder.GetDatSymbolReferenceInstructions(referenceContext);
            }

            if (!_assemblyBuilder.IsInsideConstDef)
            {
                _assemblyBuilder.AddInstructions(instructions);
            }
        }
示例#7
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="DaedalusParser.reference"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitReference([NotNull] DaedalusParser.ReferenceContext context)
 {
     return(VisitChildren(context));
 }
        public List <AssemblyElement> GetDatSymbolReferenceInstructions(DaedalusParser.ReferenceContext referenceContext)
        {
            DatSymbolReference reference = GetDatSymbolReference(referenceContext);

            return(GetDatSymbolReferenceInstructions(reference));
        }
 /// <summary>
 /// Exit a parse tree produced by <see cref="DaedalusParser.reference"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitReference([NotNull] DaedalusParser.ReferenceContext context)
 {
 }