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); }
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())); }
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); } }
/// <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) { }