我正在编写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
答案 0 :(得分:1)
通常,检测复杂的句法结构,如示例中所示的块,由解析器而不是词法分析器完成。词法分析器应该只识别简单的词位,包括关键词begin
和end
(以及注释,标识符,文字和其他任何词汇可能出现在"代码")。 / p>
如果您遵循该模型,找到块的结尾将是直截了当的。否则,您可能会在注释,字符串文字或甚至作为关键字或文字的一部分中出现三个字母end
的实例而感到困惑。 (`friend class Extender;',提供一个简单的C ++示例。)