Unix Flex Regex用于多行注释

Lun*_*irl 10 regex unix flex-lexer

我在Unix上使用Flex制作词法分析器.如果你曾经使用过它,那么在你知道你主要只是为你正在编写Lexical Analyzer的任何语言的标记定义正则表达式时.我被困在最后一部分.我需要正确的Regex用于多行注释,允许类似的东西

/* This is a comment \*/
Run Code Online (Sandbox Code Playgroud)

但也允许

/* This **** //// is another type of comment */
Run Code Online (Sandbox Code Playgroud)

有人能帮忙吗?

Don*_*ows 15

您不能将C样式注释与Flex中的简单正则表达式匹配; 它们需要基于起始状态的更复杂的匹配方法.在Flex的常见问题解答说,如何(当然,他们为做/*...*/形式;在刚刚处理其他形式的<INITIAL>状态应该是简单).


Abr*_*lip 8

但是,如果您需要使用正则表达式,那么确实存在一个不太复杂的解决方案:


"/*"([^*] |(\*+ [^*/]))*\*+\/
该正则表达式的完整解释,并推导是基于出色阐述了这里.
简而言之:
  • "/*"标志着评论的开头
  • ([^*] |(\*+ [^*/]))*表示接受所有不是*([^*])的字符或接受一个或多个*的序列,只要序列没有跟随它的'*'或/('(*+ [^*/])).这意味着除了*****/之外,所有******...序列都将被接受,因为你找不到*之后没有*或a /的序列.
  • *******/case然后由RegEx的最后一位处理,它匹配任意数量的*后跟一个/来标记注释的结尾,即\*+\/