예제 #1
0
        /// <summary>
        /// Translate the given parse tree node into a GMac frame
        /// </summary>
        /// <param name="context"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        public static GMacFrame Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(RoleNames.Frame, node);

            var translator = new GMacFrameGenerator();//new GMacFrameGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            //MasterPool.Release(translator);

            var frame = translator._generatedFrame;

            if (frame == null)
            {
                return(null);
            }

            if (frame.BaseFrame != null)
            {
                DefineFrameDefaultSymbols(frame.BaseFrame, context);
            }

            DefineFrameDefaultSymbols(frame, context);

            return(frame);
        }
예제 #2
0
        public static LanguageSymbol Translate_Direct(GMacSymbolTranslatorContext context, ParseTreeNode node, TrimmedList <string> qualList)
        {
            var valAccess = Translate(context, node, false, qualList);

            return
                (valAccess.IsFullAccess
                ? valAccess.RootSymbol
                : context.CompilationLog.RaiseGeneratorError <LanguageSymbol>("Expecting a direct r-value", node));
        }
예제 #3
0
        private void SetContext(TrimmedList <string> qualList, GMacSymbolTranslatorContext context, bool isLvalue, bool followScopeChain)
        {
            SetContext(context);

            _isLValue         = isLvalue;
            _followScopeChain = followScopeChain;
            _qualList         = new TrimmedList <string>(qualList);

            _generatedValueAccess = null;
        }
예제 #4
0
        public static ILanguageType Translate_Direct_LanguageType(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            var valAccess = Translate(context, node, false);

            if (valAccess.IsFullAccess && valAccess.RootSymbol is ILanguageType)
            {
                return((ILanguageType)valAccess.RootSymbol);
            }

            return(context.CompilationLog.RaiseGeneratorError <ILanguageType>("Expecting a language type", node));
        }
예제 #5
0
        public static LanguageSymbol Translate_Direct(GMacSymbolTranslatorContext context, ParseTreeNode node, string acceptedRoleName)
        {
            var valAccess = Translate(context, node, false);

            if (valAccess.IsFullAccess && acceptedRoleName == valAccess.RootSymbol.SymbolRoleName)
            {
                return(valAccess.RootSymbol);
            }

            return(context.CompilationLog.RaiseGeneratorError <SymbolWithScope>("Expecting a direct symbol with role: " + acceptedRoleName, node));
        }
예제 #6
0
        internal static GMacAst Translate(GMacSymbolTranslatorContext context, bool translateNamespaceFirst = true)
        {
            var translator = new GMacAstGenerator()
            {
                _translateNamespaceFirst = translateNamespaceFirst
            };

            translator.SetContext(context);
            translator.Translate();

            var result = translator._generatedGMacSymbolTable;

            //MasterPool.Release(translator);

            return(result);
        }
예제 #7
0
        public static List <LanguageCommand> Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(node);

            var translator = new GMacCommandGenerator();//new GMacCommandGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            var result = translator._generatedCommands;

            //MasterPool.Release(translator);

            return(result);
        }
        public static List <GMacMacro> Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(RoleNames.MacroTemplate, node);

            var translator = new GMacTemplatesImplementationGenerator();//new GMacTemplatesImplementationGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            var result = translator._generatedMacros;

            //MasterPool.Release(translator);

            return(result);
        }
예제 #9
0
        public static GMacMultivectorTransform Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(RoleNames.Transform, node);

            var translator = new GMacTransformGenerator();//new GMacTransformGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            var result = translator._generatedTransform;

            //MasterPool.Release(translator);

            return(result);
        }
예제 #10
0
        public static GMacStructure Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(RoleNames.Structure, node);

            var translator = new GMacStructureGenerator();//new GMacStructureGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            var result = translator._generatedStructure;

            //MasterPool.Release(translator);

            return(result);
        }
        /// <summary>
        /// Translate the boolean pattern of a GMac frame subspace
        /// </summary>
        /// <param name="context"></param>
        /// <param name="node"></param>
        /// <param name="frame"></param>
        /// <returns></returns>
        public static MutableBooleanPattern Translate(GMacSymbolTranslatorContext context, ParseTreeNode node, GMacFrame frame)
        {
            context.PushState(node);

            var translator = new GMacFrameSubspacePatternGenerator();//new GMacFrameSubspacePatternGenerator(context, frame);

            translator.SetContext(context, frame);
            translator.Translate();

            context.PopState();

            var result = translator._generatedBooleanPattern;

            //MasterPool.Release(translator);

            return(result);
        }
예제 #12
0
        //public static bool TryTranslate_LValue(GMacSymbolTranslatorContext context, ParseTreeNode node, out LanguageValueAccess varAccess)
        //{
        //    var qualList = GenUtils.Translate_Qualified_Identifier(node);

        //    LanguageSymbol symbol;

        //    var flag =
        //        context
        //        .OpenedDistinctScopes()
        //        .LookupSymbol(qualList.FirstItem, out symbol);

        //    if (flag == false || (symbol is SymbolLValue) == false)
        //    {
        //        varAccess = null;
        //        return false;
        //    }

        //    varAccess = LanguageValueAccess.Create(symbol);

        //    return true;
        //}

        public static LanguageValueAccess Translate(GMacSymbolTranslatorContext context, ParseTreeNode node, bool isLvalue, TrimmedList <string> qualList)
        {
            context.PushState(node);

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

            translator.SetContext(qualList, context, isLvalue, true);
            translator.Translate();

            context.PopState();

            var result = translator._generatedValueAccess;

            //MasterPool.Release(translator);

            return(result);
        }
        public static CompositeExpression Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(node);

            var translator = new GMacExpressionCompositeGenerator();//new GMacExpressionCompositeGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            var result = translator._generatedExpression;

            //MasterPool.Release(translator);

            return(result);
        }
예제 #14
0
        public static LanguageSymbol Translate_Direct(GMacSymbolTranslatorContext context, ParseTreeNode node, IEnumerable <string> acceptedRoleNames)
        {
            var acceptedRoleNamesArray = acceptedRoleNames.ToArray();

            var valAccess = Translate(context, node, false);

            if (valAccess.IsFullAccess && acceptedRoleNamesArray.Contains(valAccess.RootSymbol.SymbolRoleName))
            {
                return(valAccess.RootSymbol);
            }

            var acceptedText =
                acceptedRoleNamesArray.Aggregate(
                    new StringBuilder(),
                    (s, roleName) => s.Append(roleName).Append(", "),
                    s => { s.Length -= 2; return(s.ToString()); }
                    );

            return(context.CompilationLog.RaiseGeneratorError <SymbolWithScope>("Expecting a direct symbol with role: " + acceptedText, node));
        }
예제 #15
0
        public static GMacMacro Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            //var eventId = context.CompilationLog.TimeCounter.StartEvent("macro gen");

            context.PushState(RoleNames.Macro, node);

            var translator = new GMacMacroGenerator();//new GMacMacroGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            var result = translator._generatedMacro;

            //MasterPool.Release(translator);

            //context.CompilationLog.TimeCounter.EndEvent(eventId);

            return(result);
        }
예제 #16
0
        private static void DefineFrameDefaultSymbols(GMacFrame frame, GMacSymbolTranslatorContext context)
        {
            if (GMacCompilerFeatures.DefineFrameDefaultSymbols == false)
            {
                return;
            }

            if (frame.DefaultSymbolsReady)
            {
                return;
            }

            var gmacCode = FrameLibrary.Generate(new AstFrame(frame));

            //context.CompilationLog.Trace.AppendLineAtNewLine("Generating default frame objects GMacDSL code");
            //context.CompilationLog.Trace.AppendLineAtNewLine(gmacCode);

            context.ParentProjectCompiler.CompileGeneratedCode(frame.SymbolAccessName + ".default.gmac", gmacCode);

            frame.DefaultSymbolsReady = true;
        }
예제 #17
0
        private static bool TryTranslate_LValue(GMacSymbolTranslatorContext context, ParseTreeNode node, out LanguageValueAccess varAccess)
        {
            var qualList = GenUtils.Translate_Qualified_Identifier(node);

            LanguageSymbol symbol;

            var flag =
                context
                .OpenedDistinctScopes()
                .LookupSymbol(qualList.FirstItem, out symbol);

            if (flag == false || (symbol is SymbolLValue) == false)
            {
                varAccess = null;
                return(false);
            }

            varAccess = LanguageValueAccess.Create(symbol);

            return(true);
        }
예제 #18
0
        public static ILanguageExpression Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(node);

            var translator = new GMacExpressionGenerator();//new GMacExpressionGenerator(context);

            var basicExprGen = new GMacExpressionBasicGenerator();

            basicExprGen.SetContext(context);

            translator.SetContext(basicExprGen);
            translator.Translate();

            context.PopState();

            var result = translator._generatedExpression;

            //MasterPool.Release(basicExprGen);
            //MasterPool.Release(translator);

            return(result);
        }
예제 #19
0
        public static LanguageValueAccess Translate_LValue_MacroParameter(GMacSymbolTranslatorContext context, ParseTreeNode node, GMacMacro macro)
        {
            context.PushState(macro.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 SymbolProcedureParameter)
            {
                var result = translator._generatedValueAccess;

                //MasterPool.Release(translator);

                return(result);
            }

            return(context.CompilationLog.RaiseGeneratorError <LanguageValueAccess>("Expecting a macro parameter", node));
        }
예제 #20
0
        /// <summary>
        /// Translate the given parse tree node into a GMac namespace
        /// </summary>
        /// <param name="context"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        public static GMacNamespace Translate(GMacSymbolTranslatorContext context, ParseTreeNode node)
        {
            context.PushState(RoleNames.Namespace, node);

            var translator = new GMacNamespaceGenerator();//new GMacNamespaceGenerator(context);

            translator.SetContext(context);
            translator.Translate();

            context.PopState();

            //Clear all opened scopes
            context.ClearOpenedScopes();

            //After translation is completed change the current scope to the translated namespace to make it the current namespace
            context.SetActiveState(translator._generatedNamespace.ChildSymbolScope, RoleNames.Namespace, node);

            var result = translator._generatedNamespace;

            //MasterPool.Release(translator);

            return(result);
        }
예제 #21
0
        //public override void ResetOnAcquire()
        //{
        //    base.ResetOnAcquire();

        //    _operand1 = null;
        //    _operand2 = null;
        //    _atomicOperand1 = null;
        //    _atomicOperand2 = null;
        //    _resultType = null;
        //}


        public void SetContext(GMacSymbolTranslatorContext context)
        {
            SetContext((SymbolTranslatorContext)context);
        }
        //public override void ResetOnAcquire()
        //{
        //    base.ResetOnAcquire();

        //    _frame = null;
        //    _generatedBooleanPattern = null;
        //}


        private void SetContext(GMacSymbolTranslatorContext context, GMacFrame frame)
        {
            SetContext(context);
            _frame = frame;
            _generatedBooleanPattern = new MutableBooleanPattern(frame.GaSpaceDimension, false);
        }
예제 #23
0
        //public override void ResetOnAcquire()
        //{
        //    base.ResetOnAcquire();

        //    _generatedGMacSymbolTable = null;
        //}


        private void SetContext(GMacSymbolTranslatorContext context)
        {
            SetContext((SymbolTranslatorContext)context);
            _generatedGMacSymbolTable = context.GMacRootAst;
        }