@Override public <T> Optional<List<T>> zeroOrMore(T method) { ParsingExpression expression = pop(); GrammarRuleKey ruleKey = new DummyGrammarRuleKey("zeroOrMore", expression); zeroOrMores.add(ruleKey); b.rule(ruleKey).is(b.zeroOrMore(expression)); invokeRule(ruleKey); return null; }
@Override public <U> Optional<List<U>> zeroOrMore(U method) { ParsingExpression expression = pop(); GrammarRuleKey grammarRuleKey = new DummyGrammarRuleKey("zeroOrMore", expression); zeroOrMores.add(grammarRuleKey); b.rule(grammarRuleKey).is(b.zeroOrMore(expression)); invokeRule(grammarRuleKey); return null; }
@Override public <U> Optional<List<U>> zeroOrMore(U method) { ParsingExpression expression = pop(); GrammarRuleKey grammarRuleKey = new DummyGrammarRuleKey("zeroOrMore", expression); zeroOrMores.add(grammarRuleKey); b.rule(grammarRuleKey).is(b.zeroOrMore(expression)); invokeRule(grammarRuleKey); return null; }
@Override public <T> Optional<List<T>> zeroOrMore(T method) { ParsingExpression expression = pop(); GrammarRuleKey ruleKey = new DummyGrammarRuleKey("zeroOrMore", expression); zeroOrMores.add(ruleKey); b.rule(ruleKey).is(b.zeroOrMore(expression)); invokeRule(ruleKey); return null; }
public static Grammar greedy() { LexerlessGrammarBuilder b = common(); b.rule(RULE).is(TERM, b.zeroOrMore("+", TERM)); return b.build(); }
public static Grammar infiniteZeroOrMore() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(A).is(b.zeroOrMore(b.optional("foo"))); return b.build(); }
public static void branchAndGuardExpressions(LexerlessGrammarBuilder b) { b.rule(branchExps).is(branchExp, b.zeroOrMore(semi, branchExp)); b.rule(branchExp).is(guardSequence, arrow, statements); b.rule(patternStatements).is(patternStatement, b.zeroOrMore(semi, patternStatement)); b.rule(patternStatement).is(pattern, b.optional(guardSequenceStart), arrow, statements); b.rule(catchPatternStatements).is(catchPatternStatement, b.zeroOrMore(semi, catchPatternStatement)); b.rule(catchPatternStatement).is(catchPattern, b.optional(guardSequenceStart), arrow, statements); b.rule(pattern).is(assignmentExpression); b.rule(catchPattern).is(b.optional(atomOrIdentifier, colon), expression); b.rule(guardSequenceStart).is(whenKeyword, guardSequence); b.rule(guardSequence).is(guard, b.zeroOrMore(semi, guard)); b.rule(guard).is(guardExpression, b.zeroOrMore(comma, guardExpression)); b.rule(guardExpression).is(expression); }
/** * A.4 Statement */ private static void statements(LexerlessGrammarBuilder b) { b.rule(expressionStatement).is(expression); b.rule(statement).is(expressionStatement); b.rule(statements).is(statement, b.zeroOrMore(comma, statement)); }
/** * To eliminate immediate left recursion - factor out non recursive alternatives. */ public static Grammar eliminatedImmediateLeftRecursion() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(A).is(b.firstOf(S1, S2), b.zeroOrMore(b.firstOf(T1, T2))); otherRules(b); return b.build(); }
/** * To eliminate indirect left recursion - transform to immediate left recursion, then factor out non recursive alternatives. */ public static Grammar eliminatedIndirectLeftRecursion() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(A).is(b.firstOf(b.sequence(S2, T1), S1), b.zeroOrMore(T2, T1)); otherRules(b); return b.build(); }
private static void spacing(LexerlessGrammarBuilder b, String commentRegex) { b.rule(SPACING).is( b.skippedTrivia(b.regexp("(?<!\\\\)[\\s]*+")), b.zeroOrMore( b.commentTrivia(b.regexp(commentRegex)), b.skippedTrivia(b.regexp("(?<!\\\\)[\\s]*+")))); }
private static void spacing(LexerlessGrammarBuilder b, String commentRegex) { b.rule(SPACING).is( b.skippedTrivia(b.regexp("(?<!\\\\)[\\s]*+")), b.zeroOrMore( b.commentTrivia(b.regexp(commentRegex)), b.skippedTrivia(b.regexp("(?<!\\\\)[\\s]*+")))); }
@Setup public void setup() { int k = Integer.getInteger("k", 5); int n = Integer.getInteger("n", 10); input = Strings.repeat(" k" + (k - 1), n).toCharArray(); GrammarRuleKey root = newRuleKey(); GrammarRuleKey spacing = newRuleKey(); GrammarRuleKey[] rules = new GrammarRuleKey[k]; for (int i = 0; i < k; i++) { rules[i] = newRuleKey(); } LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(root).is(b.zeroOrMore(b.firstOf(rules[0], rules[1], Arrays.copyOfRange(rules, 2, rules.length))), b.endOfInput()); b.rule(spacing).is(" "); for (int i = 0; i < k; i++) { b.rule(rules[i]).is(b.optional(spacing), "k" + i); } required = new ParseRunner(b.build().rule(root)); b = LexerlessGrammarBuilder.create(); b.rule(root).is(b.zeroOrMore(b.firstOf(rules[0], rules[1], Arrays.copyOfRange(rules, 2, rules.length))), b.endOfInput()); b.rule(spacing).is(b.optional(" ")); for (int i = 0; i < k; i++) { b.rule(rules[i]).is(spacing, "k" + i); } notRequired = new ParseRunner(b.build().rule(root)); }
private static void functions(LexerlessGrammarBuilder b) { b.rule(spec).is(minus, b.firstOf(semiKeyword("spec", b), semiKeyword("callback", b)), b.zeroOrMore(b.firstOf(b.regexp("\\.(\\.+|.)"), b.regexp("[^\\.]")), spacing), dot); b.rule(typeSpec).is(minus, b.firstOf(semiKeyword("type", b), semiKeyword("opaque", b)), b.zeroOrMore(b.firstOf(b.regexp("\\.(\\.+|.)"), b.regexp("[^\\.]")), spacing), dot); b.rule(functionDeclaration).is(functionClause, b.zeroOrMore(semi, functionClause), dot); b.rule(functionClause).is(clauseHead, arrow, clauseBody); b.rule(clauseHead).is(funcDecl, b.optional(guardSequenceStart)); b.rule(clauseBody).is(statements); b.rule(funcArity).is(b.optional(literal, colon), literal, div, literal); b.rule(funcDecl).is(literal, arguments); }
public static Grammar create() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(JSON).is(b.firstOf(ARRAY, OBJECT)); b.rule(OBJECT).is("{", WHITESPACE, b.optional(PAIR, b.zeroOrMore(",", WHITESPACE, PAIR)), "}", WHITESPACE); b.rule(PAIR).is(STRING, ":", WHITESPACE, VALUE); b.rule(ARRAY).is("[", WHITESPACE, b.optional(VALUE, b.zeroOrMore(",", WHITESPACE, VALUE)), "]", WHITESPACE); b.rule(STRING).is('"', b.regexp("([^\"\\\\]|\\\\([\"\\\\/bfnrt]|u[0-9a-fA-F]{4}))*+"), '"', WHITESPACE); b.rule(VALUE).is(b.firstOf(STRING, NUMBER, OBJECT, ARRAY, TRUE, FALSE, NULL), WHITESPACE); b.rule(NUMBER).is(b.regexp("-?+(0|[1-9][0-9]*+)(\\.[0-9]++)?+([eE][+-]?+[0-9]++)?+")); b.rule(TRUE).is("true"); b.rule(FALSE).is("false"); b.rule(NULL).is("null"); b.rule(WHITESPACE).is(b.regexp("[ \n\r\t\f]*+")); return b.build(); }
public static LexerlessGrammarBuilder createGrammarBuilder() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(WHITESPACE).is(b.commentTrivia(b.regexp("\\s*+"))).skip(); b.rule(PLUS).is('+', WHITESPACE); b.rule(MINUS).is('-', WHITESPACE); b.rule(DIV).is('/', WHITESPACE); b.rule(MUL).is('*', WHITESPACE); b.rule(NUMBER).is(b.regexp("[0-9]++"), WHITESPACE); b.rule(VARIABLE).is(b.regexp("\\p{javaJavaIdentifierStart}++\\p{javaJavaIdentifierPart}*+"), WHITESPACE); b.rule(LPAR).is('(', WHITESPACE); b.rule(RPAR).is(')', WHITESPACE); b.rule(EXPRESSION).is(WHITESPACE, ADDITIVE_EXPRESSION, b.endOfInput()); b.rule(ADDITIVE_EXPRESSION).is(MULTIPLICATIVE_EXPRESSION, b.zeroOrMore(b.firstOf(PLUS, MINUS), MULTIPLICATIVE_EXPRESSION)); b.rule(MULTIPLICATIVE_EXPRESSION).is(PRIMARY, b.zeroOrMore(b.firstOf(DIV, MUL), PRIMARY)).skipIfOneChild(); b.rule(PRIMARY).is(b.firstOf(NUMBER, PARENS, VARIABLE)).skipIfOneChild(); b.rule(PARENS).is(LPAR, ADDITIVE_EXPRESSION, RPAR); b.setRootRule(EXPRESSION); return b; }
/** * 3.10. Literals */ private static void literals(LexerlessGrammarBuilder b) { b.rule(SPACING).is( b.skippedTrivia(whitespace(b)), b.zeroOrMore( b.commentTrivia(b.firstOf(inlineComment(b), multilineComment(b))), b.skippedTrivia(whitespace(b)))); b.rule(EOF).is(b.token(GenericTokenType.EOF, b.endOfInput())); b.rule(CHARACTER_LITERAL).is(characterLiteral(b), SPACING); b.rule(JavaTokenType.STRING_LITERAL).is(stringLiteral(b), SPACING); b.rule(FLOAT_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[fF]|[0-9][0-9_]*+[fF]"), SPACING); b.rule(DOUBLE_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[dD]?+|[0-9][0-9_]*+[dD]"), SPACING); b.rule(LONG_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP + "[lL]"), SPACING); b.rule(INTEGER_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP), SPACING); b.rule(JavaTokenType.IDENTIFIER).is( b.firstOf( b.next(ENUM), b.nextNot(KEYWORD)), javaIdentifier(b), SPACING); }
/** * 3.10. Literals */ private static void literals(LexerlessGrammarBuilder b) { b.rule(SPACING).is( b.skippedTrivia(whitespace(b)), b.zeroOrMore( b.commentTrivia(b.firstOf(inlineComment(b), multilineComment(b))), b.skippedTrivia(whitespace(b)))); b.rule(EOF).is(b.token(GenericTokenType.EOF, b.endOfInput())); b.rule(CHARACTER_LITERAL).is(characterLiteral(b), SPACING); b.rule(JavaTokenType.STRING_LITERAL).is(stringLiteral(b), SPACING); b.rule(FLOAT_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[fF]|[0-9][0-9_]*+[fF]"), SPACING); b.rule(DOUBLE_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[dD]?+|[0-9][0-9_]*+[dD]"), SPACING); b.rule(LONG_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP + "[lL]"), SPACING); b.rule(INTEGER_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP), SPACING); b.rule(JavaTokenType.IDENTIFIER).is( b.firstOf( b.next(ENUM), b.nextNot(KEYWORD)), javaIdentifier(b), SPACING); }
/** * 3.10. Literals */ private static void literals(LexerlessGrammarBuilder b) { b.rule(SPACING).is( b.skippedTrivia(whitespace(b)), b.zeroOrMore( b.commentTrivia(b.firstOf(inlineComment(b), multilineComment(b))), b.skippedTrivia(whitespace(b)))); b.rule(EOF).is(b.token(GenericTokenType.EOF, b.endOfInput())); b.rule(CHARACTER_LITERAL).is(characterLiteral(b), SPACING); b.rule(JavaTokenType.LITERAL).is(stringLiteral(b), SPACING); b.rule(FLOAT_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[fF]|[0-9][0-9_]*+[fF]"), SPACING); b.rule(DOUBLE_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[dD]?+|[0-9][0-9_]*+[dD]"), SPACING); b.rule(LONG_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP + "[lL]"), SPACING); b.rule(INTEGER_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP), SPACING); b.rule(JavaTokenType.IDENTIFIER).is( b.firstOf( b.next(ENUM), b.nextNot(KEYWORD)), javaIdentifier(b), SPACING); }
/** * 3.10. Literals */ private static void literals(LexerlessGrammarBuilder b) { b.rule(SPACING).is( b.skippedTrivia(whitespace(b)), b.zeroOrMore( b.commentTrivia(b.firstOf(inlineComment(b), multilineComment(b))), b.skippedTrivia(whitespace(b)))); b.rule(EOF).is(b.token(GenericTokenType.EOF, b.endOfInput())); b.rule(CHARACTER_LITERAL).is(characterLiteral(b), SPACING); b.rule(JavaTokenType.LITERAL).is(stringLiteral(b), SPACING); b.rule(FLOAT_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[fF]|[0-9][0-9_]*+[fF]"), SPACING); b.rule(DOUBLE_LITERAL).is(b.regexp(FLOATING_LITERAL_WITHOUT_SUFFIX_REGEXP + "[dD]?+|[0-9][0-9_]*+[dD]"), SPACING); b.rule(LONG_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP + "[lL]"), SPACING); b.rule(INTEGER_LITERAL).is(b.regexp(INTEGER_LITERAL_REGEXP), SPACING); b.rule(JavaTokenType.IDENTIFIER).is( b.firstOf( b.next(ENUM), b.nextNot(KEYWORD)), javaIdentifier(b), SPACING); }