public override void EnterVarDecl([NotNull] DaedalusParser.VarDeclContext context) { if (context.Parent.Parent is DaedalusParser.DaedalusFileContext || _assemblyBuilder.IsContextInsideExecBlock()) { var typeName = context.typeReference().GetText(); var type = DatSymbolTypeFromString(typeName); if (type == DatSymbolType.Class) { type = DatSymbolType.Instance; } for (int i = 0; i < context.ChildCount; i++) { var varContext = context.GetChild(i); if (varContext is TerminalNodeImpl) { continue; // skips ',' } if (varContext is DaedalusParser.VarValueDeclContext varValueContext) { var name = varValueContext.nameNode().GetText(); if (_assemblyBuilder.IsContextInsideExecBlock()) { // TODO consider making assemblyBuilder.active public and using it here BaseExecBlockContext baseExecBlock = _assemblyBuilder.ExecBlocks.Last(); string execBlockName = baseExecBlock.GetSymbol().Name; name = $"{execBlockName}.{name}"; } var location = GetLocation(context); int parentIndex = DatSymbol.NULL_INDEX; string parameterTypeName = context.typeReference().GetText(); DatSymbolType?parameterType = DatSymbolTypeFromString(parameterTypeName); if (parameterType is DatSymbolType.Class) { var parentSymbol = _assemblyBuilder.ResolveSymbol(parameterTypeName); parentIndex = parentSymbol.Index; } var symbol = SymbolBuilder.BuildVariable(name, type, location, parentIndex); // TODO : Validate params _assemblyBuilder.AddSymbol(symbol); } if (varContext is DaedalusParser.VarArrayDeclContext varArrayContext) { var name = varArrayContext.nameNode().GetText(); var location = GetLocation(context); var size = EvaluatorHelper.EvaluteArraySize(varArrayContext.arraySize(), _assemblyBuilder); var symbol = SymbolBuilder.BuildArrOfVariables(name, type, (uint)size, location); // TODO : Validate params _assemblyBuilder.AddSymbol(symbol); } } } }
public override void EnterParameterDecl(DaedalusParser.ParameterDeclContext context) { BaseExecBlockContext baseExecBlock = _assemblyBuilder.ExecBlocks.Last(); string execBlockName = baseExecBlock.GetSymbol().Name; string parameterLocalName = context.nameNode().GetText(); string parameterName = $"{execBlockName}.{parameterLocalName}"; int parentIndex = DatSymbol.NULL_INDEX; string parameterTypeName = context.typeReference().GetText(); DatSymbolType?parameterType = DatSymbolTypeFromString(parameterTypeName); if (parameterType is DatSymbolType.Class) { parameterType = DatSymbolType.Instance; var parentSymbol = _assemblyBuilder.ResolveSymbol(parameterTypeName); parentIndex = parentSymbol.Index; } DatSymbol symbol; var location = GetLocation(context); var arraySizeContext = context.arraySize(); if (arraySizeContext != null) { if (!uint.TryParse(arraySizeContext.GetText(), out var arrIndex)) { var constSymbol = _assemblyBuilder.ResolveSymbol(arraySizeContext.GetText()); if (constSymbol.Flags != DatSymbolFlag.Const || constSymbol.Type != DatSymbolType.Int) { throw new Exception($"Expected integer constant: {arraySizeContext.GetText()}"); } arrIndex = (uint)(int)constSymbol.Content[0]; } symbol = SymbolBuilder.BuildArrOfVariables(parameterName, parameterType.Value, arrIndex, location); } else { if (_assemblyBuilder.IsCurrentlyParsingExternals) { symbol = SymbolBuilder.BuildExternalParameter(parameterName, parameterType.Value, location, parentIndex); } else { symbol = SymbolBuilder.BuildParameter(parameterName, parameterType.Value, location, parentIndex); } } _assemblyBuilder.AddSymbol(symbol); }