簡體   English   中英

使用 flex 匹配帶有轉義字符的 Python 多行字符串

[英]Using flex for matching Python multiline strings with escaped characters

我想知道如何將 python 多行注釋與 flex 匹配。 我遇到了一些麻煩,以下在Regexr上工作正常,但沒有被 flex 識別,我不知道如何解決它。

"""[^"\\]*(?:(?:\\.|"{1,2}(?!"))[^"\\]*)*"""

以前,我使用過:

["]{3}(\\["])*(["]{0,2}[^"](\\["])*)*["]{3}

它可以檢測如下評論:

"""A\"""A"""

但是,它不能處理多個\\,例如

'''A\\\\'''A=B'''C'''

整體上不承認它:

'''A\\\\'''  (comment)   
A=B     
'''C'''(comment) 

您可以使用單個正則表達式識別 Python 長字符串。 它不漂亮,但我相信它有效:

["]{3}(["]{0,2}([^\\"]|\\(.|\n)))*["]{3}

這與您的原始正則表達式非常相似,但它不會嘗試將其反斜杠處理限制為\\" ,因此它可以將\\\\正確識別為反斜杠字符。

一個可能更容易閱讀(但稍微慢一點)的解決方案是使用 start a start 條件。 在這里,我使用yymore()創建一個不包含"""分隔符的標記,但生產代碼可能會試圖解釋 Python 的各種反斜杠轉義。(正是這種需要促使使用開始條件而不是嘗試使用單個正則表達式識別整個字符串。)

%x SC_LONGSTRING
%%
["]{3}     BEGIN(SC_LONGSTRING);
<SC_LONGSTRING>{
  [^\\"]+  yymore();
  \\(.|\n) yymore();
  ["]["]?  yymore();
  ["]{3}   { BEGIN(INITIAL);
             yylval.str = malloc(yyleng - 2);
             memcpy(yylval.str, yytext, yyleng - 3);
             yylval.str[yyleng - 3] = 0;
             return TOKEN_STRING;
           }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM