我正在嘗試使用以下條件進行多行注釋:
- 開始于
'''和結束于''' - 里面不能正好包含三個
''',例如:'''''' Correct '''''''' Correct '''a'a''a''''a''' Correct ''''''''' Incorrect '''a'''a''' Incorrect
這是我的近似值,但我無法為此做出正確的表達:
'''([^']|'[^']|''[^']|'''' [^'])*'''
uj5u.com熱心網友回復:
簡單的解決方案是使用開始條件。(請注意,這不會通過所有測驗用例,因為我認為問題描述不明確。見下文。)
在下文中,我假設您想要回傳匹配的令牌,并且您正在使用由 yacc/bison 生成的決議器,其中包括char* str聯合型別之一。開始條件塊是一個 Flex 擴展;萬一您使用其他 lex 派生詞,您需要每行寫出一個模式,每個模式都帶有<SC_TRIPLE_QUOTE>前綴(并且在該模式和模式之間沒有空格)。
%x SC_TRIPLE_QUOTE
%%
''' { BEGIN(TRIPLE_QUOTE); }
<TRIPLE_QUOTE>{
''' { yylval.str = strndup(yytext, yyleng - 3);
BEGIN(INITIAL);
return STRING_LITERAL;
}
[^'] |
''?/[^'] |
'''' { yymore(); }
<<EOF>> { yyerror("Unterminated triple-quoted string");
return 0;
}
}
我希望這或多或少是不言自明的。開始條件中的四個模式匹配'''終止符、除 之外的任何字符序列'、不超過兩個'、至少四個'。yymore()導致相應的匹配被累積。呼叫strndup排除分隔符。
筆記:
上面的代碼不會提供您對第二個示例的期望,因為我認為這是不可能的(或者,您需要更清楚兩種可能的分析中哪一個是正確的,以及為什么)。考慮可能的評論:
'''a'''
'''a''''
'''a''''a'''
根據您的描述(以及您的第三個示例),第三個應該與內部值匹配,a''''a因為''''不止三個引號。但是根據您的第二個示例(稍作修改),第二個應該與內部 value 匹配,'因為 final'''被視為終止符。問題是,如何區分這兩種可能的解釋?換句話說,詞法掃描器有什么線索,在第二種情況下,令牌在第三種情況下結束,'''而在第三種情況下卻沒有?由于這兩者都是輸入流的一部分,因此后面可能會有任意文本。并且由于這些被認為是多行注釋,因此沒有先驗理由相信換行符不是標記的一部分。
So I made an arbitrary choice about which interpretation to choose. I could have made the other arbitrary choice, but then a different example wouldn't work.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437247.html
上一篇:如何消除或模仿負面的后視?
