【发布时间】:2013-11-22 10:33:22
【问题描述】:
我正在研究编译器并且正在学习词法分析。我知道将每个词素指定为正则表达式,并使用flex,可以自动生成词法分析器。我正在进一步了解如何将正则表达式转换为 NFA,然后再将其转换为 DFA,以便对其进行快速评估。
但是,我的问题是,maximal-munch rule 是如何实施的?在内部,词法分析器如何知道“继续”以找到可能最长的词素?
谢谢!
【问题讨论】:
-
我认为你的意思是用用于词法分析器的 flex-lexer 来标记它;不是用于 Adobe/Apache UI 框架的 Flex。我更改了标记。
-
我猜在 DFA 中它就像在记住最后一个可接受的状态时获取尽可能多的字符一样简单。
-
@JoSo:很好的基本答案。将 DFA 视为具有在运行时转换的状态更容易一些。每个状态都标记为“接受”或“不接受”(例如,绿色和红色状态);它在运行时可能会经历多个绿色和红色状态。最终到达下一个输入字符没有有效出口的状态;如果该状态为绿色,则它接受,否则它会抱怨。所以它并不需要记住最后一个接受状态;当它终止时,它要么合二为一,要么不合。
-
@IraBaxter:如果我的令牌字母表是
{a,ab,aaa}并且我有输入aab怎么办?如果不记得a是可以接受的,这会在使用aa而不是产生令牌列表 [a,ab] 后失败,不是吗? -
你是对的;每个状态都必须指向最后一个接受状态(例如,“aa”的状态不能在字符“b”上转换,但可以引用“a”作为接受状态)。关键是扫描仪不需要记住任何东西,只需检查当前状态。
标签: regex parsing unix compiler-construction flex-lexer