// 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 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)); }
// 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); }