diff options
Diffstat (limited to 'src/analysis/scan/grammar.y')
-rw-r--r-- | src/analysis/scan/grammar.y | 266 |
1 files changed, 259 insertions, 7 deletions
diff --git a/src/analysis/scan/grammar.y b/src/analysis/scan/grammar.y index 1daa519..6dfbd75 100644 --- a/src/analysis/scan/grammar.y +++ b/src/analysis/scan/grammar.y @@ -30,7 +30,6 @@ typedef void *yyscan_t; #include "exprs/access.h" #include "exprs/arithmetic.h" #include "exprs/call.h" -#include "exprs/counter.h" #include "exprs/extract.h" #include "exprs/handler.h" #include "exprs/intersect.h" @@ -133,9 +132,13 @@ YY_DECL; %token BYTES_ID %token BYTES_FUZZY_ID %token BYTES_ID_COUNTER +%token BYTES_FUZZY_ID_COUNTER %token BYTES_ID_START +%token BYTES_FUZZY_ID_START %token BYTES_ID_LENGTH +%token BYTES_FUZZY_ID_LENGTH %token BYTES_ID_END +%token BYTES_FUZZY_ID_END %token NAME @@ -230,9 +233,13 @@ YY_DECL; %type <sized_cstring> BYTES_ID %type <sized_cstring> BYTES_FUZZY_ID %type <sized_cstring> BYTES_ID_COUNTER +%type <sized_cstring> BYTES_FUZZY_ID_COUNTER %type <sized_cstring> BYTES_ID_START +%type <sized_cstring> BYTES_FUZZY_ID_START %type <sized_cstring> BYTES_ID_LENGTH +%type <sized_cstring> BYTES_FUZZY_ID_LENGTH %type <sized_cstring> BYTES_ID_END +%type <sized_cstring> BYTES_FUZZY_ID_END %type <sized_cstring> NAME @@ -1401,62 +1408,307 @@ relational_expr : cexpression "<" cexpression { $$ = g_scan_relational_operatio _pattern_handler : BYTES_ID { GSearchPattern *__pat; + __pat = g_scan_rule_get_local_variable(*built_rule, $1.data); + if (__pat == NULL) - $$ = NULL; + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + else { $$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_RAW); g_object_unref(G_OBJECT(__pat)); } + + } + | BYTES_FUZZY_ID + { + size_t __count; + GSearchPattern **__patterns; + size_t __i; + + __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count); + + if (__count == 0) + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + + $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_RAW); + + for (__i = 0; __i < __count; __i++) + g_object_unref(G_OBJECT(__patterns[__i])); + + free(__patterns); + } | BYTES_ID_COUNTER { GSearchPattern *__pat; + __pat = g_scan_rule_get_local_variable(*built_rule, $1.data); + if (__pat == NULL) - $$ = NULL; + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + else { - $$ = g_scan_match_counter_new(__pat); + $$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_COUNTER); g_object_unref(G_OBJECT(__pat)); } + + } + | BYTES_FUZZY_ID_COUNTER + { + size_t __count; + GSearchPattern **__patterns; + size_t __i; + + __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count); + + if (__count == 0) + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + + $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_COUNTER); + + for (__i = 0; __i < __count; __i++) + g_object_unref(G_OBJECT(__patterns[__i])); + + free(__patterns); + } | BYTES_ID_START { GSearchPattern *__pat; + __pat = g_scan_rule_get_local_variable(*built_rule, $1.data); + if (__pat == NULL) - $$ = NULL; + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + else { $$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_START); g_object_unref(G_OBJECT(__pat)); } + + } + | BYTES_FUZZY_ID_START + { + size_t __count; + GSearchPattern **__patterns; + size_t __i; + + __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count); + + if (__count == 0) + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + + $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_START); + + for (__i = 0; __i < __count; __i++) + g_object_unref(G_OBJECT(__patterns[__i])); + + free(__patterns); + } | BYTES_ID_LENGTH { GSearchPattern *__pat; + __pat = g_scan_rule_get_local_variable(*built_rule, $1.data); + if (__pat == NULL) - $$ = NULL; + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + else { $$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_LENGTH); g_object_unref(G_OBJECT(__pat)); } + + } + | BYTES_FUZZY_ID_LENGTH + { + size_t __count; + GSearchPattern **__patterns; + size_t __i; + + __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count); + + if (__count == 0) + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + + $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_LENGTH); + + for (__i = 0; __i < __count; __i++) + g_object_unref(G_OBJECT(__patterns[__i])); + + free(__patterns); + } | BYTES_ID_END { GSearchPattern *__pat; + __pat = g_scan_rule_get_local_variable(*built_rule, $1.data); + if (__pat == NULL) - $$ = NULL; + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + else { $$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_END); g_object_unref(G_OBJECT(__pat)); } + + } + | BYTES_FUZZY_ID_END + { + size_t __count; + GSearchPattern **__patterns; + size_t __i; + + __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count); + + if (__count == 0) + { + char *_msg; + int _ret; + + _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data); + + if (_ret != -1) + { + raise_error(_msg); + free(_msg); + } + + YYERROR; + } + + $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_END); + + for (__i = 0; __i < __count; __i++) + g_object_unref(G_OBJECT(__patterns[__i])); + + free(__patterns); + } ; |