【发布时间】:2018-04-17 16:45:16
【问题描述】:
我正在编写一个 flex/bison 解析器,需要识别以下模式 使用 Flex:
begin
/*some code*/
end
上述模式可能会在代码中出现几次。例如:
begin
/*some code #1*/
end
/*some code #2*/
begin
/*some code #3*/
end
识别词法分析器中的模式对我来说很重要,但在使用以下正则表达式时:
block "begin"[.\n]*"end"
{block} {return ID_BLOCK}
它捕获第一个开始和 LAST 结束。我想赶上第一端。 (请注意#1:flex 不支持所有正则表达式,所以我不能使用正则表达式零长度前瞻断言 请注意#2:我认为最好的方法是在“block”的第一场比赛中停止而不是继续填充缓冲区,我只是不知道该怎么做)
****编辑**** 单词 begin 和 end 是唯一单词的简单示例,如下所示:
//BEGIN_SPECIAL_CODE
/*relevant code*/
//END_SPECIAL CODE
【问题讨论】:
-
[.]是一个文字.,所以这就是它会匹配的全部内容。.匹配除换行符以外的任何字符。所以这些都不会匹配你的begin...end块。请在您的问题中包含真实代码。 -
另外:你怎么知道三个字母
end的特别实例标记了一个块的结束?如果该块包含评论/* This comment extends the block */怎么办? -
编辑我的 Q 来回答
-
[.\n]*识别点和换行;任意数量,但只有这两个字符。正则表达式运算符在字符类中 not 是特殊的(这不是 flex 怪癖;您会发现它在所有正则表达式库中都是正确的)。但这只是一个细节;我坚持我的答案。
标签: flex-lexer