正則表達式對應於以下Flex結構?我正在嘗試爲一個項目重新創建Rusts語法,但現在我被卡在了這一塊上?這是內部/外部文檔評論的語法(Rust有六種類型的評論)。它應該匹配評論,如/** */
和/*! */
,但例如我不明白爲什麼[^*]
需要在第一行以及匹配的順序是在這種情況下。找出Flex(詞法分析器)yy_push_state
\/\*(\*|\!)[^*] { 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) { }
首先,感謝您的好書面解釋。不,我沒有使用Bleibig的回購代碼。我甚至不確定他想要實現什麼。我從原始的Rust repo https://github.com/rust-lang/rust/tree/master/src/grammar得到了這個。我認爲這將是代碼庫中最具代表性的代碼?你的回答清除了我的困惑。 –
好吧,我將刪除對Bleibig回購的引用。我不知道你引用的文件的狀態是什麼,但它在Antlr語法的註釋處理上有所不同(https://github.com/rust-lang/rust/blob/master/src/grammar/RustLexer)。 g4)自述文件所說的是權威的(但實際上並沒有被rustc使用)。 – rici
@AdrianZ:有什麼困惑,我無法幫助你? :) – rici