예제 #1
0
        public Node ProcedureDeclaration()
        {
            Expect(TokenCategory.PROCEDURE);
            var procedure_node = new ProcedureDeclarationNode()
            {
                AnchorToken = Expect(TokenCategory.IDENTIFIER)
            };

            Expect(TokenCategory.PARENTHESIS_OPEN);

            procedure_node.Add(new ParameterDeclarationNode()
            {
                ZeroOrMore(TokenCategory.IDENTIFIER, ParameterDeclaration)
            });

            Expect(TokenCategory.PARENTHESIS_CLOSE);

            var typeNode = Optional(TokenCategory.COLON, Type, true);

            if (typeNode == null)
            {
                typeNode = new VoidTypeNode();
            }
            procedure_node.Add(typeNode);

            Expect(TokenCategory.SEMICOLON);
            procedure_node.Add(Optional(TokenCategory.CONST, () =>
            {
                var node = new ConstantListNode()
                {
                    AnchorToken = Expect(TokenCategory.CONST)
                };
                node.Add(OneOrMore(TokenCategory.IDENTIFIER, ConstantDeclaration));
                return(node);
            }));

            procedure_node.Add(Optional(TokenCategory.VAR, () =>
            {
                var node = new VariableDeclarationNode()
                {
                    AnchorToken = Expect(TokenCategory.VAR)
                };
                node.Add(OneOrMore(TokenCategory.IDENTIFIER, VariableDeclaration));
                return(node);
            }));

            Expect(TokenCategory.BEGIN);

            procedure_node.Add(new StatementListNode()
            {
                ZeroOrMore(firstOfStatement, Statement)
            });

            Expect(TokenCategory.END);
            Expect(TokenCategory.SEMICOLON);

            return(procedure_node);
        }
예제 #2
0
        private TypeNode ReturnType()
        {
            TypeNode           itsAST = null; // in case there is a syntactic error
            SourceCodePosition itsPos = _currentToken.SourcePosition;

            if (Array.Exists(_typeFirstSet, e => e == _currentToken.Type))
            {
                itsAST = Type();
            }
            else if (_currentToken.Type == Token.TokenType.Void)
            {
                itsAST = new VoidTypeNode(itsPos);
                Accept(Token.TokenType.Void);
            }
            else
            {
                Error("Expected int, real, string, boolean, identifier, void or array type");
            }
            return(itsAST);
        }
예제 #3
0
 public object Visit(VoidTypeNode n, object o)
 {
     return(null);
 }
예제 #4
0
 public void Visit(VoidTypeNode node)
 {
     builder.Append("void");
 }
예제 #5
0
 public Type Visit(VoidTypeNode node)
 {
     return(Type.VOID);
 }
예제 #6
0
 public object Visit(VoidTypeNode n, object o)
 {
     Append("void");
     return(null);
 }