Exemple #1
0
        public void AddModule(Module module)
        {
            Modules.Add(module.Name, module);

            ParentNode<Keywords> current = module;
            var name = module.Name;
            while (true)
            {
                var parent = GetParent(current);

                if (parent != null && parent != Root)
                {
                    current = parent;
                    name = current.Name + "." + name;
                    continue;
                }
                break;
            }

            Identifers.Add(name, module);
        }
Exemple #2
0
        /// <summary>
        /// "module" Ident { Statement } ("endmod"|"endmodule")
        /// </summary>
        private void ModuleStatement()
        {
            NextToken();
            var module = new Module(ModuleName());
            AST.EnterTo(module);
            AST.AddModule(module);

            while (TokType != TokenType.EndFile)
            {
                if (TokType == TokenType.EndLine)
                {
                    NextToken();
                    continue;
                }

                if (IfKeyword("endmod", "endmodule"))
                {
                    AST.Leave();
                    NextToken();
                    return;
                }

                IfError(!Statement(), "Ожидается оператор");
            }

            throw new ApplicationException("Неожиданный конец файла");
        }
Exemple #3
0
        private void DefineMacroStatement()
        {
            NextToken();
            var macro = new Module(Identifer());
            AST.EnterTo(macro);
            AST.AddModule(macro);

            while (TokType != TokenType.EndFile)
            {
                if (TokType == TokenType.EndLine)
                {
                    NextToken();
                    continue;
                }

                if (IfKeyword("endm"))
                {
                    AST.Leave();
                    NextToken();
                    return;
                }

                if (TokType == TokenType.TempLabel)
                    throw new ApplicationException($"В макросах запрещенно использовать временные метки, в позиции {Token.Position}");

                IfError(!Statement(), $"Ожидается оператор, в позиции {Token.Position}");
            }

            throw new ApplicationException("Неожиданный конец файла");
        }