// Parse a statement list.
        protected internal void ParseList(Token token, ICodeNode parentNode, PascalTokenType terminator, PascalErrorCode errorCode)
        {
            // Loop to parse each statement until the END token or the end of the source file.
            while (!(token is EofToken) && (token.type != terminator))
            {
                // Parse a statement.  The parent node adopts the statement node.
                ICodeNode statementNode = Parse(token);
                parentNode.AddChild(statementNode);

                token = CurrentToken();
                TokenType tokenType = token.type;

                // Look for semicolon between statements.
                if (tokenType == PascalTokenType.SEMICOLON)
                    token = NextToken();

                // If at the start of the next assignment statement, then missing a semicolon.
                else if (tokenType == PascalTokenType.IDENTIFIER)
                    errorHandler.flag(token, PascalErrorCode.MISSING_SEMICOLON, this);

                else if (tokenType != terminator)
                {
                    errorHandler.flag(token, PascalErrorCode.UNEXPECTED_TOKEN, this);
                    token = NextToken();
                }
            }

            if (token.type == terminator)
                token = NextToken();
            else
                errorHandler.flag(token, errorCode, this);
        }
Esempio n. 2
0
        private static TokenTypeMetadata GetTokenTypeMetadata(this PascalTokenType type)
        {
            var attribute = type.GetAttribute <TokenTypeAttribute>();

            if (attribute == null)
            {
                return(new TokenTypeMetadata(type.ToString().ToLower()));
            }

            return(new TokenTypeMetadata(attribute.Text));
        }
Esempio n. 3
0
        // Parse a statement list.
        protected internal void ParseList(Token token, ICodeNode parentNode, PascalTokenType terminator, PascalErrorCode errorCode)
        {
            // Loop to parse each statement until the END token or the end of the source file.
            while (!(token is EofToken) && (token.type != terminator))
            {
                // Parse a statement.  The parent node adopts the statement node.
                ICodeNode statementNode = Parse(token);
                parentNode.AddChild(statementNode);

                token = CurrentToken();
                TokenType tokenType = token.type;

                // Look for semicolon between statements.
                if (tokenType == PascalTokenType.SEMICOLON)
                {
                    token = NextToken();
                }

                // If at the start of the next assignment statement, then missing a semicolon.
                else if (tokenType == PascalTokenType.IDENTIFIER)
                {
                    errorHandler.flag(token, PascalErrorCode.MISSING_SEMICOLON, this);
                }

                else if (tokenType != terminator)
                {
                    errorHandler.flag(token, PascalErrorCode.UNEXPECTED_TOKEN, this);
                    token = NextToken();
                }
            }

            if (token.type == terminator)
            {
                token = NextToken();
            }
            else
            {
                errorHandler.flag(token, errorCode, this);
            }
        }
        private ICodeNode ParseExpression(Token token)
        {
            ICodeNode rootNode = ParseSimpleExpression(token);

            token = CurrentToken();
            PascalTokenType tokenType = (PascalTokenType)token.type; // TokenType in original Java

            // Look for relational operator
            if (REL_OPS.Contains(tokenType))
            {
                // Create a new operator node and adopt the current tree as its first child.
                ICodeNodeType nodeType = REL_OPS_MAP[tokenType];
                ICodeNode     opNode   = ICodeFactory.CreateICodeNode(nodeType);
                opNode.AddChild(rootNode);

                token = NextToken();
                opNode.AddChild(ParseSimpleExpression(token));
                rootNode = opNode;
            }

            return(rootNode);
        }