scala – Parser组合器无法终止 – 如何记录正在发生的事情?
发布时间:2020-12-16 19:18:39 所属栏目:安全 来源:网络整理
导读:我正在尝试使用解析器组合器,我经常遇到无限递归.这是我遇到的第一个: import util.parsing.combinator.Parsersimport util.parsing.input.CharSequenceReaderclass CombinatorParserTest extends Parsers { type Elem = Char def notComma = elem("not com
我正在尝试使用解析器组合器,我经常遇到无限递归.这是我遇到的第一个:
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) } } 如何打印正在发生的事情?为什么没有完成? 解决方法
记录解析notComma和notEndLine的尝试表明它是重复解析的文件结尾(在log(…)(“mesg”)输出中显示为CTRL-Z).以下是我为此目的修改解析器的方法:
def text = rep(log(notComma)("notComma") | log(notEndLine)("notEndLine")) 我不完全确定发生了什么(我尝试了很多语法上的变化),但我认为它是这样的:EOF实际上并不是人工引入输入流中的一个字符,而是一种永久性的条件.输入结束.因此,这种从未消耗的EOF伪字符被重复解析为“不是逗号或不是行尾”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |