gpt4 book ai didi

scala - 解析器组合器未终止 - 如何记录正在发生的事情?

转载 作者:行者123 更新时间:2023-12-04 12:14:53 25 4
gpt4 key购买 nike

我正在试验解析器组合器,我经常遇到似乎无限递归的情况。这是我遇到的第一个:

import util.parsing.combinator.Parsers
import util.parsing.input.CharSequenceReader

class CombinatorParserTest extends Parsers {

type Elem = Char

def notComma = elem("not comma", _ != ',')

def notEndLine = elem("not end line", x => x != '\r' && x != '\n')

def text = rep(notComma | notEndLine)

}

object CombinatorParserTest {

def main(args:Array[String]): Unit = {
val p = new CombinatorParserTest()
val r = p.text(new CharSequenceReader(","))
// does not get here
println(r)
}

}

如何打印正在发生的事情?为什么这还没有结束?

最佳答案

记录解析尝试 notCommanotEndLine表明正在重复解析的是文件结尾(在 log(...)("mesg") 输出中显示为 CTRL-Z)。以下是我为此目的修改您的解析器的方法:

def text = rep(log(notComma)("notComma") | log(notEndLine)("notEndLine"))

我不完全确定发生了什么(我在你的语法上尝试了很多变体),但我认为它是这样的:EOF 并不是一个人为地引入输入流的字符,而是一种永久条件输入结束。因此,这个从未使用过的 EOF 伪字符被反复解析为“不是逗号或不是行尾”。

关于scala - 解析器组合器未终止 - 如何记录正在发生的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com