I'm experimenting to learn flex and would like to match string literals. My code currently looks like:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
I've been struggling with variations for an hour or so and can't get it working the way it should. I'm essentially hoping to match a string literal that can't contain a new-line (unless it's escaped) and supports escaped characters.
I am probably just writing a poor regular expression or one incompatible with flex. Please advise!
An answer that arrives late but which can be useful for the next one who will need it:
This is what we use in Zolang for single line string literals with embedded templates
${...}
\"(\$\{.*\}|\\.|[^\"\\])*\"
A string consists of a quote mark
followed by zero or more of either an escaped anything
or a non-quote character
and finally a terminating quote
Put it all together, and you've got
The delimiting quotes are escaped because they are Flex meta-characters.
How about using a start state...
It was similar to that effect (flex uses
%s
or%x
to indicate what state would be expected. When the flex input detects a quote, it switches to another state, then continues lexing until it reaches another quote, in which it reverts back to the normal state.For a single line... you can use this: