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
|||
这种方法可以完成这项工作,但我不理解这种行为。
答案 0 :(得分:0)
鉴于两个解析器p
和q
,解析器p | q
会在p
成功时发生短路。由于您定义的exactNumericLiteral
首先尝试exactIntegerLiteral
,因此它始终与“-1234”匹配,因此也无需尝试exactDoubleLiteral
。
将exactIntegerLiteral
和exactDoubleLiteral
的顺序切换为
def exactNumericLiteral: Parser[NumericLiteral] =
exactDoubleLiteral | exactIntegerLiteral
首先会尝试双重文字,然后做你想做的事情(或者我想你想要的,关于究竟什么不能按预期工作的问题有点不清楚。)
使用p ||| q
代替p | q
时,将尝试p
和q
,并选择匹配时间最长的结果。在您的示例中,给定exactDoubleLiteral
时将为-1234.4
。
编辑:根据以下问题,应该注意的是,您致电parseAll
或parse
是否重要。在parseAll
的情况下,解析器应该匹配exactIntegerLiteral
不会为-1234.4
执行的整个输入流。相反,调用parse
将匹配到.
,并且不再使用输入流。