首次匹配TOKEN时停止Flex

时间:2018-04-17 16:45:17

标签: flex-lexer

我正在编写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}

它捕获第一个开始和最后结束。我想赶上第一个结局。 (请注意#1:flex不支持所有正则表达式,所以我不能使用正则表达式零长度前瞻断言 请注意#2:我认为最好的方法是停在第一场比赛“阻止”而不是继续填充缓冲区,我只是不知道该怎么做)

**** **** EDIT 单词begin和end是一个独特单词的简单示例,如下所示:

//BEGIN_SPECIAL_CODE
/*relevant code*/
//END_SPECIAL CODE

1 个答案:

答案 0 :(得分:1)

通常,检测复杂的句法结构,如示例中所示的块,由解析器而不是词法分析器完成。词法分析器应该只识别简单的词位,包括关键词beginend(以及注释,标识符,文字和其他任何词汇可能出现在"代码")。 / p>

如果您遵循该模型,找到块的结尾将是直截了当的。否则,您可能会在注释,字符串文字或甚至作为关键字或文字的一部分中出现三个字母end的实例而感到困惑。 (`friend class Extender;',提供一个简单的C ++示例。)

相关问题