|用于scala解析组合器的(或)运算符不起作用

时间:2014-01-16 17:56:52

标签: scala parsing integer double parser-combinators

exactIntegerLiteral已成功解析exactDoubleLiteral,但在-1234.4中合并时,它们不会使用相同的输入ExectNumericLiteral。可能是什么原因?

def exactIntegerLiteral: Parser[IntegerLiteral] =
        "[-+]?\\d+(?!\\.)".r ^^ { parsed => IntegerLiteral(parsed.toLong) }

def exactDoubleLiteral: Parser[DoubleLiteral] =
        "[-+]?\\d+(\\.\\d+)?".r ^^ { parsed => DoubleLiteral(parsed.toDouble) }

def exactNumericLiteral: Parser[NumericLiteral] = 
        exactIntegerLiteral | exactDoubleLiteral

|||这种方法可以完成这项工作,但我不理解这种行为。

1 个答案:

答案 0 :(得分:0)

鉴于两个解析器pq,解析器p | q会在p成功时发生短路。由于您定义的exactNumericLiteral首先尝试exactIntegerLiteral,因此它始终与“-1234”匹配,因此也无需尝试exactDoubleLiteral

exactIntegerLiteralexactDoubleLiteral的顺序切换为

def exactNumericLiteral: Parser[NumericLiteral] = 
        exactDoubleLiteral | exactIntegerLiteral

首先会尝试双重文字,然后做你想做的事情(或者我想你想要的,关于究竟什么不能按预期工作的问题有点不清楚。)

使用p ||| q代替p | q时,将尝试pq,并选择匹配时间最长的结果。在您的示例中,给定exactDoubleLiteral时将为-1234.4

编辑:根据以下问题,应该注意的是,您致电parseAllparse是否重要。在parseAll的情况下,解析器应该匹配exactIntegerLiteral不会为-1234.4执行的整个输入流。相反,调用parse将匹配到.,并且不再使用输入流。