Пример #1
0
        public override AbstractSyntaxTreeNode applyToBlockDeclaration(BlockDeclaration operand)
        {
            Context.pushScope();
            var blockDeclaration = Context.newBlockDeclarationNode();

            operand.parametersDo(
                parameter => Context.Scope.declareParameter(parameter.Name,
                                                            (existingDeclaration) => {
                Context.markAsUncompilable();
                compiler.handleParameterNameCollision(existingDeclaration.NameString, parameter.Span);
                return(existingDeclaration.IsParameter ? (ParameterDeclaration)existingDeclaration : Context.Scope.declareParameter("parameter$" + parameter.Name, null));
            }));
            if (Context.Scope.IsRoot)
            {
                Context.rootParametersDo(
                    parameter => Context.Scope.declareParameter(parameter,
                                                                (NamedValueDeclaration existingDeclaration) => {
                    Context.markAsUncompilable();
                    compiler.handleParameterNameCollision(existingDeclaration.NameString, SourceSpan.None);
                    return(existingDeclaration.IsParameter ? (ParameterDeclaration)existingDeclaration : Context.Scope.declareParameter("rootParameter$" + parameter.Name, null));
                }));
            }
            if (operand.HasBody)
            {
                blockDeclaration.Body = (ExecutableCodeNode)operand.Body.valueBy(this);
            }
            Context.popScope();
            return(blockDeclaration);
        }
Пример #2
0
 public CodeBlock(CodeElement parent) : base(parent)
 {
     StartBlock = new BlockDeclaration(this);
     EndBlock   = new BlockEnd(this);
 }
Пример #3
0
 public virtual T applyToBlockDeclaration(BlockDeclaration operand)
 {
     return(applyToParseTreeNode(operand));
 }
Пример #4
0
        public override bool TryParse(TokenStack tokens, out GraphNode node)
        {
            var source = new Queue <Token>();

            string blockIdentifier = null;
            bool   isMain          = false;

            if (tokens.ExpectSequence(TokenType.BlockKeyword, TokenType.MainKeyword, TokenType.Identifier, TokenType.OpenCurlyBraceSymbol))
            {
                var blockKeyword = tokens.Pop();
                var mainKeyword  = tokens.Pop();
                var identifier   = tokens.Pop();
                var openBrace    = tokens.Pop();

                source.Enqueue(blockKeyword);
                source.Enqueue(mainKeyword);
                source.Enqueue(identifier);
                source.Enqueue(openBrace);

                blockIdentifier = identifier.Value;
                isMain          = true;
            }
            else if (tokens.ExpectSequence(TokenType.BlockKeyword, TokenType.Identifier, TokenType.OpenCurlyBraceSymbol))
            {
                var blockKeyword = tokens.Pop();
                var identifier   = tokens.Pop();
                var openBrace    = tokens.Pop();

                source.Enqueue(blockKeyword);
                source.Enqueue(identifier);
                source.Enqueue(openBrace);

                blockIdentifier = identifier.Value;
            }
            else
            {
                while (source.Count > 0)
                {
                    tokens.Push(source.Dequeue());
                }

                // TODO: syntax error
                node = null;
                return(false);
            }

            var blockChildren = new List <GraphNode>();

            while (tokens.Peek().TokenType != TokenType.CloseCurlyBraceSymbol)
            {
                var bodySyntax = new BodySyntax();
                if (bodySyntax.TryParse(tokens, out GraphNode body))
                {
                    blockChildren.Add(body);
                }
                else
                {
                    while (source.Count > 0)
                    {
                        tokens.Push(source.Dequeue());
                    }

                    // TODO: syntax error
                    node = null;
                    return(false);
                }
            }

            source.Enqueue(tokens.Pop());

            node = new BlockDeclaration(source, blockIdentifier, isMain, blockChildren.ToArray());
            return(true);
        }