diff --git a/java/arcs/core/util/Parser.kt b/java/arcs/core/util/Parser.kt index 95b6268a488..eba462be56c 100644 --- a/java/arcs/core/util/Parser.kt +++ b/java/arcs/core/util/Parser.kt @@ -394,6 +394,19 @@ class ManyOfParser(val parser: Parser) : Parser>() { } } +/** + * A parser providing a name for debugging purposes (traceback) but delegates parsing. + */ +class NamedParser(name: String, val parser: Parser) : Parser() { + + init { + this.name = name + } + + override fun invoke(string: String, pos: SourcePosition) = parser.invoke(string, pos) + override fun leftTokens() = parser.leftTokens() +} + class ParserException(msg: String, cause: Exception) : Exception(msg, cause) /** A parser which converts the return value of a parser into another value. */ @@ -587,6 +600,9 @@ fun many(parser: Parser) = ManyOfParser(parser) /** Helper for [AnyOfParser]. */ fun any(parsers: List>) = AnyOfParser(parsers) +/** Helper for [NamedParser] */ +fun Parser.named(name: String) = NamedParser(name, this) + /** Helper for [TransformParser]. */ fun Parser.map(f: (T) -> R) = TransformParser(this, f)