Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package playground
- import org.parboiled2._
- class Playground (val input: ParserInput) extends Parser {
- type R0 = Rule0
- type R[T] = Rule1[T]
- type R1 = R[String]
- def TestedRule = rule {
- Expr ~ EOI
- }
- def Expr: R1 = rule {Plus | Mult | Prim}
- def Prim: R1 = rule {capture(CharPredicate.Digit.*)}
- def Mult: R1 = rule {TwoOrMoreSil(() => MultSeq, () => MultSign) ~> {seq: Seq[String] => Stringify(seq, "mult")}}
- def MultSeq: R1 = rule {Prim ~ &(MultSign | EOI) | Plus}
- def Plus: R1 = rule {TwoOrMoreSil(() => PlusSeq, () => PlusSign) ~> {seq: Seq[String] => Stringify(seq, "plus")}}
- def PlusSeq: R1 = rule {Prim ~ &(PlusSign | EOI) | Mult}
- def PlusSign: R0 = rule('+')
- def MultSign: R0 = rule('*')
- def WL: R0 = rule {"\n"}
- def WS: R0 = rule {" "}
- def Stringify(seq: Seq[String], method: String) = s"""$method(${seq.mkString(",")})"""
- def TwoOrMoreSil[T](term: () => Rule1[T], delim: () => Rule0): Rule1[Seq[T]] = rule {
- term() ~ delim() ~ term().+(delim()) ~> {(first: T, rest: Seq[T]) => first +: rest}
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement