Class SymbolChecks

java.lang.Object
org.antlr.v4.semantics.SymbolChecks

public class SymbolChecks extends Object
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 Details

  • Constructor Details

  • Method Details

    • process

      public void process()
    • checkActionRedefinitions

      public void checkActionRedefinitions(List<GrammarAST> actions)
    • checkForLabelConflicts

      public void checkForLabelConflicts(Collection<Rule> rules)
      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.
    • checkLabelPairs

      private void checkLabelPairs(Rule r, Map<String,LabelElementPair> labelNameSpace, List<LabelElementPair> pairs)
    • findAltLabelName

      private String findAltLabelName(org.antlr.runtime.tree.CommonTree label)
    • checkForTypeMismatch

      private void checkForTypeMismatch(Rule r, LabelElementPair prevLabelPair, LabelElementPair labelPair)
    • checkForLabelConflict

      public void checkForLabelConflict(Rule r, GrammarAST labelID)
    • checkForAttributeConflicts

      public void checkForAttributeConflicts(Rule r)
    • 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

      protected void checkReservedNames(Collection<Rule> rules)
    • checkForModeConflicts

      public void checkForModeConflicts(Grammar g)
    • checkForUnreachableTokens

      public void checkForUnreachableTokens(Grammar g)
      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.
    • getSingleTokenValues

      private List<String> getSingleTokenValues(Rule rule)
      Parameters:
      rule - the rule
      Returns:
      list of simple string literals for the rule
    • checkForOverlap

      private void checkForOverlap(Grammar g, Rule rule1, Rule rule2, List<String> firstTokenStringValues, List<String> secondTokenStringValues)
      For same rule compare values from next index: TOKEN_WITH_SAME_VALUES: 'asdf' | 'asdf'; For different rules compare from start value: TOKEN1: 'asdf'; TOKEN2: 'asdf';
    • checkRuleArgs

      public void checkRuleArgs(Grammar g, List<GrammarAST> rulerefs)
    • checkForQualifiedRuleIssues

      public void checkForQualifiedRuleIssues(Grammar g, List<GrammarAST> qualifiedRuleRefs)