Exemplo n.º 1
0
        protected virtual bool Statement()
        {
            if (IsLabel())
            {
                var label = new LabelNode(Token.Value) {Type = TokType};

                if (TokType == TokenType.LocalLabel)
                {
                    if (_lastRegularLabel != null)
                        label.BaseLabel = _lastRegularLabel;
                    else
                        throw new ApplicationException($"Перед локальной меткой нет регулярной метки, в позиции {Token.Position}");
                }

                if (TokType == TokenType.Label)
                    _lastRegularLabel = label;

                AST.Add(label);
                NextToken();
                return true;
            }

            if (!IsKeyword())
                return false;

            var kw = _keywords[Keyword];

            switch (kw.Value)
            {
                case Keywords.Include:
                    // TODO загрузить файл и создать новый экземпляр парсера
                    NextToken();
                    NextToken();
                    break;

                case Keywords.Module:
                    ModuleStatement();
                    break;

                case Keywords.If:
                case Keywords.Ifn:
                case Keywords.IfUsed:
                case Keywords.IfnUsed:
                    IfStatement();
                    break;

                case Keywords.Macro:
                    DefineMacroStatement();
                    break;

                case Keywords.Dup:
                    DupStatement();
                    break;

                default:
                    throw new ApplicationException($"неожиданное ключенов слово: {Keyword} , в позиции {Token.Position}");
            }

            return true;
        }
Exemplo n.º 2
0
        private void DupStatement()
        {
            NextToken();
            var dup = new DupNode(Expression());
            AST.EnterTo(dup);

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

                if (IfKeyword("edup", "erept"))
                {
                    AST.Leave();
                    NextToken();
                    _lastRegularLabel = null;
                    return;
                }

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