加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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伪字符被重复解析为“不是逗号或不是行尾”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读