private LanguageValueAccess translate_FollowComponentsSequence(GMacStructure structure, LanguageValueAccess valAccess)
        {
            while (true)
            {
                //TODO: Search for a structure macro here

                SymbolStructureDataMember dataMember;

                if (structure.LookupDataMember(_qualList.FirstItem, out dataMember) == false)
                {
                    CompilationLog.RaiseGeneratorError <LanguageValueAccess>("Structure member '" + _qualList.FirstItem + "' not recognized", RootParseNode);
                }

                valAccess.Append(dataMember.ObjectName, dataMember.SymbolType);

                _qualList.IncreaseActiveStartOffset();

                if (_qualList.ActiveLength <= 0)
                {
                    return(valAccess);
                }

                if (!dataMember.SymbolType.IsStructure())
                {
                    return(CompilationLog.RaiseGeneratorError <LanguageValueAccess>("Data components not recognized", RootParseNode));
                }

                structure = (GMacStructure)dataMember.SymbolType;
            }
        }
Exemple #2
0
        public void Visit(GMacStructure structure)
        {
            var node = new TreeNode(structure.SymbolAccessName)
            {
                Tag = structure
            };

            RoleNodes[StructuresNode].Nodes.Add(node);
        }
Exemple #3
0
        private GMacMacro Create_Structure_Macro(GMacStructure structure, string macroName)
        {
            if (structure.CanDefineChildSymbol(macroName) == false)
            {
                CompilationLog.RaiseGeneratorError <int>("Symbol name already used", RootParseNode);
            }

            //Create the macro and add it to the symbol table
            return(structure.DefineStructureMacro(macroName));

            //TODO: add the 'this' parameter after the result parameter for structure macros
        }
Exemple #4
0
        private void translate_Structure()
        {
            try
            {
                Context.MarkCheckPointState();

                string          childSymbolName;
                SymbolWithScope parentSymbol;

                Translate_ParentSymbolAndChildSymbolName(RootParseNode.ChildNodes[0], out parentSymbol, out childSymbolName);

                var nameSpace = parentSymbol as GMacNamespace;

                if (nameSpace != null)
                {
                    _generatedStructure = Create_Namespace_Structure(nameSpace, childSymbolName);
                }

                else
                {
                    var frame = parentSymbol as GMacFrame;

                    if (frame != null)
                    {
                        _generatedStructure = Create_Frame_Structure(frame, childSymbolName);
                    }

                    else
                    {
                        CompilationLog.RaiseGeneratorError <int>("Expecting a Frame or Namespace scope", RootParseNode.ChildNodes[0]);
                    }
                }

                _generatedStructure.CodeLocation = Context.GetCodeLocation(RootParseNode);

                Context.UnmarkCheckPointState();
                Context.CompilationLog.ReportNormal("Translated Structure: " + _generatedStructure.SymbolAccessName, ProgressEventArgsResult.Success);
            }
            catch (CompilerException)
            {
                Context.RestoreToCheckPointState();
                Context.CompilationLog.ReportNormal("Translate Structure", ProgressEventArgsResult.Failure);
            }
            catch (Exception e)
            {
                Context.RestoreToCheckPointState();
                Context.CompilationLog.ReportError("Translate Structure Failed With Error", e);
            }
        }
        public TreeNode Visit(GMacStructure structure)
        {
            var node = new TreeNode("<STRUCTURE> " + structure.ObjectName)
            {
                Tag = structure
            };

            if (!ShowStructureMembers)
            {
                return(node);
            }

            foreach (var childSymbol in structure.DataMembers)
            {
                node.Nodes.Add(Visit(childSymbol));
            }

            return(node);
        }
Exemple #6
0
        public void Visit(GMacStructure structure)
        {
            Log.AppendAtNewLine("structure ");
            Log.Append(structure.SymbolAccessName);
            Log.AppendLine("(");

            Log.IncreaseIndentation();

            var flag = false;

            foreach (var dataMember in structure.DataMembers)
            {
                if (flag)
                {
                    Log.Append(", ");
                }
                else
                {
                    flag = true;
                }

                Log.AppendAtNewLine(dataMember.ObjectName);
                Log.Append(" : ");
                Log.Append(dataMember.SymbolTypeSignature);
            }

            Log.DecreaseIndentation();

            Log.AppendAtNewLine(")");

            foreach (var itam in structure.Macros)
            {
                itam.AcceptVisitor(this);
            }

            Log.AppendLineAtNewLine();
        }
        private ILanguageExpression translate_Expression_Function_Structure(GMacStructure structure, ILanguageExpressionAtomic defaultValueSource, ParseTreeNode node)
        {
            var operands = OperandsByValueAccess.Create();

            if (node.ChildNodes.Count == 0)
            {
                return
                    (defaultValueSource == null
                    ? structure.CreateConstructorExpression(operands)
                    : structure.CreateConstructorExpression(defaultValueSource, operands));
            }

            var expressionFunctionInputsNode = node.ChildNodes[0];

            var subNode = expressionFunctionInputsNode.ChildNodes[0];

            switch (subNode.Term.ToString())
            {
            case GMacParseNodeNames.ExpressionFunctionInputsAssignments:
                var expressionFunctionInputsAssignmentsNode = subNode;

                foreach (var nodeExpressionFunctionInputsAssignmentsItem in expressionFunctionInputsAssignmentsNode.ChildNodes)
                {
                    var lhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[0].ChildNodes[0];
                    var rhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[1];

                    var lhsValAccess = GMacValueAccessGenerator.Translate_LValue_StructureMember(Context, lhsNode, structure);

                    var rhsExpr =
                        BasicExpressionGenerator.Generate_PolyadicOperand(
                            lhsValAccess.ExpressionType,
                            GMacExpressionGenerator.Translate(BasicExpressionGenerator, rhsNode)
                            );

                    operands.AddOperand(lhsValAccess, rhsExpr);
                }

                break;

            case GMacParseNodeNames.ExpressionFunctionInputsExpressions:
                var expressionFunctionInputsExpressionsNode = subNode;

                var i = 0;

                foreach (var dataMember in structure.DataMembers)
                {
                    if (i >= expressionFunctionInputsExpressionsNode.ChildNodes.Count)
                    {
                        break;
                    }

                    var rhsNode = expressionFunctionInputsExpressionsNode.ChildNodes[i];

                    var lhsValAccess = LanguageValueAccess.Create(dataMember);

                    var rhsExpr =
                        BasicExpressionGenerator.Generate_PolyadicOperand(
                            lhsValAccess.ExpressionType,
                            GMacExpressionGenerator.Translate(BasicExpressionGenerator, rhsNode)
                            );

                    operands.AddOperand(lhsValAccess, rhsExpr);

                    i = i + 1;
                }

                if (expressionFunctionInputsExpressionsNode.ChildNodes.Count > i)
                {
                    return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of at most " + i + " expression as input to the structure construction", node));
                }

                break;

            default:
                return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of expressions or a list of member assignments as input to the structure construction", node));
            }

            return
                (defaultValueSource == null
                ? structure.CreateConstructorExpression(operands)
                : structure.CreateConstructorExpression(defaultValueSource, operands));
        }
Exemple #8
0
 internal AstValueStructureTerm(GMacStructure structure, string dataMemberName, ILanguageValue dataMemberValue)
 {
     AssociatedStructure = structure;
     DataMemberName      = dataMemberName;
     TermDataMemberValue = dataMemberValue;
 }
        public static LanguageValueAccess Translate_LValue_StructureMember(GMacSymbolTranslatorContext context, ParseTreeNode node, GMacStructure structure)
        {
            context.PushState(structure.ChildSymbolScope, node);

            var translator = new GMacValueAccessGenerator();//new GMacValueAccessGenerator(context, true, false);

            translator.SetContext(context, true, false);
            translator.Translate();

            context.PopState();

            if (translator._generatedValueAccess.RootSymbol is SymbolStructureDataMember)
            {
                var result = translator._generatedValueAccess;

                //MasterPool.Release(translator);

                return(result);
            }

            return(context.CompilationLog.RaiseGeneratorError <LanguageValueAccess>("Expecting a structure member", node));
        }
Exemple #10
0
 internal static AstStructure ToAstStructure(this GMacStructure structure)
 {
     return(new AstStructure(structure));
 }
Exemple #11
0
 internal AstStructure(GMacStructure structure)
 {
     AssociatedStructure = structure;
 }