new try: optimized yang string parsing

This commit is contained in:
Olof hagsand 2019-02-20 17:36:40 +01:00
parent 8279c015d8
commit a20865846e
2 changed files with 20 additions and 16 deletions

View file

@ -191,14 +191,14 @@ identifier [A-Za-z_][A-Za-z0-9_\-\.]*
<KEYWORD>\} { return *yytext; } <KEYWORD>\} { return *yytext; }
<KEYWORD>; { return *yytext; } <KEYWORD>; { return *yytext; }
<KEYWORD>. { clixon_yang_parselval.string = strdup(yytext); <KEYWORD>. { clixon_yang_parselval.string = strdup(yytext);
BEGIN(UNKNOWN); return CHAR; } BEGIN(UNKNOWN); return CHARS; }
<UNKNOWN>: { return *yytext; } <UNKNOWN>: { return *yytext; }
<UNKNOWN>; { BEGIN(KEYWORD); return *yytext; } <UNKNOWN>; { BEGIN(KEYWORD); return *yytext; }
<UNKNOWN>\" { _YY->yy_lex_string_state =UNKNOWN; BEGIN(STRINGDQ); return *yytext; } <UNKNOWN>\" { _YY->yy_lex_string_state =UNKNOWN; BEGIN(STRINGDQ); return *yytext; }
<UNKNOWN>\{ { BEGIN(KEYWORD); return *yytext; } <UNKNOWN>\{ { BEGIN(KEYWORD); return *yytext; }
<UNKNOWN>. { clixon_yang_parselval.string = strdup(yytext); <UNKNOWN>. { clixon_yang_parselval.string = strdup(yytext);
return CHAR; } return CHARS; }
<BOOLEAN>true { clixon_yang_parselval.string = strdup(yytext); <BOOLEAN>true { clixon_yang_parselval.string = strdup(yytext);
return BOOL; } return BOOL; }
@ -226,22 +226,26 @@ identifier [A-Za-z_][A-Za-z0-9_\-\.]*
<STRING>\' { _YY->yy_lex_string_state =STRING; BEGIN(STRINGSQ); return SQ; } <STRING>\' { _YY->yy_lex_string_state =STRING; BEGIN(STRINGSQ); return SQ; }
<STRING>\+ { return *yytext; } <STRING>\+ { return *yytext; }
<STRING>. { clixon_yang_parselval.string = strdup(yytext); <STRING>. { clixon_yang_parselval.string = strdup(yytext);
return CHAR;} return CHARS;}
<STRINGDQ>\\ { _YY->yy_lex_state = STRINGDQ; BEGIN(ESCAPE); } <STRINGDQ>\\ { _YY->yy_lex_state = STRINGDQ; BEGIN(ESCAPE); }
<STRINGDQ>\" { BEGIN(_YY->yy_lex_string_state); return *yytext; } <STRINGDQ>\" { BEGIN(_YY->yy_lex_string_state); return *yytext; }
<STRINGDQ>\n { _YY->yy_linenum++; clixon_yang_parselval.string = strdup(yytext); return CHAR;} <STRINGDQ>\n { _YY->yy_linenum++;
<STRINGDQ>. { clixon_yang_parselval.string = strdup(yytext); clixon_yang_parselval.string = strdup(yytext);
return CHAR;} return CHARS;}
<STRINGDQ>[^\\"\n]+ { clixon_yang_parselval.string = strdup(yytext);
return CHARS;}
<STRINGSQ>\' { BEGIN(_YY->yy_lex_string_state); return SQ; } <STRINGSQ>\' { BEGIN(_YY->yy_lex_string_state); return SQ; }
<STRINGSQ>\n { _YY->yy_linenum++; clixon_yang_parselval.string = strdup(yytext); return CHAR;} <STRINGSQ>\n { _YY->yy_linenum++;
<STRINGSQ>. { clixon_yang_parselval.string = strdup(yytext); clixon_yang_parselval.string = strdup(yytext);
return CHAR;} return CHARS;}
<STRINGSQ>[^'\n]+ { clixon_yang_parselval.string = strdup(yytext);
return CHARS;}
<ESCAPE>. { BEGIN(_YY->yy_lex_state); <ESCAPE>. { BEGIN(_YY->yy_lex_state);
clixon_yang_parselval.string = strdup(yytext); clixon_yang_parselval.string = strdup(yytext);
return CHAR; } return CHARS; }
<COMMENT1>[^*\n]* /* eat anything that's not a '*' */ <COMMENT1>[^*\n]* /* eat anything that's not a '*' */
<COMMENT1>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ <COMMENT1>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
<COMMENT1>"*"+"/" BEGIN(_YY->yy_lex_state); <COMMENT1>"*"+"/" BEGIN(_YY->yy_lex_state);

View file

@ -57,7 +57,7 @@
%token MY_EOF %token MY_EOF
%token SQ /* Single quote: ' */ %token SQ /* Single quote: ' */
%token <string> CHAR %token <string> CHARS
%token <string> IDENTIFIER %token <string> IDENTIFIER
%token <string> BOOL %token <string> BOOL
%token <string> INT %token <string> INT
@ -1726,14 +1726,14 @@ qstring : '"' ustring '"' { $$=$2; clicon_debug(2,"string-> \" ustring \
; ;
/* unquoted string */ /* unquoted string */
ustring : ustring CHAR ustring : ustring CHARS
{ {
int len = strlen($1); int len = strlen($1);
$$ = realloc($1, len+strlen($2) + 1); $$ = realloc($1, len+strlen($2) + 1);
sprintf($$+len, "%s", $2); sprintf($$+len, "%s", $2);
free($2); free($2);
} }
| CHAR | CHARS
{$$=$1; } {$$=$1; }
; ;