summaryrefslogtreecommitdiff
path: root/src/analysis/scan/grammar.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/grammar.y')
-rw-r--r--src/analysis/scan/grammar.y76
1 files changed, 71 insertions, 5 deletions
diff --git a/src/analysis/scan/grammar.y b/src/analysis/scan/grammar.y
index 741b394..c63dda7 100644
--- a/src/analysis/scan/grammar.y
+++ b/src/analysis/scan/grammar.y
@@ -40,6 +40,7 @@ typedef void *yyscan_t;
#include "exprs/setcounter.h"
#include "exprs/relational.h"
#include "exprs/strop.h"
+#include "patterns/customizer.h"
#include "patterns/modifier.h"
#include "patterns/modifiers/list.h"
#include "patterns/tokens/hex.h"
@@ -80,6 +81,7 @@ typedef void *yyscan_t;
GSearchPattern *pattern; /* Nouveau motif à considérer */
GScanTokenModifier *modifier; /* Modificateur pour texte */
+ modifier_arg_t mod_arg; /* Argument pour modificateur */
ScanPlainNodeFlags str_flags; /* Fanions pour texte */
@@ -255,6 +257,8 @@ YY_DECL;
%type <modifier> chained_modifiers
%type <modifier> mod_stage
%type <modifier> modifier
+%type <modifier> modifier_args
+%type <mod_arg> modifier_arg
%type <str_flags> str_flags
@@ -512,9 +516,9 @@ YY_DECL;
{
$$ = $1;
}
- | chained_modifiers
+ | "(" chained_modifiers ")"
{
- $$ = $1;
+ $$ = $2;
}
;
@@ -550,7 +554,7 @@ YY_DECL;
modifier : NAME
{
- $$ = find_scan_token_modifiers_for_name($1.data);
+ $$ = find_scan_token_modifiers_for_name(&$1);
if ($$ == NULL)
{
char *_msg;
@@ -567,9 +571,71 @@ YY_DECL;
YYERROR;
}
}
- | "(" chained_modifiers ")"
+ | NAME "(" modifier_args ")"
{
- $$ = $2;
+ GScanTokenModifier *_mod;
+ bool _status;
+
+ $$ = $3;
+
+ _mod = find_scan_token_modifiers_for_name(&$1);
+ if (_mod == NULL)
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Unknown modifier: \"%.*s\""), (int)$1.len, $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ g_object_unref(G_OBJECT($$));
+
+ YYERROR;
+ }
+
+ _status = g_scan_token_customizer_attach_modifier(G_SCAN_TOKEN_CUSTOMIZER($$), _mod);
+ if (!_status)
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg,
+ _("Unsupported argument for modifier: \"%.*s\""),
+ (int)$1.len, $1.data);
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ g_object_unref(G_OBJECT($$));
+
+ YYERROR;
+ }
+
+ }
+ ;
+
+
+ modifier_args : modifier_arg
+ {
+ $$ = g_scan_token_customizer_new(&$1);
+ }
+ | modifier_args "," modifier_arg
+ {
+ $$ = $1;
+ g_scan_token_customizer_add_extra_arg(G_SCAN_TOKEN_CUSTOMIZER($$), &$3);
+ }
+ ;
+
+ modifier_arg : PLAIN_TEXT
+ {
+ $$.type = MAT_STRING;
+ $$.value.string = $1;
}
;