Search in sources :

Example 1 with ProdElement

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;
}
Also used : ProdElement(org.eclipse.xtext.util.formallang.StringProduction.ProdElement)

Example 2 with ProdElement

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;
}
Also used : ProdElement(org.eclipse.xtext.util.formallang.StringProduction.ProdElement)

Example 3 with ProdElement

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");
}
Also used : ProdElement(org.eclipse.xtext.util.formallang.StringProduction.ProdElement) Pair(org.eclipse.xtext.util.Pair)

Example 4 with ProdElement

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;
}
Also used : ProdElement(org.eclipse.xtext.util.formallang.StringProduction.ProdElement)

Example 5 with ProdElement

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());
    }
}
Also used : ProdElement(org.eclipse.xtext.util.formallang.StringProduction.ProdElement)

Aggregations

ProdElement (org.eclipse.xtext.util.formallang.StringProduction.ProdElement)5 Pair (org.eclipse.xtext.util.Pair)1