internal virtual void AssignTokenTypes(Grammar g, IList<GrammarAST> tokensDefs, IList<GrammarAST> tokenIDs, IList<GrammarAST> terminals) { //Grammar G = g.getOutermostGrammar(); // put in root, even if imported // create token types for tokens { A, B, C } ALIASES foreach (GrammarAST alias in tokensDefs) { if (g.GetTokenType(alias.Text) != TokenConstants.InvalidType) { g.tool.errMgr.GrammarError(ErrorType.TOKEN_NAME_REASSIGNMENT, g.fileName, alias.Token, alias.Text); } g.DefineTokenName(alias.Text); } // DEFINE TOKEN TYPES FOR TOKEN REFS LIKE ID, INT foreach (GrammarAST idAST in tokenIDs) { if (g.GetTokenType(idAST.Text) == TokenConstants.InvalidType) { g.tool.errMgr.GrammarError(ErrorType.IMPLICIT_TOKEN_DEFINITION, g.fileName, idAST.Token, idAST.Text); } g.DefineTokenName(idAST.Text); } // VERIFY TOKEN TYPES FOR STRING LITERAL REFS LIKE 'while', ';' foreach (GrammarAST termAST in terminals) { if (termAST.Type != ANTLRParser.STRING_LITERAL) { continue; } if (g.GetTokenType(termAST.Text) == TokenConstants.InvalidType) { g.tool.errMgr.GrammarError(ErrorType.IMPLICIT_STRING_DEFINITION, g.fileName, termAST.Token, termAST.Text); } } g.tool.Log("semantics", "tokens=" + g.tokenNameToTypeMap); g.tool.Log("semantics", "strings=" + g.stringLiteralToTypeMap); }
/** * Assign constant values to custom channels defined in a grammar. * * @param g The grammar. * @param channelDefs A collection of AST nodes defining individual channels * within a {@code channels{}} block in the grammar. */ internal virtual void AssignChannelTypes(Grammar g, IList<GrammarAST> channelDefs) { Grammar outermost = g.GetOutermostGrammar(); foreach (GrammarAST channel in channelDefs) { string channelName = channel.Text; // Channel names can't alias tokens or modes, because constant // values are also assigned to them and the ->channel(NAME) lexer // command does not distinguish between the various ways a constant // can be declared. This method does not verify that channels do not // alias rules, because rule names are not associated with constant // values in ANTLR grammar semantics. if (g.GetTokenType(channelName) != TokenConstants.InvalidType) { g.tool.errMgr.GrammarError(ErrorType.CHANNEL_CONFLICTS_WITH_TOKEN, g.fileName, channel.Token, channelName); } if (LexerATNFactory.COMMON_CONSTANTS.ContainsKey(channelName)) { g.tool.errMgr.GrammarError(ErrorType.CHANNEL_CONFLICTS_WITH_COMMON_CONSTANTS, g.fileName, channel.Token, channelName); } if (outermost is LexerGrammar) { LexerGrammar lexerGrammar = (LexerGrammar)outermost; if (lexerGrammar.modes.ContainsKey(channelName)) { g.tool.errMgr.GrammarError(ErrorType.CHANNEL_CONFLICTS_WITH_MODE, g.fileName, channel.Token, channelName); } } outermost.DefineChannelName(channel.Text); } }
public virtual void CheckForModeConflicts(Grammar g) { if (g.IsLexer()) { LexerGrammar lexerGrammar = (LexerGrammar)g; foreach (string modeName in lexerGrammar.modes.Keys) { if (!modeName.Equals("DEFAULT_MODE") && reservedNames.Contains(modeName)) { Rule rule = lexerGrammar.modes[modeName].First(); g.tool.errMgr.GrammarError(ErrorType.MODE_CONFLICTS_WITH_COMMON_CONSTANTS, g.fileName, ((CommonTree)rule.ast.Parent).Token, modeName); } if (g.GetTokenType(modeName) != TokenConstants.InvalidType) { Rule rule = lexerGrammar.modes[modeName].First(); g.tool.errMgr.GrammarError(ErrorType.MODE_CONFLICTS_WITH_TOKEN, g.fileName, ((CommonTree)rule.ast.Parent).Token, modeName); } } } }