【问题标题】:Stop Flex when first matching a TOKEN首次匹配 TOKEN 时停止 Flex
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2022-12-03
    相关资源
    最近更新 更多