gpt4 book ai didi

parsing - Scala:使用 StandardTokenParser 解析十六进制数

转载 作者:行者123 更新时间:2023-12-04 14:35:33 26 4
gpt4 key购买 nike

我通过扩展 scala.util.parsing.combinator.syntactical.StandardTokenParser 来使用 Scala 组合解析器.该类提供以下方法
def ident : Parser[String]用于解析标识符和
def numericLit : Parser[String]用于解析一个数字(我想是十进制)

我正在使用 scala.util.parsing.combinator.lexical.Scanners来自 scala.util.parsing.combinator.lexical.StdLexical为 lexing。

我的要求是解析一个可以是任意长度的十六进制数(没有 0x 前缀)。基本上是这样的语法:([0-9]|[a-f])+
我尝试集成 Regex 解析器,但那里存在类型问题。其他扩展词法定界符和语法规则定义的方法导致token not found!

最佳答案

正如我认为可以通过扩展 Lexer 而不是 Parser 的行为来解决这个问题。标准词法分析器只接受十进制数字,所以我创建了一个新的词法分析器:

class MyLexer extends StdLexical {
override type Elem = Char
override def digit = ( super.digit | hexDigit )
lazy val hexDigits = Set[Char]() ++ "0123456789abcdefABCDEF".toArray
lazy val hexDigit = elem("hex digit", hexDigits.contains(_))
}

我的解析器(必须是 StandardTokenParser)可以扩展如下:
object ParseAST extends StandardTokenParsers{

override val lexical:MyLexer = new MyLexer()
lexical.delimiters += ( "(" , ")" , "," , "@")
...
}

StdLexical 类负责从数字构建“数字”:
class StdLexical {
...

def token: Parser[Token] =
...
| digit~rep(digit)^^{case first ~ rest => NumericLit(first :: rest mkString "")}
}

由于 StdLexical 仅将解析后的数字作为字符串提供,因此对我来说不是问题,因为我对数值也不感兴趣。

关于parsing - Scala:使用 StandardTokenParser 解析十六进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com