Lex - 规则是只匹配标记还是匹配标记序列?
Lex - Do the rules only match to the tokens or over the sequence of tokens?
在 Lex 中,定义了一组规则。这些规则是否仅适用于由空格等分隔的标记?如果行缓冲区中有符合规则的块,它会起作用吗?
例如,如果我想编写一个规则来检查程序的功能(例如,void sum()),并使用 "void "[a-zA-Z]+"( )",这条规则应该匹配到一行。跨越多个标记的规则可以在 Lex 中工作吗?
当您调用 yylex
时,它会找到从当前缓冲区指针 开始的最长匹配 。它不搜索令牌。如果(且仅当)规则可以匹配 space 个字符,它将匹配 spaces。
Lex 不知道 token
除了 "a sequence of characters which match a rule" 之外是什么,所以关于规则是否可以跨越标记的问题是没有意义的。根据定义,任何符合规则的东西都是标记。
必须始终有一些匹配的规则,因为扫描器永远不会匹配任何不是从当前缓冲区指针开始的东西。默认情况下,lex 在末尾添加一条规则(如果需要),它匹配任何字符并将其回显到 yyout
。除非你正在编写一个传感器,否则这几乎肯定不是你想要的,所以我总是建议你添加
%option nodefault
(假设您实际使用的是 flex
,这是迄今为止最常见的 lex 实现);这将抑制默认规则并在可能没有规则与输入匹配时向您发出警告。然后你可以定义你自己的回退规则,它可能是这样的:
.|\n { return yytext[0]; }
或者可能引发扫描仪错误。
在 Lex 中,定义了一组规则。这些规则是否仅适用于由空格等分隔的标记?如果行缓冲区中有符合规则的块,它会起作用吗?
例如,如果我想编写一个规则来检查程序的功能(例如,void sum()),并使用 "void "[a-zA-Z]+"( )",这条规则应该匹配到一行。跨越多个标记的规则可以在 Lex 中工作吗?
当您调用 yylex
时,它会找到从当前缓冲区指针 开始的最长匹配 。它不搜索令牌。如果(且仅当)规则可以匹配 space 个字符,它将匹配 spaces。
Lex 不知道 token
除了 "a sequence of characters which match a rule" 之外是什么,所以关于规则是否可以跨越标记的问题是没有意义的。根据定义,任何符合规则的东西都是标记。
必须始终有一些匹配的规则,因为扫描器永远不会匹配任何不是从当前缓冲区指针开始的东西。默认情况下,lex 在末尾添加一条规则(如果需要),它匹配任何字符并将其回显到 yyout
。除非你正在编写一个传感器,否则这几乎肯定不是你想要的,所以我总是建议你添加
%option nodefault
(假设您实际使用的是 flex
,这是迄今为止最常见的 lex 实现);这将抑制默认规则并在可能没有规则与输入匹配时向您发出警告。然后你可以定义你自己的回退规则,它可能是这样的:
.|\n { return yytext[0]; }
或者可能引发扫描仪错误。