如何在flex中找到除少数之外的所有单词?

时间:2012-12-02 14:23:49

标签: flex-lexer

我需要在flex中找到除少数(例如“car”,“bus”,“train”)之外的所有单词。你有什么想法怎么做吗?

1 个答案:

答案 0 :(得分:0)

这已经有一段时间没有得到答复,并且是lex / flex的新用户在启动时遇到的标准问题。在其他地方也没有明确的答案。

问题是询问如何匹配非保留字的所有标识符。这是几乎每个编译器都会出现的标准计算机语言功能。它只是没有以明确的方式表达。在编译器构造中,使用flex,我们必须找到除少数之外的所有单词(也称为标识符)(例如“if”,“then”,“else”)。这是通过将词汇模式放入规范中的顺序来实现的。 Wikipedia page on Flex中的主要示例显示了这一点很常见!

我们会这样做:

car    return(CAR);
bus    return(BUS);
train    return(TRAIN);
[a-z]+   return(WORD);

但是,如果我们以不同的顺序执行此操作,我们会收到错误:

[a-z]+   return(WORD);
car    return(CAR);
bus    return(BUS);
train    return(TRAIN);

它会反对“汽车”,“公共汽车”和“火车”的匹配,因为它们已经包含在WORD中。

这种情况也发生在语言的其他地方。例如,符号“=”,“> =”,“>”,“==”,“++”,“+”,“+ =”等。我们还必须小心我们定义的顺序他们的弯曲词汇确保没有错误。