/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.works.editor.grammar.semantics;
import org.antlr.v4.runtime.Dependents;
import org.antlr.v4.runtime.RuleDependencies;
import org.antlr.v4.runtime.RuleDependency;
import org.antlr.v4.runtime.tree.RuleNode;
import org.antlr.works.editor.grammar.experimental.GrammarParser;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.IdContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LabeledLexerElementContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LexerAltContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LexerAltListContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LexerAtomContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LexerCommandNameContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LexerElementContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LexerElementsContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.LexerRuleContext;
import org.antlr.works.editor.grammar.experimental.generated.AbstractGrammarParser.TerminalContext;
import org.antlr.works.editor.grammar.experimental.generated.GrammarParserBaseVisitor;
/**
* Literal lexer rules are non-fragment rules that contain a single string
* literal, and optionally lexer action(s) which do not include {@code more},
* {@code skip}, or {@code type}.
*/
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerRule, version=5, dependents=Dependents.DESCENDANTS)
public class LiteralLexerRuleVisitor extends GrammarParserBaseVisitor<Boolean> {
public static final LiteralLexerRuleVisitor INSTANCE = new LiteralLexerRuleVisitor();
@Override
protected Boolean defaultResult() {
return true;
}
@Override
protected Boolean aggregateResult(Boolean aggregate, Boolean nextResult) {
return aggregate && nextResult;
}
@Override
protected boolean shouldVisitNextChild(RuleNode node, Boolean currentResult) {
// have to stop when we reach false
return currentResult;
}
@Override
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerRule, version=0, dependents=Dependents.PARENTS)
public Boolean visitLexerRule(LexerRuleContext ctx) {
if (ctx.FRAGMENT() != null) {
return false;
}
return super.visitLexerRule(ctx);
}
@Override
@RuleDependencies({
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerAltList, version=1, dependents=Dependents.PARENTS),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerAlt, version=3, dependents=Dependents.SELF),
})
public Boolean visitLexerAltList(LexerAltListContext ctx) {
if (ctx.lexerAlt().size() != 1) {
return false;
}
return super.visitLexerAltList(ctx);
}
@Override
@RuleDependencies({
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerAlt, version=3, dependents=Dependents.PARENTS),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerElements, version=0, dependents=Dependents.SELF),
})
public Boolean visitLexerAlt(LexerAltContext ctx) {
if (ctx.lexerElements() == null) {
return false;
}
return super.visitLexerAlt(ctx);
}
@Override
@RuleDependencies({
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerElements, version=3, dependents=Dependents.PARENTS),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerElement, version=0, dependents=Dependents.SELF),
})
public Boolean visitLexerElements(LexerElementsContext ctx) {
if (ctx.lexerElement().size() != 1) {
return false;
}
return super.visitLexerElements(ctx);
}
@Override
@RuleDependencies({
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerElement, version=0, dependents=Dependents.PARENTS),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerAtom, version=1, dependents=Dependents.SELF),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_labeledLexerElement, version=0, dependents=Dependents.SELF),
})
public Boolean visitLexerElement(LexerElementContext ctx) {
if (ctx.lexerAtom() == null && ctx.labeledLexerElement() == null) {
return false;
}
return super.visitLexerElement(ctx);
}
@Override
@RuleDependencies({
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_labeledLexerElement, version=0, dependents=Dependents.PARENTS),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerAtom, version=1, dependents=Dependents.SELF),
})
public Boolean visitLabeledLexerElement(LabeledLexerElementContext ctx) {
// if the element is labeled, it must be a lexerAtom
if (ctx.lexerAtom() == null) {
return false;
}
return super.visitLabeledLexerElement(ctx);
}
@Override
@RuleDependencies({
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerAtom, version=1, dependents=Dependents.PARENTS),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_terminal, version=0, dependents=Dependents.SELF),
})
public Boolean visitLexerAtom(LexerAtomContext ctx) {
if (ctx.terminal() == null) {
return false;
}
return super.visitLexerAtom(ctx);
}
@Override
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_terminal, version=1, dependents=Dependents.PARENTS)
public Boolean visitTerminal(TerminalContext ctx) {
if (ctx.STRING_LITERAL() == null) {
return false;
}
return super.visitTerminal(ctx);
}
@Override
@RuleDependencies({
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_lexerCommandName, version=1, dependents=Dependents.PARENTS),
@RuleDependency(recognizer=GrammarParser.class, rule=GrammarParser.RULE_id, version=1, dependents=Dependents.DESCENDANTS),
})
public Boolean visitLexerCommandName(LexerCommandNameContext ctx) {
IdContext id = ctx.id();
if (id != null && id.start != null) {
String command = id.start.getText();
if ("type".equals(command) || "more".equals(command) || "skip".equals(command)) {
return false;
}
}
return super.visitLexerCommandName(ctx);
}
}