我是JFlex的新手。我已经了解到,JFlex是一个解析器生成器。然而,我仍然不清楚以下几点,并需要围绕同样的澄清。
提前谢谢。
发布于 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。。;)
致以问候。
https://stackoverflow.com/questions/3249124
复制相似问题