关于lex的转义序列的正则表达式澄清

时间:2016-01-27 20:19:35

标签: regex escaping lex

我正在创建一个lexer.l文件,除了一个部分之外,它正在按预期工作。我有规则:

[\(\*.*\*\)] {}

我想在文件中遇到(* this is a test *)时这样做,我根本就什么都不做。但是当我运行lex lexer.l时,我会在规则\(\*\)的行上收到警告,说明它们永远无法满足。所以我想我的问题是为什么[\(\*.*\*\)] {}会干扰\(和其他人?我怎样才能抓住(* this is a test *)

1 个答案:

答案 0 :(得分:0)

注释语法(*…*)的语言通常允许嵌套注释,并且(f)lex不能轻易识别嵌套注释,因为嵌套需要无上下文语法,而词法扫描器只能实现常规语言。 / p>

如果您的评论没有嵌套(以便(* something (* else *)是评论,而不是更长评论的前缀),那么您可以使用正则表达式

[(][*][^*]*[*]+([^*)][^*]*[*]+)*[)]

如果确实需要嵌套注释,可以使用开始条件和堆栈(或模拟堆栈,如下所示):

%x SC_COMMENT

%%
  int comment_nesting = 0;

"(*"             { BEGIN(SC_COMMENT); }
<SC_COMMENT>{
  "(*"           { ++comment_nesting; }
  "*"+")"        { if (comment_nesting) --comment_nesting;
                   else BEGIN(INITIAL); }
  "*"+           ; 
  [^(*\n]+       ;
  [(]            ; 
  \n             ; 
}

该片段取自this answer,并进行了少量调整,因为该答案可识别嵌套的/*…*/条评论。这里出现了对代码的更全面的解释。