@SuppressSubnodes Rule Newline() { return FirstOf("\n", "\n\r"); }
@DontLabel @SuppressSubnodes Rule Literal(String string) { return Sequence( String(string), Spacing()); }
@MemoMismatches @SuppressNode Rule Keyword() { return Sequence( FirstOf(KEYWORD_IN, KEYWORD_FOR, KEYWORD_LET, KEYWORD_IF, KEYWORD_ELSE, KEYWORD_TEMPLATE, KEYWORD_PUBLIC), TestNot(LetterOrDigit())); }
@SuppressSubnodes @MemoMismatches Rule StringLiteral() { return Sequence("'", ZeroOrMore(NoneOf("'")), StringLiteral.of(), "'", Spacing()); }
@MemoMismatches Rule Letter() { return FirstOf(CharRange('a', 'z'), CharRange('A', 'Z'), '_', '$'); }
@SuppressNode Rule Spacing() { return ZeroOrMore(AnyOf(" \n\r\f\t")); } }
@Cached public Rule DefinedHtmlTagName(StringVar tagName) { return Sequence( OneOrMore(Alphanumeric()), tagName.isSet() && match().equals(tagName.get()) || tagName.isNotSet() && tagName.set(match().toLowerCase()) && isHtmlTag(tagName.get()) ); }
@DontLabel Rule DisambiguatedExpression() { return FirstOf( Parens(ApplyExpression()), ForIterationAccessExpression(), AccessExpression(), StringLiteral()); }
@SuppressSubnodes @MemoMismatches Rule Identifier() { return Sequence( TestNot(Keyword()), Sequence(Sequence(IdentifierStartLetter(), ZeroOrMore(LetterOrDigit())), Identifier.of()), Spacing()); }
@SuppressSubnodes Rule TextFragment() { return ZeroOrMore(NoneOf("[]\n\r")); }
@MemoMismatches Rule LetterOrDigit() { return FirstOf(CharRange('a', 'z'), CharRange('A', 'Z'), CharRange('0', '9'), '_', '$'); }
@Cached public Rule HtmlTagBlock(StringVar tagName) { return Sequence( HtmlBlockOpen(tagName), ZeroOrMore( FirstOf( HtmlTagBlock(tagName), Sequence(TestNot(HtmlBlockClose(tagName)), ANY) ) ), HtmlBlockClose(tagName) ); }
@SuppressSubnodes @MemoMismatches Rule TypeIdentifer() { return Sequence(TestNot(Keyword()), Sequence(Sequence(TypeStartLetter(), ZeroOrMore(LetterOrDigit())), TypeIdentifier.of()), Spacing()); }
@SuppressSubnodes Rule Ellipsis() { return Sequence(ELLIPSIS, Spacing()); }
@MemoMismatches public Rule Inline() { return Sequence( checkForParsingTimeout(), FirstOf(Link(), NonLinkInline()) ); }
@Cached public Rule CodeFence(Var<Integer> markerLength) { return Sequence( FirstOf(NOrMore('~', 3), NOrMore('`', 3)), (markerLength.isSet() && matchLength() == markerLength.get()) || (markerLength.isNotSet() && markerLength.set(matchLength())), Sp(), ZeroOrMore(TestNot(Newline()), ANY), // GFM code type identifier push(match()), Newline() ); }
@MemoMismatches public Rule Endline() { return NodeSequence(FirstOf(LineBreak(), TerminalEndline(), NormalEndline())); }
@MemoMismatches public Rule NormalChar() { return Sequence(TestNot(SpecialChar()), TestNot(Spacechar()), NotNewline(), ANY); }
@MemoMismatches public Rule UlOrStarLine() { // This keeps the parser from getting bogged down on long strings of '*', '_' or '~', // or strings of '*', '_' or '~' with space on each side: return NodeSequence( FirstOf(CharLine('_'), CharLine('*'), CharLine('~')), push(new TextNode(match())) ); }
@MemoMismatches public Rule Link() { return NodeSequence( FirstOf(new ArrayBuilder<Rule>() .addNonNulls(ext(WIKILINKS) ? new Rule[]{WikiLink()} : null) .add(Sequence(Label(), FirstOf(ExplicitLink(false), ReferenceLink(false)))) .add(AutoLink()) .get() ) ); }