Lex - 规则只与令牌或令牌序列匹配吗?

时间:2016-04-02 03:58:04

标签: lex

在Lex中,定义了一组规则。规则是否仅适用于由空格等划分的标记?如果行缓冲区中有任何与规则匹配的块,它会起作用吗?

例如,如果我想编写一个使用诸如“void”[a-zA-Z] +“()”之类的规则来检查程序功能的规则(例如,void sum()),这个规则应与一条线匹配。跨越多个令牌的规则可以在Lex中运行吗?

1 个答案:

答案 0 :(得分:0)

当您致电yylex时,它会从当前缓冲区指针开始找到最长匹配。它不会搜索令牌。如果(且仅当)规则可以匹配空格字符,它将匹配空格。

Lex不知道token是什么,而不是"符合规则"的字符序列,所以关于规则是否可以跨越令牌的问题是没有意义的。根据定义,与规则匹配的任何内容都是令牌。

必须始终有一些匹配的规则,因为扫描程序永远不会匹配当前缓冲区指针不启动的任何内容。默认情况下,lex在末尾添加一个规则(如果需要),该规则匹配任何字符并将其回显到yyout。除非你正在写一个换能器,这几乎肯定不是你想要的,所以我总是建议你添加

%option nodefault

(假设您实际使用的是flex,这是迄今为止最常见的lex实现);这将取消默认规则,并在可能没有规则与输入匹配时给出警告。然后,您可以定义自己的回退规则,可能类似于:

.|\n    { return yytext[0]; }

或者可能会抛出扫描仪错误。