use of org.antlr.works.ate.syntax.misc.ATEToken in project antlrworks by antlr.
the class ElementRule method getAlternatives.
public List<List<ATEToken>> getAlternatives() {
List<List<ATEToken>> alts = new ArrayList<List<ATEToken>>();
List<ATEToken> alt = null;
boolean findColon = true;
int level = 0;
for (ATEToken token : getTokens()) {
if (findColon) {
if (token.getAttribute().equals(":")) {
findColon = false;
alt = new ArrayList<ATEToken>();
}
} else {
if (token.getAttribute().equals("("))
level++;
else if (token.getAttribute().equals(")"))
level--;
else if (level == 0) {
// removed token.type != GrammarSyntaxLexer.TOKEN_BLOCK &&
if (token.getAttribute().equals("|")) {
alts.add(alt);
alt = new ArrayList<ATEToken>();
continue;
}
}
alt.add(token);
}
}
if (alt != null && !alt.isEmpty()) {
alts.add(alt);
}
return alts;
}
use of org.antlr.works.ate.syntax.misc.ATEToken in project antlrworks by antlr.
the class GrammarSyntaxParser method matchScopeUse.
/**
* Matches a scope reference in a rule definition:
*
* scope name (',' name)* ';'
*
* @return true if a scope is matched
*/
private boolean matchScopeUse() {
if (!isID(0, "scope"))
return false;
mark();
// Must begin with the keyword 'scope'
ATEToken start = T(0);
if (!matchID(0, "scope"))
return false;
// Match the first name
if (matchID(0)) {
// Loop over additional scopes
while (matchChar(0, ",")) {
// match an ID
if (!matchID(0)) {
rewind();
return false;
}
}
if (matchSEMI(0))
return true;
}
rewind();
return false;
}
use of org.antlr.works.ate.syntax.misc.ATEToken in project antlrworks by antlr.
the class GrammarSyntaxParser method matchBlock.
private boolean matchBlock(String label) {
if (label == null && !isID(0))
return false;
if (label != null && !isID(0, label))
return false;
mark();
ATEToken start = T(0);
int startIndex = getPosition();
if (label == null) {
if (!matchID(0))
return false;
} else {
if (!matchID(0, label))
return false;
}
ElementBlock block = new ElementBlock(start.getAttribute().toLowerCase(), start);
ATEToken beginBlock = T(0);
if (matchBalancedToken(ATESyntaxLexer.TOKEN_LCURLY, ATESyntaxLexer.TOKEN_RCURLY, block, true)) {
beginBlock.type = GrammarSyntaxLexer.TOKEN_BLOCK_LIMIT;
T(-1).type = GrammarSyntaxLexer.TOKEN_BLOCK_LIMIT;
start.type = GrammarSyntaxLexer.TOKEN_BLOCK_LABEL;
blocks.add(block);
block.end = T(-1);
block.internalTokens = new ArrayList<ATEToken>(getTokens().subList(startIndex, getPosition()));
block.parse();
if (block.isTokenBlock) {
List<ATEToken> tokens = block.getDeclaredTokens();
for (ATEToken lexerToken : tokens) {
lexerToken.type = GrammarSyntaxLexer.TOKEN_DECL;
addDeclaration(lexerToken);
}
}
return true;
}
rewind();
return false;
}
use of org.antlr.works.ate.syntax.misc.ATEToken in project antlrworks by antlr.
the class GrammarSyntaxParser method tryMatchName.
private boolean tryMatchName() {
ATEToken start = T(0);
// Check if the grammar has a type (e.g. lexer, parser, tree, etc)
if (ElementGrammarName.isKnownType(start.getAttribute())) {
if (!nextToken())
return false;
}
if (!matchID(0, "grammar"))
return false;
// After the type comes the name of the grammar
ATEToken name = T(0);
if (!nextToken())
return false;
// The next token must be a semi colon
if (!matchSEMI(0))
return false;
this.name = new ElementGrammarName(name, start, T(-1), start);
return true;
}
use of org.antlr.works.ate.syntax.misc.ATEToken in project antlrworks by antlr.
the class GrammarSyntaxParser method tryMatchRule.
private boolean tryMatchRule() {
ATEToken start = T(0);
if (start == null)
return false;
// Match any modifiers
if (ruleModifiers.contains(start.getAttribute())) {
// skip the modifier
if (!nextToken())
return false;
}
// Match the name (it has to be an ID)
ElementToken tokenName = (ElementToken) T(0);
String name = tokenName.getAttribute();
if (!matchID(0))
return false;
// Match any optional argument
matchArguments();
// Match any comments
while (true) {
if (matchSingleComment(0))
continue;
if (matchComplexComment(0))
continue;
break;
}
// Match any returns
if (matchID(0, "returns")) {
matchArguments();
}
// Match any optional "!"
matchChar(0, "!");
// Match any comments, scopes and blocks
while (true) {
if (matchScopeUse())
continue;
if (matchBlock())
continue;
if (matchSingleComment(0))
continue;
if (matchComplexComment(0))
continue;
if (isCOLON(0)) {
// When a colon is matched, we are at the beginning of the content of the rule
nextToken();
break;
} else {
// Invalid rule matching
return false;
}
}
// Parse the content of the rule (after the ':')
final ATEToken colonToken = T(-1);
final int oldRefsSize = references.size();
final int oldBlocksSize = blocks.size();
final int oldActionsSize = actions.size();
currentRule = new ElementRule(this, name, start, colonToken, null);
labels.clear();
while (true) {
// Match the end of the rule
if (matchEndOfRule(tokenName, oldRefsSize, oldBlocksSize, oldActionsSize))
return true;
// Match any block
if (matchBlock(OPTIONS_BLOCK_NAME))
continue;
// Match any ST rewrite template
if (matchRewriteTemplate())
continue;
// Match any assignment
if (matchAssignment(labels))
continue;
// Match any internal reference
if (matchInternalRefInRule())
continue;
// Match any action
if (matchAction())
continue;
// Match node token
if (matchSingleQuoteString(0) && matchOptionalNodeToken())
continue;
// Nothing matched, go to the next token
if (!nextToken())
return false;
}
}
Aggregations