1

我需要在 flex 中找到除少数几个单词(例如“汽车”、“公共汽车”、“火车”)之外的所有单词。你有什么想法吗?

4

1 回答 1

0

这个问题已经有一段时间没有解决了,这是 lex/flex 的新用户在开始时遇到的标准问题。SO的其他地方也没有明确的答案。

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

我们会这样做:

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 中。

这种情况也出现在其他语言中。以符号“=”、“>=”、“>”、“==”、“++”、“+”、“+=”等符号为例。我们还必须注意定义它们的词位的顺序在 flex 中以确保没有错误。

于 2015-01-23T10:35:20.400 回答