Skip to content

Commit 0e7482a

Browse files
committed
implement &
1 parent a101ccd commit 0e7482a

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

parboiled-core/src/main/scala-3/org/parboiled2/ParserMacros.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,17 @@ class OpTreeContext(parser: Expr[Parser])(using Quotes) {
347347
}
348348
}
349349

350+
case class AndPredicate(op: OpTree) extends DefaultNonTerminalOpTree {
351+
def ruleTraceNonTerminalKey = '{ RuleTrace.AndPredicate }
352+
def renderInner(start: Expr[Int], wrapped: Boolean): Expr[Boolean] =
353+
'{
354+
val mark = $parser.__saveState
355+
val matched = ${ op.render(wrapped) }
356+
$parser.__restoreState(mark)
357+
matched
358+
}
359+
}
360+
350361
private case class Action(body: Term, ts: List[TypeTree]) extends DefaultNonTerminalOpTree {
351362
def ruleTraceNonTerminalKey = '{ RuleTrace.Action }
352363

@@ -750,6 +761,8 @@ class OpTreeContext(parser: Expr[Parser])(using Quotes) {
750761
) =>
751762
Sequence(rec(base), Action(body, ts))
752763

764+
case Apply(Select(_, "&"), List(arg)) => AndPredicate(rec(arg))
765+
753766
case Apply(
754767
Select(Apply(TypeApply(Select(_, "rule2WithSeparatedBy"), _), List(base)), "separatedBy"),
755768
List(sep)

parboiled-core/src/test/scala/org/parboiled2/CombinatorSpec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,15 @@ object CombinatorSpec extends TestParserSpec {
167167
"a" must beMismatched
168168
"b" must beMatched
169169
"" must beMatched
170-
}
170+
}*/
171171

172172
"`&` modifier" - new TestParser0 {
173173
def targetRule = rule(&("a"))
174174
"a" must beMatched
175175
cursor ==> 0
176176
"b" must beMismatched
177177
"" must beMismatched
178-
}*/
178+
}
179179

180180
"`1.times(Rule0)` modifier" - new TestParser0 {
181181
def targetRule = rule(1.times("a"))

0 commit comments

Comments
 (0)