当前位置:  开发笔记 > 编程语言 > 正文

Scala组合器解析器 - 区分数字字符串和变量字符串

如何解决《Scala组合器解析器-区分数字字符串和变量字符串》经验,为你挑选了1个好方法。

我正在做Cay Horstmann的组合器解析器练习,我想知道区分表示数字的字符串和表示匹配语句中的变量的字符串的最佳方法:

def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ {
    case a: wholeNumber  => Number(a.toInt)
    case a: String => Variable(a)
}

那里的第二行,"案例a:整数"不合法.我想到了一个正则表达式,但还没有找到一种方法让它与"案例"一起工作.



1> Daniel Spiew..:

我会把它分开一点,把案例分析推进去|.这是组合器的一个优点,并且通常是LL(*)解析:

def factor: Parser[ExprTree] = ( wholeNumber ^^ { Number(_.toInt) }
                               | "(" ~> expr <~ ")" 
                               | ident ^^ { Variable(_) } )

如果您不熟悉下划线语法,我深表歉意.基本上它只是意味着"将第n个参数替换为封闭函数值".因此{ Variable(_) }相当于{ x => Variable(x) }.

这里的另一个语法魔法是~><~运算符代替~.这些运算符意味着该术语的解析应该包括两个parens 的语法,但结果应该仅由结果决定expr.因此,"(" ~> expr <~ ")"匹配完全相同"(" ~ expr ~ ")",但它不需要额外的案例分析来检索内部结果值expr.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有