5

I'm trying to parse some language with multiline string literals using JFlex.

Examples:

'''
this is a valid multiline string literal with 'quoted' word
'''

I've created two states:

%x IN_QUOTED_STRING
%x IN_MULTILINE_QUOTED_STRING

and created several macros and rules:

QUOTED_STRING_TAIL=[^\']* "'"
QUOTED_STRING_START="@"? "'"
MULTILINE_QUOTED_STRING_START = "@"? "'''"
MULTILINE_QUOTED_STRING_TAIL = [.]* "'''"

%%

<YYINITIAL> {MULTILINE_QUOTED_STRING_START} {yybegin(IN_MULTILINE_QUOTED_STRING);}
<YYINITIAL> {QUOTED_STRING_START} {yybegin(IN_QUOTED_STRING);}

<IN_QUOTED_STRING> {QUOTED_STRING_TAIL} {yybegin(YYINITIAL); return STRING;}
<IN_MULTILINE_QUOTED_STRING> {MULTILINE_QUOTED_STRING_TAIL} {yybegin(YYINITIAL); return STRING;}

But it doesn't work. I get "Error: could not match input"

Can anyone helps me with a proplem?

fkorotkov
  • 348
  • 2
  • 13
  • You're coming from Coursera, I suppose? :-) – Dan Abramov May 14 '12 at 17:58
  • 2
    works for me: QUOTED_LITERAL="'" ([^\\\'\r\n] | {ESCAPE_SEQUENCE} | (\\[\r\n]))* ("'"|\\)? ESCAPE_SEQUENCE=\\[^\r\n] ANY_ESCAPE_SEQUENCE = \\[^] THREE_QUO = (\"\"\") ONE_TWO_QUO = (\"[^\"]) | (\"\\[^]) | (\"\"[^\"]) | (\"\"\\[^]) QUO_STRING_CHAR = [^\\\"] | {ANY_ESCAPE_SEQUENCE} | {ONE_TWO_QUO} TRIPLE_QUOTED_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}? %% {TRIPLE_QUOTED_LITERAL }{ return STRING; } {QUOTED_LITERAL} { return STRING; } – fkorotkov May 15 '12 at 11:48

1 Answers1

1

The OP wrote:

works for me:

QUOTED_LITERAL="'" ([^\\\'\r\n] | {ESCAPE_SEQUENCE} | (\[\r\n]))* ("'"|\)?
ESCAPE_SEQUENCE=\[^\r\n] 
ANY_ESCAPE_SEQUENCE = \[^] 
THREE_QUO = (\"\"\") 
ONE_TWO_QUO = (\"[^\"]) | (\"\[^]) | (\"\"[^\"]) | (\"\"\[^]) 
QUO_STRING_CHAR = [^\\\"] | {ANY_ESCAPE_SEQUENCE} | {ONE_TWO_QUO}
TRIPLE_QUOTED_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
%%
<YYINITIAL> {TRIPLE_QUOTED_LITERAL }{ return STRING; } 
<YYINITIAL> {QUOTED_LITERAL} { return STRING; }
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129