summaryrefslogtreecommitdiff
path: root/src/analysis/scan/tokens.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/tokens.l')
-rw-r--r--src/analysis/scan/tokens.l123
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 */ %}