private ConstDefinitionsTemporaryNode GetConstDefinitionsTemporaryNode(DaedalusParser.ConstDefContext constDefContext) { NameNode typeNameNode = new NameNode(GetLocation(constDefContext.dataType()), constDefContext.dataType().GetText()); List <DeclarationNode> constDefinitionNodes = new List <DeclarationNode>(); foreach (IParseTree childContext in constDefContext.children) { if (childContext is DaedalusParser.ConstValueDefContext constValueDefContext) { DaedalusParser.NameNodeContext nameNodeContext = constValueDefContext.nameNode(); NameNode nameNode = new NameNode(GetLocation(nameNodeContext), nameNodeContext.GetText()); ExpressionNode rightSideNode = (ExpressionNode)Visit(constValueDefContext.constValueAssignment().expression()); ConstDefinitionNode constDefinitionNode = new ConstDefinitionNode(GetLocation(constValueDefContext), typeNameNode, nameNode, rightSideNode); _constDefinitionNodes.Add(constDefinitionNode); constDefinitionNodes.Add(constDefinitionNode); } else if (childContext is DaedalusParser.ConstArrayDefContext constArrayDefContext) { DaedalusParser.NameNodeContext nameNodeContext = constArrayDefContext.nameNode(); NameNode nameNode = new NameNode(GetLocation(nameNodeContext), nameNodeContext.GetText()); ExpressionNode arraySizeNode = (ExpressionNode)VisitArraySize(constArrayDefContext.arraySize()); List <ExpressionNode> elementNodes = new List <ExpressionNode>(); foreach (DaedalusParser.ExpressionContext expressionContext in constArrayDefContext.constArrayAssignment().expression()) { elementNodes.Add((ExpressionNode)Visit(expressionContext)); } ConstArrayDefinitionNode constArrayDefinitionNode = new ConstArrayDefinitionNode(GetLocation(nameNodeContext), typeNameNode, nameNode, arraySizeNode, elementNodes); _arrayDeclarationNodes.Add(constArrayDefinitionNode); constDefinitionNodes.Add(constArrayDefinitionNode); } } return(new ConstDefinitionsTemporaryNode(GetLocation(constDefContext), constDefinitionNodes)); }
/// <summary> /// Visit a parse tree produced by <see cref="DaedalusParser.constDef"/>. /// <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 VisitConstDef([NotNull] DaedalusParser.ConstDefContext context) { return(VisitChildren(context)); }
public override void ExitConstDef([NotNull] DaedalusParser.ConstDefContext context) { _assemblyBuilder.IsInsideConstDef = false; }
public override void EnterConstDef([NotNull] DaedalusParser.ConstDefContext context) { _assemblyBuilder.IsInsideConstDef = true; var typeName = context.typeReference().GetText(); var type = DatSymbolTypeFromString(typeName); if (type == DatSymbolType.Func) { type = DatSymbolType.Int; } for (int i = 0; i < context.ChildCount; i++) { var constContext = context.GetChild(i); if (constContext is TerminalNodeImpl) { continue; // skips ',' } if (constContext is DaedalusParser.ConstValueDefContext constValueContext) { var name = constValueContext.nameNode().GetText(); if (_assemblyBuilder.IsContextInsideExecBlock()) { BaseExecBlockContext baseExecBlock = _assemblyBuilder.ExecBlocks.Last(); string execBlockName = baseExecBlock.GetSymbol().Name; name = $"{execBlockName}.{name}"; } var location = GetLocation(context); var assignmentExpression = constValueContext.constValueAssignment().expressionBlock().expression(); var value = EvaluatorHelper.EvaluateConst(assignmentExpression, _assemblyBuilder, type); var symbol = SymbolBuilder.BuildConst(name, type, value, location); // TODO : Validate params _assemblyBuilder.AddSymbol(symbol); continue; } if (constContext is DaedalusParser.ConstArrayDefContext constArrayContext) { _assemblyBuilder.ErrorContext.Context = constArrayContext; var name = constArrayContext.nameNode().GetText(); var location = GetLocation(context); int declaredSize = 0; bool compareDeclaredSizeAndElementsCount = true; try { _assemblyBuilder.ErrorContext.Context = constArrayContext.arraySize(); declaredSize = EvaluatorHelper.EvaluteArraySize(constArrayContext.arraySize(), _assemblyBuilder); } catch (System.ArgumentNullException) { compareDeclaredSizeAndElementsCount = false; } if (declaredSize == 0 && compareDeclaredSizeAndElementsCount) { compareDeclaredSizeAndElementsCount = false; _assemblyBuilder.Errors.Add( new InvalidArraySizeError( _assemblyBuilder.ErrorContext, name, declaredSize ) ); } var elements = constArrayContext.constArrayAssignment().expressionBlock() .Select(expr => EvaluatorHelper.EvaluateConst(expr.expression(), _assemblyBuilder, type)) .ToArray(); if (compareDeclaredSizeAndElementsCount && declaredSize != elements.Length) { _assemblyBuilder.Errors.Add( new InconsistentArraySizeError( _assemblyBuilder.ErrorContext, name, declaredSize, elements.Length ) ); } var symbol = SymbolBuilder.BuildArrOfConst(name, type, elements, location); // TODO : Validate params _assemblyBuilder.AddSymbol(symbol); } } }
public override ASTNode VisitConstDef([NotNull] DaedalusParser.ConstDefContext context) { return(GetConstDefinitionsTemporaryNode(context)); }
/// <summary> /// Exit a parse tree produced by <see cref="DaedalusParser.constDef"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitConstDef([NotNull] DaedalusParser.ConstDefContext context) { }