コード例 #1
0
ファイル: SemanticContext.java プロジェクト: HackShare/antlr4
    @Override
    public SemanticContext evalPrecedence(Recognizer<?, ?> parser, RuleContext parserCallStack) {
      boolean differs = false;
      List<SemanticContext> operands = new ArrayList<SemanticContext>();
      for (SemanticContext context : opnds) {
        SemanticContext evaluated = context.evalPrecedence(parser, parserCallStack);
        differs |= (evaluated != context);
        if (evaluated == NONE) {
          // The OR context is true if any element is true
          return NONE;
        } else if (evaluated != null) {
          // Reduce the result by skipping false elements
          operands.add(evaluated);
        }
      }

      if (!differs) {
        return this;
      }

      if (operands.isEmpty()) {
        // all elements were false, so the OR context is false
        return null;
      }

      SemanticContext result = operands.get(0);
      for (int i = 1; i < operands.size(); i++) {
        result = SemanticContext.or(result, operands.get(i));
      }

      return result;
    }