From 5b6bdbfd3a22fdb155ee9c507a02c1e888eda094 Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Wed, 20 Feb 2019 15:37:10 +0100 Subject: [PATCH] optimized string lex parsing --- lib/src/clixon_yang_parse.l | 43 +++++++++++++++++++++---------------- lib/src/clixon_yang_parse.y | 6 +++--- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/lib/src/clixon_yang_parse.l b/lib/src/clixon_yang_parse.l index 91cd4b33..9e0694d8 100644 --- a/lib/src/clixon_yang_parse.l +++ b/lib/src/clixon_yang_parse.l @@ -191,14 +191,14 @@ identifier [A-Za-z_][A-Za-z0-9_\-\.]* \} { return *yytext; } ; { return *yytext; } . { clixon_yang_parselval.string = strdup(yytext); - BEGIN(UNKNOWN); return CHAR; } + BEGIN(UNKNOWN); return CHARS; } : { return *yytext; } ; { BEGIN(KEYWORD); return *yytext; } \" { _YY->yy_lex_string_state =UNKNOWN; BEGIN(STRINGDQ); return *yytext; } \{ { BEGIN(KEYWORD); return *yytext; } . { clixon_yang_parselval.string = strdup(yytext); - return CHAR; } + return CHARS; } true { clixon_yang_parselval.string = strdup(yytext); return BOOL; } @@ -211,14 +211,14 @@ identifier [A-Za-z_][A-Za-z0-9_\-\.]* \-?[0-9][0-9]* { clixon_yang_parselval.string = strdup(yytext); return INT; } ; { BEGIN(KEYWORD); return *yytext; } -\{ { BEGIN(KEYWORD); return *yytext; } +\{ { BEGIN(KEYWORD); return *yytext; } . { return *yytext; } -\{ { BEGIN(KEYWORD); return *yytext; } -; { BEGIN(KEYWORD); return *yytext; } -{identifier} { clixon_yang_parselval.string = strdup(yytext); - return IDENTIFIER;} -. { return *yytext; } +\{ { BEGIN(KEYWORD); return *yytext; } +; { BEGIN(KEYWORD); return *yytext; } +{identifier} { clixon_yang_parselval.string = strdup(yytext); + return IDENTIFIER;} +. { return *yytext; } \{ { BEGIN(KEYWORD); return *yytext; } ; { BEGIN(KEYWORD); return *yytext; } @@ -226,22 +226,27 @@ identifier [A-Za-z_][A-Za-z0-9_\-\.]* \' { _YY->yy_lex_string_state =STRING; BEGIN(STRINGSQ); return SQ; } \+ { return *yytext; } . { clixon_yang_parselval.string = strdup(yytext); - return CHAR;} + return CHARS;} -\\ { _YY->yy_lex_state = STRINGDQ; BEGIN(ESCAPE); } -\" { BEGIN(_YY->yy_lex_string_state); return *yytext; } -\n { _YY->yy_linenum++; clixon_yang_parselval.string = strdup(yytext); return CHAR;} -. { clixon_yang_parselval.string = strdup(yytext); - return CHAR;} +\\ { _YY->yy_lex_state = STRINGDQ; BEGIN(ESCAPE); } +\" { BEGIN(_YY->yy_lex_string_state); return *yytext; } +\n { _YY->yy_linenum++; + clixon_yang_parselval.string = strdup(yytext); + return CHARS;} +[^\\"\n]+ { clixon_yang_parselval.string = strdup(yytext); + return CHARS;} -\' { BEGIN(_YY->yy_lex_string_state); return SQ; } -\n { _YY->yy_linenum++; clixon_yang_parselval.string = strdup(yytext); return CHAR;} -. { clixon_yang_parselval.string = strdup(yytext); - return CHAR;} +\\ { _YY->yy_lex_state = STRINGSQ; BEGIN(ESCAPE); } +\' { BEGIN(_YY->yy_lex_string_state); return SQ; } +\n { _YY->yy_linenum++; + clixon_yang_parselval.string = strdup(yytext); + return CHARS;} +[^\\'\n]+ { clixon_yang_parselval.string = strdup(yytext); + return CHARS;} . { BEGIN(_YY->yy_lex_state); clixon_yang_parselval.string = strdup(yytext); - return CHAR; } + return CHARS; } [^*\n]* /* eat anything that's not a '*' */ "*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ "*"+"/" BEGIN(_YY->yy_lex_state); diff --git a/lib/src/clixon_yang_parse.y b/lib/src/clixon_yang_parse.y index bc80e474..cd8eab7e 100644 --- a/lib/src/clixon_yang_parse.y +++ b/lib/src/clixon_yang_parse.y @@ -57,7 +57,7 @@ %token MY_EOF %token SQ /* Single quote: ' */ -%token CHAR +%token CHARS %token IDENTIFIER %token BOOL %token INT @@ -1726,14 +1726,14 @@ qstring : '"' ustring '"' { $$=$2; clicon_debug(2,"string-> \" ustring \ ; /* unquoted string */ -ustring : ustring CHAR +ustring : ustring CHARS { int len = strlen($1); $$ = realloc($1, len+strlen($2) + 1); sprintf($$+len, "%s", $2); free($2); } - | CHAR + | CHARS {$$=$1; } ;