Reguliere uitdrukking voor een letterlijke tekenreeks in flex/lex

Ik ben aan het experimenteren om flex te leren en zou graag string-letterwoorden willen matchen. Mijn code ziet er momenteel als volgt uit:

"\""([^\n\"\\]*(\\[.\n])*)*"\""        {/*matches string-literal*/;}

Ik worstel al een uur met variaties en krijg het niet voor elkaar zoals het zou moeten. Ik hoop in wezen een letterlijke tekenreeks te matchen die geen nieuwe regel kan bevatten (tenzij deze een escape-teken heeft) en die escape-tekens ondersteunt.

Ik schrijf waarschijnlijk gewoon een slechte reguliere expressie of een die niet compatibel is met flex. Gelieve te adviseren!


Antwoord 1, autoriteit 100%

Een string bestaat uit een aanhalingsteken

"

gevolgd door nul of meer van een escaped iets

\\.

of een niet-aanhalingsteken, niet-backslash-teken

[^"\\]

en tot slot een afsluitende offerte

"

Alles bij elkaar, en je hebt

\"(\\.|[^"\\])*\"

De begrenzende aanhalingstekens zijn voorzien van escapetekens omdat het Flex-meta-tekens zijn.


Antwoord 2, autoriteit 22%

Voor een enkele regel… kunt u dit gebruiken:

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}

Antwoord 3, autoriteit 7%

Wat dacht je van een startstatus gebruiken…

int enter_dblquotes = 0;
%x DBLQUOTES
%%
\" { BEGIN(DBLQUOTES); enter_dblquotes++; }
<DBLQUOTES>*\"
{
  if (enter_dblquotes){
    handle_this_dblquotes(yytext);
    BEGIN (EERSTE); /* keer terug naar normaal */
    enter_dblquotes--;
  }
}
     ...meer regels volgen...

Het was vergelijkbaar met dat effect (flex gebruikt %sof %xom aan te geven welke status zou worden verwacht. Wanneer de flex-invoer een aanhalingsteken detecteert, schakelt deze over naar een andere staat, gaat dan door met lexing totdat het een ander citaat bereikt, waarin het terugkeert naar de normale staat.


Antwoord 4, autoriteit 2%

Plak mijn codefragment over het omgaan met strings in flex, hopelijk inspireer je tot nadenken.

Gebruik Startvoorwaardeom de letterlijke tekenreeksen beter schaalbaar te maken en duidelijk.

%x SINGLE_STRING
%%
\"                          BEGIN(SINGLE_STRING);
<SINGLE_STRING>{
  \n                        yyerror("the string misses \" to termiate before newline");
  <<EOF>>                   yyerror("the string misses \" to terminate before EOF");
  ([^\\\"]|\\.)*            {/* do your work like save in here */}
  \"                        BEGIN(INITIAL);
  .                         ;
}

Antwoord 5

Dit is wat we gebruiken in Zolangvoor letterlijke tekenreeksen van één regel met ingesloten sjablonen ${...}

\"(\$\{.*\}|\\.|[^\"\\])*\"


Antwoord 6

Een antwoord dat te laat komt, maar dat nuttig kan zijn voor de volgende die het nodig heeft:

\"(([^\"]|\\\")*[^\\])?\"

Other episodes