编写Lex标识符规范

时间:2015-10-21 13:57:02

标签: compiler-construction flex-lexer lex

我正在尝试编写lex规范来识别具有限制的语言中的标识符(Ids): (1)Id可以是字母后跟字母/数字/ _(最大长度5) (2)Id不能是任何关键字:“if”“else”“for for”while“.... etc

号码(1)我没有遇到任何问题。我的问题是试图找出第二个问题。关键字现在不是令牌 - 因此必须在Id的正则表达式中实现排除。

我到目前为止的正则表达式是:{L}(({L} | {D} | _){1,4})其中L和D分别是字母和数字。如何在此处添加关键字排除?

1 个答案:

答案 0 :(得分:0)

有可能编写一个符合限制2的正则表达式,但这很复杂且容易出错,并且随着关键字的数量而严重缩放(即每次添加新关键字时,您都必须费力地扩展正则表达式更复杂的。)

相反,这个问题通常是通过定义标识符的正则表达式而不考虑关键字并利用lex的规则来解决歧义来解决的,这些规则是这样的:

  1. 如果有多个正则表达式可以匹配当前输入,则选择具有最长匹配的正则表达式(这称为最大蒙克规则)。例如,对于输入“ifay”,词法分析器将生成IDENT("ifay")而不是KEYWORD_IF(后跟IDENT("ay")),因为“ifay”是较长的匹配。

  2. 如果多个正则表达式生成相同长度的匹配项,则lex将选择其定义在lex文件中首先出现的那个。因此,只要KEYWORD_IF的定义出现在lex文件中IDENTIFIER的定义之前,“if”将被标记为关键字而不是标识符。

  3. 因此,只要您将关键字定义放在标识符定义之前,词法分析器就可以根据需要运行,而无需调整标识符规则。