问题
I am implementing a compiler and one thing I'd like to do is the string concatenation using '+', eg:
str_cnct = "hi" + "dear"
So the value now is "hidear".
The problem is that my regex in flex captures all of it directly as a string giving "hi + dear".
My current regex is: \".*\"
{string} {
yylval.struct_val.val.chain = (char *)malloc(sizeof(char)*yyleng);
strncpy(yylval.struct_val.val.chain,yytext,yyleng);
remove_char(yylval.struct_val.val.chain);
yylval.struct_val.length = yyleng;
yylval.struct_val.line = yylineno;
yylval.struct_val.column = columnno + yyleng + 2;
printf("--- String: %s\n", yylval.struct_val.val.chain);
return(STRING);
}
How to avoid this and capture "hi" then '+' as operator and then "dear"?
Thanks in advance
回答1:
Try something like the following:
^\"([^\"]*)\"\s*\+\s*\"([^\"]*)\"$
$1 will capture "hi" w/o quotes and $2 will capture "dear" w/o quotes for string '"hi" + "dear"'.
回答2:
I finally went through it like this:
%x MATCH_STR
quotes \"
%%
{quotes} { BEGIN(MATCH_STR); }
<MATCH_STR>[\n] { yyerror("String not closed"); }
<MATCH_STR>[^"^\n]* {
yylval.struct_val.val.chain = (char *)malloc(sizeof(char)*yyleng);
strncpy(yylval.struct_val.val.chain,yytext,yyleng);
remove_char(yylval.struct_val.val.chain);
yylval.struct_val.length = yyleng;
yylval.struct_val.line = yylineno;
yylval.struct_val.column = columnno + yyleng + 2;
printf("--- String: %s\n", yylval.struct_val.val.chain);
return(STRING);
}
<MATCH_STR>{quotes} { BEGIN(INITIAL); }
来源:https://stackoverflow.com/questions/21025157/regex-matching-string