Package org.antlr.v4.semantics
Class SymbolChecks
java.lang.Object
org.antlr.v4.semantics.SymbolChecks
Check for symbol problems; no side-effects. Inefficient to walk rules
and such multiple times, but I like isolating all error checking outside
of code that actually defines symbols etc...
Side-effect: strip away redef'd rules.
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
checkActionRedefinitions
(List<GrammarAST> actions) protected void
checkDeclarationRuleConflicts
(Rule r, AttributeDict attributes, Set<String> ruleNames, ErrorType errorType) void
void
checkForLabelConflict
(Rule r, GrammarAST labelID) void
checkForLabelConflicts
(Collection<Rule> rules) Make sure a label doesn't conflict with another symbol.void
void
checkForQualifiedRuleIssues
(Grammar g, List<GrammarAST> qualifiedRuleRefs) void
Algorithm steps: 1.protected void
checkLocalConflictingDeclarations
(Rule r, AttributeDict attributes, AttributeDict referenceAttributes, ErrorType errorType) protected void
checkReservedNames
(Collection<Rule> rules) void
checkRuleArgs
(Grammar g, List<GrammarAST> rulerefs) void
process()
-
Field Details
-
errMgr
-
reservedNames
-
-
Constructor Details
-
SymbolChecks
-
-
Method Details
-
process
public void process() -
checkActionRedefinitions
-
checkForLabelConflicts
Make sure a label doesn't conflict with another symbol. Labels must not conflict with: rules, tokens, scope names, return values, parameters, and rule-scope dynamic attributes defined in surrounding rule. Also they must have same type for repeated defs. -
checkForLabelConflict
-
checkForAttributeConflicts
-
checkDeclarationRuleConflicts
protected void checkDeclarationRuleConflicts(Rule r, AttributeDict attributes, Set<String> ruleNames, ErrorType errorType) -
checkLocalConflictingDeclarations
protected void checkLocalConflictingDeclarations(Rule r, AttributeDict attributes, AttributeDict referenceAttributes, ErrorType errorType) -
checkReservedNames
-
checkForModeConflicts
-
checkForUnreachableTokens
Algorithm steps: 1. Collect all simple string literals (i.e. 'asdf', 'as' 'df', but not [a-z]+, 'a'..'z') for all lexer rules in each mode except of autogenerated tokens (getSingleTokenValues
) 2. Compare every string literal with each other (checkForOverlap
) and throw TOKEN_UNREACHABLE warning if the same string found. Complexity: O(m * n^2 / 2), approximately equals to O(n^2) where m - number of modes, n - average number of lexer rules per mode. See also testUnreachableTokens unit test for details. -
checkRuleArgs
-
checkForQualifiedRuleIssues
-