From a20865846e65485fe56c99fab825604b21a15d81 Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Wed, 20 Feb 2019 17:36:40 +0100 Subject: [PATCH] new try: optimized yang string parsing --- lib/src/clixon_yang_parse.l | 30 +++++++++++++++++------------- lib/src/clixon_yang_parse.y | 6 +++--- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/src/clixon_yang_parse.l b/lib/src/clixon_yang_parse.l index 91cd4b33..f1f16951 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; } @@ -226,22 +226,26 @@ 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;} +\' { 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; } ;