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

解析scala中的递归结构

发布时间:2020-12-16 19:20:30 所属栏目:安全 来源:网络整理
导读:我正在尝试在 scala中构造一个解析器,它可以解析类似SQL的字符串.我已经掌握了基础知识并且可以解析类似于: select id from users where name = "peter" and age = 30 order by lastname 但现在我想知道如何解析嵌套和类,即 select name from users where n
我正在尝试在 scala中构造一个解析器,它可以解析类似SQL的字符串.我已经掌握了基础知识并且可以解析类似于:

select id from users where name = "peter" and age = 30 order by lastname

但现在我想知道如何解析嵌套和类,即

select name from users where name = "peter" and (age = 29 or age = 30)

我的’combinedPredicate’的当前产量如下:

def combinedPredicate = predicate ~ ("and"|"or") ~ predicate ^^ {
  case l ~ "and" ~ r => And(l,r)
  case l ~ "or" ~ r => Or(l,r)
}

我尝试以递归方式引用自身内的combinedPredicate生成,但这会导致堆栈溢出.

顺便说一句,我只是在这里试验……没有实现整个ansi-99规范;)

解决方法

好吧,递归必须以某种方式划界.在这种情况下,您可以这样做:

def combinedPredicate = predicate ~ rep( ("and" | "or" ) ~ predicate )
def predicate = "(" ~ combinedPredicate ~ ")" | simplePredicate
def simplePredicate = ...

所以它永远不会堆叠溢出,因为,为了递归,它首先必须接受一个字符.这是重要的部分 – 如果你总是确保在没有首先接受一个字符的情况下不会发生递归,你将永远不会进入无限递归.当然,除非你有无限的输入.

(编辑:李大同)

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

    推荐文章
      热点阅读