题
我是JFlex的新手。我已经收集到JFlex是一个解析器生成器。但是,我仍然不清楚以下内容,并且需要澄清。
这与使用regex进行模式识别和数据隔离有何不同,以及使用JFlex的额外好处是什么。
JFlex比正则表达式有用的任何特定用例。
它对于一般解析是否有用,比如文本/xml文件?
先谢谢你。
解决方案
JFlex的 不是解析器生成器,而是扫描器生成器。它 标记,标记 的输入。将它与解析器生成器结合使用,如 杯子 或 BYACC/J.
扫描仪和解析器之间有一个重要的区别:
你的问题:
1)和2)假设您必须将输入的字符流转换为令牌流,给定以下模式:
- 如果输入匹配
[0-9]+
(不同于\.
如下)那么它是一个无符号积分。发送"INTEGER"
到输出。 - 如果输入匹配
[0.9]+\.[0-9]*
那么它是一个无符号浮点。发送"FLOAT"
到输出。
请注意,它们共享一个公共前缀。如果你想用正则表达式扫描输入,你必须在它们的公共前缀中分割它们(除非你希望它非常慢,因为正则表达式很昂贵)。在运行时,您必须首先评估前缀,如果匹配,然后评估以下内容,如果 ^\.
, ,你有一个积分,将重新开始,如果 \.
您将不得不评估以下文本是否是浮点数的尾数。如果是这样,你有一个 FLOAT
.
基本上你必须建立一个 有限状态自动机 其中状态是决策点,反映了迄今为止看到的输入,过渡是对输入中看到的当前字符的评估。
JFlex(与许多其他扫描仪生成器一样)将允许您通过仅提供正则表达式(基本上)自动生成此类自动机的代码。并将为其生成非常有效的代码。
3)您可以同时使用生成的扫描仪和生成的解析器来识别任何上下文无关的语言。如编程语言。虽然应该可以用它解析XML(我从未尝试过),但特定用途的解析器通常用于XML(例如 萨克斯, 斯塔克斯, ,等等,等等)由于XML具有众所周知的结构,因此不需要 生成 个解析器。
顺便说一句,请记住 您无法使用正则表达式解析XML. ;)
问候。