@Override public <U> Optional<U> optional(U method) { ParsingExpression expression = pop(); GrammarRuleKey grammarRuleKey = new DummyGrammarRuleKey("optional", expression); optionals.add(grammarRuleKey); b.rule(grammarRuleKey).is(b.optional(expression)); invokeRule(grammarRuleKey); return null; }
@Override public <T> Optional<T> optional(T method) { ParsingExpression expression = pop(); GrammarRuleKey ruleKey = new DummyGrammarRuleKey("optional", expression); optionals.add(ruleKey); b.rule(ruleKey).is(b.optional(expression)); invokeRule(ruleKey); return null; }
@Override public <T> Optional<T> optional(T method) { ParsingExpression expression = pop(); GrammarRuleKey ruleKey = new DummyGrammarRuleKey("optional", expression); optionals.add(ruleKey); b.rule(ruleKey).is(b.optional(expression)); invokeRule(ruleKey); return null; }
@Override public <U> Optional<U> optional(U method) { ParsingExpression expression = pop(); GrammarRuleKey grammarRuleKey = new DummyGrammarRuleKey("optional", expression); optionals.add(grammarRuleKey); b.rule(grammarRuleKey).is(b.optional(expression)); invokeRule(grammarRuleKey); return null; }
public static Grammar create() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(S).is("(", b.optional(S), ")"); return b.build(); }
public static Grammar recursive() { LexerlessGrammarBuilder b = common(); b.rule(RULE).is(TERM, b.optional("+", RULE)); return b.build(); }
public static Grammar requiresPositiveMemoizationOnMoreThanJustLastRule() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(A).is( b.firstOf( b.sequence(b.optional(B), 'a'), // rule 'C' will match and override the memoization result of 'B': b.sequence(C, '!'), b.sequence(b.optional(B), 'b'))); b.rule(B).is('(', A, ')'); // rule 'C' will override each following memoization result of 'A': b.rule(C).is('(', b.optional(C)); return b.build(); }
public static Grammar infiniteOneOrMore() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(A).is(b.oneOrMore(b.optional("foo"))); return b.build(); }
public static Grammar infiniteZeroOrMore() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(A).is(b.zeroOrMore(b.optional("foo"))); return b.build(); }
@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)); }
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); }
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(); }
b.sequence(LT, XML_TAG_CONTENT, b.optional(XML_WHITESPACE), DIV, GT), b.sequence(LT, XML_TAG_CONTENT, b.optional(XML_WHITESPACE), XML_ELEMENT_CONTENT, LT, DIV, XML_TAG_NAME, b.optional(XML_WHITESPACE), GT))); XML_NAME)); b.rule(XML_ATTRIBUTES).is(b.optional(b.firstOf( b.sequence(XML_ATTRIBUTE, XML_ATTRIBUTES), b.sequence(XML_WHITESPACE, LCURLYBRACE, EXPRESSION, RCURLYBRACE)))); XML_ATTRIBUTE_VALUE))); b.rule(XML_ELEMENT_CONTENT).is(b.optional( b.firstOf( b.sequence(LCURLYBRACE, EXPRESSION, RCURLYBRACE, XML_ELEMENT_CONTENT),
CAPTURING_GROUP ), b.optional(QUANTIFIER) ); b.rule(POSITIVE_LOOKAHEAD).is("(?=", ALTERNATION, ")"); b.sequence("{", NUMBER, ",", NUMBER, "}") ), b.optional(b.firstOf("+", "?")) ); b.rule(NUMBER).is(b.regexp("[0-9]++")); b.rule(BACK_REFERENCE).is("\\", b.regexp("[1-9]")); b.rule(CHARACTER_CLASS).is('[', b.optional("^"), b.oneOrMore(CLASS_ATOM), ']'); b.rule(CLASS_ATOM).is(b.firstOf( b.sequence('\\', b.regexp(".")), b.sequence(b.optional("&&"), CHARACTER_CLASS), b.sequence(b.nextNot(b.firstOf('[', ']', "&&")), b.regexp(".")) ));
b.rule(ATTRIBUTE_EXPR).is(IDENTIFIER, b.zeroOrMore(PROPERTY_OPERATOR)); b.rule(IMPORT_DIRECTIVE).is(IMPORT, PACKAGE_NAME, b.optional(DOT, STAR));
b.token(GenericTokenType.LITERAL, b.sequence( b.optional(IDENT_IDENTIFIER_NO_WS), b.sequence(LESS_VARIABLE_PREFIX, OPEN_CURLY_BRACE, b.oneOrMore(_NMCHAR), CLOSE_CURLY_BRACE), b.zeroOrMore(
b.token(GenericTokenType.LITERAL, b.sequence( b.optional(IDENT_IDENTIFIER_NO_WS), b.sequence(LESS_VARIABLE_PREFIX, OPEN_CURLY_BRACE, b.oneOrMore(_NMCHAR), CLOSE_CURLY_BRACE), b.zeroOrMore(