在JavaTokensParser子类中使用正则表达式解析器

时间:2015-10-29 22:06:32

标签: scala parser-combinators

我正在尝试使用以下对象的scala解析器组合器:

object LogParser extends JavaTokenParsers with PackratParsers {

一些解析器正在运行。但是下面的一个被绊倒了:

 def time  = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)"""

以下是输入无效:

09:58:24.608891

到达那条线时,我们得到:

[2.22] failure: `([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)' expected but `:' found

09:58:24.608891

注意:我确实在同一输入模式的scala repl中验证了该正则表达式的正确行为。

val r = """([\d]{2}):([\d]{2}):([\d]{2}\.[\d]+)""".r
val s = """09:58:24.608891"""

val r(t,t2,t3) = s
t: String = 09
t2: String = 58
t3: String = 24.608891

所以.. AFA解析器组合器:“:”标记本身是否存在问题 - 即需要创建我自己的自定义Lexer并将“:”添加到lexical.delimiters?

更新提供了添加“.r”的答案。我已经尝试了 - 但无论如何要明确:以下具有相同的行为(不起作用):

def time =“”“([\ d] {2}:[\ d] {2}:[\ d] {2}。[\ d] +)”“” .r

1 个答案:

答案 0 :(得分:1)

我认为你最后错过了一个.r来实际拥有正则表达式而不是字符串文字。

 def time  = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)"""

应该是

 def time  = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)""".r

第一个期望文本与正则表达式字符串文字(显然不存在)完全相同,第二个期望文本实际匹配正则表达式。两者都创建了Parser[String],因此缺少某些东西并不是很明显。

  
      
  • 从java.lang.String到Parser [String]的隐式转换,因此字符串文字可以用作解析器组合器。
  •   
  • 从scala.util.matching.Regex隐式转换为>解析器[String],以便正则表达式可以用作解析器组合器。
  •   

http://www.scala-lang.org/files/archive/api/2.11.2/scala-parser-combinators/#scala.util.parsing.combinator.RegexParsers