use of org.eclipse.xtext.util.formallang.StringProduction.ProdElement in project xtext-core by eclipse.
the class StringProduction method parseAlt.
protected ProdElement parseAlt(Stack<Pair<Token, String>> tokens) {
ProdElement first = parseUnordered(tokens);
if (!tokens.isEmpty() && tokens.peek().getFirst() == Token.PIPE) {
ProdElement uno = createElement(ElementType.ALTERNATIVE);
uno.addChild(first);
do {
tokens.pop();
ProdElement next = parseUnordered(tokens);
uno.addChild(next);
} while (!tokens.isEmpty() && tokens.peek().getFirst() == Token.PIPE);
return uno;
}
return first;
}
use of org.eclipse.xtext.util.formallang.StringProduction.ProdElement in project xtext-core by eclipse.
the class StringProduction method parseSeq.
protected ProdElement parseSeq(Stack<Pair<Token, String>> tokens) {
ProdElement first = parsePrim(tokens);
EnumSet<Token> followers = EnumSet.of(Token.STRING, Token.PL, Token.ID);
if (!tokens.isEmpty() && followers.contains(tokens.peek().getFirst())) {
ProdElement seq = createElement(ElementType.SEQUENCE);
seq.addChild(first);
do {
ProdElement next = parsePrim(tokens);
seq.addChild(next);
} while (!tokens.isEmpty() && followers.contains(tokens.peek().getFirst()));
return seq;
}
return first;
}
use of org.eclipse.xtext.util.formallang.StringProduction.ProdElement in project xtext-core by eclipse.
the class StringCfg method rule.
public ProdElement rule(String rule) {
Stack<Pair<Token, String>> tokens = lex(rule);
if (tokens.peek().getFirst() == Token.ID) {
String ruleName = tokens.peek().getSecond();
tokens.pop();
if (tokens.peek().getFirst() == Token.COLON) {
tokens.pop();
ProdElement ele = parseAlt(tokens);
if (root == null)
root = ele;
rules.put(ruleName, ele);
return ele;
} else
throw new RuntimeException("Expected ':'");
} else
throw new RuntimeException("Expected ID");
}
use of org.eclipse.xtext.util.formallang.StringProduction.ProdElement in project xtext-core by eclipse.
the class StringProduction method parseUnordered.
protected ProdElement parseUnordered(Stack<Pair<Token, String>> tokens) {
ProdElement first = parseSeq(tokens);
if (!tokens.isEmpty() && tokens.peek().getFirst() == Token.AND) {
ProdElement uno = createElement(ElementType.UNOREDERED);
uno.addChild(first);
do {
tokens.pop();
ProdElement next = parseSeq(tokens);
uno.addChild(next);
} while (!tokens.isEmpty() && tokens.peek().getFirst() == Token.AND);
return uno;
}
return first;
}
use of org.eclipse.xtext.util.formallang.StringProduction.ProdElement in project xtext-core by eclipse.
the class StringProduction method parsePrim.
protected ProdElement parsePrim(Stack<Pair<Token, String>> tokens) {
Pair<Token, String> current = tokens.pop();
switch(current.getFirst()) {
case PL:
ProdElement result1 = parseAlt(tokens);
if (tokens.peek().getFirst().equals(Token.PR))
tokens.pop();
else
throw new RuntimeException("')' expected, but " + tokens.peek().getFirst() + " found");
parseCardinality(tokens, result1);
return result1;
case STRING:
ProdElement result2 = createElement(ElementType.TOKEN);
result2.value = current.getSecond();
parseCardinality(tokens, result2);
return result2;
case ID:
ProdElement result3 = createElement(ElementType.TOKEN);
result3.name = current.getSecond();
parseCardinality(tokens, result3);
return result3;
default:
throw new RuntimeException("Unexpected token " + current.getFirst());
}
}
Aggregations