【发布时间】:2017-08-30 15:21:57
【问题描述】:
以下 Flex 结构的 Regex 等效项是什么?我正在尝试为一个项目重新创建 Rusts 语法,但现在我被困在这件作品上?这是内部/外部文档注释的语法(Rust 有六种类型的 cmets)。它应该匹配像 /** */ 和 /*! */ 这样的 cmets,但例如我不明白为什么第一行需要 [^*] 以及在这种情况下匹配的顺序是什么。
\/\*(\*|\!)[^*] { yy_push_state(INITIAL); yy_push_state(doc_block); yymore(); }
<doc_block>\/\* { yy_push_state(doc_block); yymore(); }
<doc_block>\*\/ {
yy_pop_state();
if (yy_top_state() == doc_block) {
yymore();
} else {
return ((yytext[2] == '!') ? INNER_DOC_COMMENT : OUTER_DOC_COMMENT);
}
}
<doc_block>(.|\n) { yymore(); }
据我了解:第 1 行,匹配开头 /** 或 /*!;第 2 行,匹配块注释(出于某种原因?);第 3 行,匹配结尾 */;第 11 行,匹配任何字符或换行符(为什么?)。
再往前两行,它也匹配正常的块注释。为什么它在文档注释中也匹配?
\/\* { yy_push_state(blockcomment); }
<blockcomment>\/\* { yy_push_state(blockcomment); }
<blockcomment>\*\/ { yy_pop_state(); }
<blockcomment>(.|\n) { }
【问题讨论】:
标签: flex-lexer