解析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 = ... 所以它永远不会堆叠溢出,因为,为了递归,它首先必须接受一个字符.这是重要的部分 – 如果你总是确保在没有首先接受一个字符的情况下不会发生递归,你将永远不会进入无限递归.当然,除非你有无限的输入. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |