Parsing scala解析器。日志解析器实用程序的输出

Parsing scala解析器。日志解析器实用程序的输出,parsing,scala,Parsing,Scala,我正在使用logparser实用程序跟踪解析 Scala代码: import scala.util.parsing.combinator.JavaTokenParsers object Arith extends JavaTokenParsers with App { def expr: Parser[Any] = log(term~rep("+"~term | "-"~term))("expr") def term: Parser[Any] = factor~rep("*"~f

我正在使用
log
parser实用程序跟踪解析

Scala代码:

import scala.util.parsing.combinator.JavaTokenParsers
object Arith extends JavaTokenParsers with App {
    def expr: Parser[Any] = log(term~rep("+"~term | "-"~term))("expr")
    def term: Parser[Any] = factor~rep("*"~factor | "/"~factor)
    def factor: Parser[Any] = floatingPointNumber | "("~expr~")"
    println(parseAll(expr, "2 * (3 + 7)"))
}
输出:

trying expr at scala.util.parsing.input.CharSequenceReader@13a317a
trying expr at scala.util.parsing.input.CharSequenceReader@14c1103
expr --> [1.11] parsed: ((3~List())~List((+~(7~List()))))
expr --> [1.12] parsed: ((2~List((*~(((~((3~List())~List((+~(7~List())))))~)))))~List())
[1.12] parsed: ((2~List((*~(((~((3~List())~List((+~(7~List())))))~)))))~List())
trying expr at (3+7)*2
trying expr at 3+7)*2
expr --> [1.5] parsed: ((3~List())~List((+~(7~List())))) next: )*2
expr --> [1.8] parsed: (((((~((3~List())~List((+~(7~List())))))~))~List((*~2)))~List()) next: 
[1.8] parsed: (((((~((3~List())~List((+~(7~List())))))~))~List((*~2)))~List())

输入输出为
scala.util.parsing.input。CharSequenceReader@13a317a
。是否有一种方法可以打印输入的字符串表示形式,如“2*(3+7)”?

重写
log
解决了我的问题

Scala代码段:

import scala.util.parsing.combinator.JavaTokenParsers
object Arith extends JavaTokenParsers with App {
    override def log[T](p: => Parser[T])(name: String): Parser[T] = Parser { in =>
        def prt(x: Input) = x.source.toString.drop(x.offset)

        println("trying " + name + " at " + prt(in))
        val r = p(in)
        println(name + " --> " + r + " next: " + prt(r.next))
        r
    }
    def expr: Parser[Any] = log(term ~ rep("+" ~ term | "-" ~ term))("expr")
    def term: Parser[Any] = factor ~ rep("*" ~ factor | "/" ~ factor)
    def factor: Parser[Any] = floatingPointNumber | "(" ~ expr ~ ")"
    println(parseAll(expr, "(3+7)*2"))
}
输出:

trying expr at scala.util.parsing.input.CharSequenceReader@13a317a
trying expr at scala.util.parsing.input.CharSequenceReader@14c1103
expr --> [1.11] parsed: ((3~List())~List((+~(7~List()))))
expr --> [1.12] parsed: ((2~List((*~(((~((3~List())~List((+~(7~List())))))~)))))~List())
[1.12] parsed: ((2~List((*~(((~((3~List())~List((+~(7~List())))))~)))))~List())
trying expr at (3+7)*2
trying expr at 3+7)*2
expr --> [1.5] parsed: ((3~List())~List((+~(7~List())))) next: )*2
expr --> [1.8] parsed: (((((~((3~List())~List((+~(7~List())))))~))~List((*~2)))~List()) next: 
[1.8] parsed: (((((~((3~List())~List((+~(7~List())))))~))~List((*~2)))~List())