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

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

发布时间:2020-12-16 18:58:03 所属栏目:安全 来源:网络整理
导读:我通过扩展 scala.util.parsing.combinator.syntactical.StandardTokenParser来使用 Scala组合解析器.该类提供以下方法 def ident:用于解析标识符的解析器[String] def numericLit:用于解析数字的解析器[String](我猜想小数) 我正在使用scala.util.parsing
我通过扩展 scala.util.parsing.combinator.syntactical.StandardTokenParser来使用 Scala组合解析器.该类提供以下方法

def ident:用于解析标识符的解析器[String]

def numericLit:用于解析数字的解析器[String](我猜想小数)

我正在使用scala.util.parsing.combinator.lexical.Scanners来自scala.util.parsing.combinator.lexical.StdLexicalfor lexing.

我的要求是解析一个十六进制数字(不带0x前缀),可以是任意长度.基本上是一个语法,如:([0-9] | [a-f])

我尝试集成Regex解析器,但那里有类型问题.扩展词法分隔符和语法规则定义的其他方法导致找不到令牌!

解决方法

我认为这个问题可以通过扩展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只将解析后的数字作为字符串给出,所以对我来说不是问题,因为我对数值也不感兴趣.

(编辑:李大同)

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

    推荐文章
      热点阅读