首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JFlex代替Regex

使用JFlex代替Regex
EN

Stack Overflow用户
提问于 2010-07-14 18:14:04
回答 1查看 1.1K关注 0票数 1

我是JFlex的新手。我已经了解到,JFlex是一个解析器生成器。然而,我仍然不清楚以下几点,并需要围绕同样的澄清。

  1. 这与使用regex进行模式识别和数据隔离有何不同,以及使用JFlex的额外好处是什么。
  2. JFlex对regex有用的任何特定用例。
  3. 它对一般解析(比如文本/ xml文件)有帮助吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-06 20:51:23

JFlex不是解析器生成器,而是扫描器生成器。它标记输入。将其与解析器生成器(如杯子BYACC/J )结合使用。

扫描仪和解析器之间有一个重要的区别:

  • 扫描仪可以识别正规语言,而
  • 解析器可以识别上下文自由语言

你的问题:

( 1)和2)假设必须将输入的字符流转换为令牌流(给定以下模式):

  • 如果输入与[0-9]+匹配(与\.后面的内容不同),那么它就是一个无符号积分。将"INTEGER"发送到输出。
  • 如果输入与[0.9]+\.[0-9]*匹配,那么它就是一个无符号浮点。将"FLOAT"发送到输出。

请注意,它们有一个共同的前缀。如果要使用正则表达式扫描输入,则必须在它们的公共前缀中拆分它们(除非您希望它非常慢,因为regexes很昂贵)。在运行时,您必须首先计算前缀,如果匹配,然后计算接下来的内容,如果是^\.,则需要重新开始,如果\.必须计算以下文本是否是浮点数的尾数。如果是这样的话,您就有了一个FLOAT

基本上,您需要构建的是一个有限状态自动机,其中状态是决策点,反映了到目前为止所看到的输入,而转换是对输入中当前字符的评估。

JFlex (与许多其他扫描仪生成器一样)将允许您仅通过提供正则表达式(基本上)就可以自动生成此类自动机的代码。并将为其生成非常高效的代码。

3)可以同时使用生成的扫描器和生成的解析器来识别任何上下文无关的语言。例如编程语言。虽然应该可以用它来解析XML (我从未尝试过),但特定用途的解析器通常用于XML (如萨克斯StAX等),因为XML有着众所周知的结构,因此不需要生成解析器。

顺便说一句,请记住不能用Regex解析XML。。;)

致以问候。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3249124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档