diff options
Diffstat (limited to 'src/analysis/scan/tokens.l')
-rw-r--r-- | src/analysis/scan/tokens.l | 123 |
1 files changed, 108 insertions, 15 deletions
diff --git a/src/analysis/scan/tokens.l b/src/analysis/scan/tokens.l index 594d4d9..1cf65fb 100644 --- a/src/analysis/scan/tokens.l +++ b/src/analysis/scan/tokens.l @@ -327,6 +327,9 @@ static void rost_unescape_bytes(const char *src, size_t len, sized_string_t *out %x rule_intro %x raw_block +%x meta +%x meta_value + %x strings %x bytes_value %x bytes_value_raw @@ -399,25 +402,119 @@ bytes_id [A-Za-z_][A-Za-z0-9_]* %{ /* Définition locale d'une règle */ %} + "rule" { + PUSH_STATE(rule_intro); + return RAW_RULE; + } -"rule" { PUSH_STATE(rule_intro); return RAW_RULE; } + <rule_intro>[A-Za-z0-9_]+ { + yylval->sized_cstring.data = yytext; + yylval->sized_cstring.len = yyleng; + return RULE_NAME; + } -<rule_intro>[A-Za-z0-9_]+ { - yylval->sized_cstring.data = yytext; - yylval->sized_cstring.len = yyleng; - return RULE_NAME; - } + <rule_intro>[ \t]* { } + + <rule_intro>"{" { + POP_STATE; + PUSH_STATE(raw_block); + return BRACE_IN; + } + + <raw_block>"meta" { + POP_STATE; + PUSH_STATE(meta); + PUSH_STATE(wait_for_colon); + return META; + } + <raw_block,meta>"strings" { + POP_STATE; + PUSH_STATE(strings); + PUSH_STATE(wait_for_colon); + return STRINGS; + } +<raw_block,meta,strings>"condition" { + POP_STATE; + PUSH_STATE(condition); + PUSH_STATE(wait_for_colon); + return CONDITION; + } + + <wait_for_colon>":" { + POP_STATE; + return COLON; + } + +<raw_block,meta,strings,condition>"}" { + POP_STATE; + return BRACE_OUT; + } + + +%{ /* Définitions communes pour la section "meta:" */ %} + + <meta>{bytes_id} { + yylval->sized_cstring.data = yytext; + yylval->sized_cstring.len = yyleng; + return INFO_KEY; + } + + <meta>"=" { PUSH_STATE(meta_value); return ASSIGN; } + + <meta_value>"true" { POP_STATE; return TRUE_; } + <meta_value>"false" { POP_STATE; return FALSE_; } + + <meta_value>-(0|[1-9][0-9]*) { + POP_STATE; + yylval->signed_integer = strtoll(yytext, NULL, 10); + return SIGNED_INTEGER; + } + + <meta_value>-0x[0-9a-f]+ { + POP_STATE; + yylval->signed_integer = strtoll(yytext, NULL, 16); + return SIGNED_INTEGER; + } + + <meta_value>(0|[1-9][0-9]*) { + POP_STATE; + yylval->unsigned_integer = strtoull(yytext, NULL, 10); + return UNSIGNED_INTEGER; + } + + <meta_value>0x[0-9a-f]+ { + POP_STATE; + yylval->unsigned_integer = strtoull(yytext, NULL, 16); + return UNSIGNED_INTEGER; + } + + <meta_value>\"{str_not_escaped}+\" { + POP_STATE; + + yylval->sized_cstring.data = yytext + 1; + yylval->sized_cstring.len = yyleng - 2; -<rule_intro>[ \t]* { } -<rule_intro>"{" { POP_STATE; PUSH_STATE(raw_block); return BRACE_IN; } + return PLAIN_TEXT; + } -<raw_block>"strings" { POP_STATE; PUSH_STATE(strings); PUSH_STATE(wait_for_colon); return STRINGS; } -<raw_block,strings>"condition" { POP_STATE; PUSH_STATE(condition); PUSH_STATE(wait_for_colon); return CONDITION; } + <meta_value>\"{str_mixed}+\" { + POP_STATE; + rost_unescape_string_bytes(yytext + 1, yyleng - 2, tmp_0); +#ifndef NDEBUG + /* Pour rendre plus lisibles les impressions de débogage */ + tmp_0->data[tmp_0->len] = '\0'; +#endif + yylval->tmp_cstring = tmp_0; + + return ESCAPED_TEXT; + } +%{ /* A déplacer... */ %} + <condition>"true" { return TRUE_; } <condition>"false" { return FALSE_; } @@ -713,7 +810,7 @@ bytes_id [A-Za-z_][A-Za-z0-9_]* return HOOK_O; } - <bytes_regex_range>"]" { + <bytes_regex_range>"]" { POP_STATE; printf(" !! exiting range\n"); return HOOK_C; @@ -870,10 +967,6 @@ bytes_id [A-Za-z_][A-Za-z0-9_]* -<wait_for_colon>":" { POP_STATE; return COLON; } - -<raw_block,strings,condition>"}" { POP_STATE; return BRACE_OUT; } - %{ /* Commentaires */ %} |