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.y139
1 files changed, 76 insertions, 63 deletions
diff --git a/src/analysis/scan/grammar.y b/src/analysis/scan/grammar.y
index c63dda7..2863e21 100644
--- a/src/analysis/scan/grammar.y
+++ b/src/analysis/scan/grammar.y
@@ -31,6 +31,7 @@ typedef void *yyscan_t;
#include "exprs/arithmetic.h"
#include "exprs/call.h"
#include "exprs/counter.h"
+#include "exprs/extract.h"
#include "exprs/handler.h"
#include "exprs/intersect.h"
#include "exprs/item.h"
@@ -274,7 +275,8 @@ YY_DECL;
%type <expr> cexpression _cexpression
%type <expr> literal
-%type <expr> item_chain
+%type <expr> chain_items
+%type <expr> chain_item
%type <args_list> call_args
%type <expr> logical_expr
%type <expr> relational_expr
@@ -285,9 +287,9 @@ YY_DECL;
%type <expr> pattern_set_items
%type <expr> set
%type <expr> set_items
-%type <expr> set_access
%type <expr> intersection
%type <expr> pattern_handler
+%type <expr> _pattern_handler
@@ -942,14 +944,13 @@ YY_DECL;
cexpression : _cexpression { $$ = $1; if ($$ == NULL) { printf("ERROR !!!\n"); YYERROR; } }
_cexpression : literal { $$ = $1; }
- | item_chain { $$ = $1; }
+ | chain_items { $$ = $1; }
| logical_expr { $$ = $1; }
| relational_expr { $$ = $1; }
| string_op { $$ = $1; }
| arithm_expr { $$ = $1; }
| set_match_counter { $$ = $1; }
| set { $$ = $1; }
- | set_access { $$ = $1; }
| intersection { $$ = $1; }
| pattern_handler { $$ = $1; }
| "(" cexpression ")" { $$ = $2; }
@@ -993,42 +994,48 @@ YY_DECL;
{
$$ = g_scan_literal_expression_new(LVT_STRING, &$1);
}
+ | STRING "[" cexpression "]"
+ {
+ GScanExpression *__src;
+ __src = g_scan_literal_expression_new(LVT_STRING, &$1);
+ $$ = g_scan_set_item_new(__src, $3);
+ g_object_unref(G_OBJECT(__src));
+ g_object_unref(G_OBJECT($3));
+ }
;
- item_chain : NAME { $$ = g_scan_named_access_new(&$1); }
- | NAME "(" ")" { $$ = g_scan_pending_call_new(&$1, NULL, 0); }
- | NAME "(" call_args ")"
+
+ chain_items : chain_item
{
- size_t __i;
- $$ = g_scan_pending_call_new(&$1, $3.args, $3.count);
- for (__i = 0; __i < $3.count; __i++)
- g_object_unref(G_OBJECT($3.args[__i]));
- free($3.args);
+ $$ = $1;
}
- | item_chain "." NAME
+ | chain_items "." chain_item
{
- GScanExpression *__next;
- __next = g_scan_named_access_new(&$3);
- g_scan_named_access_attach_next(G_SCAN_NAMED_ACCESS($1), G_SCAN_NAMED_ACCESS(__next));
+ g_scan_named_access_attach_next(G_SCAN_NAMED_ACCESS($1), G_SCAN_NAMED_ACCESS($3));
$$ = $1;
}
- | item_chain "." NAME "(" ")"
+ ;
+
+ chain_item : NAME
+ {
+ $$ = g_scan_named_access_new(&$1);
+ }
+ | NAME "(" ")"
{
- GScanExpression *__next;
- __next = g_scan_pending_call_new(&$3, NULL, 0);
- g_scan_named_access_attach_next(G_SCAN_NAMED_ACCESS($1), G_SCAN_NAMED_ACCESS(__next));
- $$ = $1;
+ $$ = g_scan_pending_call_new(&$1, NULL, 0);
}
- | item_chain "." NAME "(" call_args ")"
+ | NAME "(" call_args ")"
{
- GScanExpression *__next;
size_t __i;
- __next = g_scan_pending_call_new(&$3, $5.args, $5.count);
- for (__i = 0; __i < $5.count; __i++)
- g_object_unref(G_OBJECT($5.args[__i]));
- free($5.args);
- g_scan_named_access_attach_next(G_SCAN_NAMED_ACCESS($1), G_SCAN_NAMED_ACCESS(__next));
- $$ = $1;
+ $$ = g_scan_pending_call_new(&$1, $3.args, $3.count);
+ for (__i = 0; __i < $3.count; __i++)
+ g_object_unref(G_OBJECT($3.args[__i]));
+ free($3.args);
+ }
+ | NAME "[" cexpression "]"
+ {
+ $$ = g_scan_pending_extraction_new(&$1, $3);
+ g_object_unref(G_OBJECT($3));
}
;
@@ -1307,46 +1314,39 @@ relational_expr : cexpression "<" cexpression { $$ = g_scan_relational_operatio
;
- set : "(" ")"
- {
- $$ = g_scan_generic_set_new();
- }
- | "(" cexpression "," ")"
- {
- $$ = g_scan_generic_set_new();
- g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $2);
- g_object_unref(G_OBJECT($2));
- }
- | "(" set_items ")"
- {
- $$ = $2;
- }
- ;
-
- set_items : cexpression "," cexpression
- {
- $$ = g_scan_generic_set_new();
- g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $1);
- g_object_unref(G_OBJECT($1));
- g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $3);
- g_object_unref(G_OBJECT($3));
- }
- | set_items "," cexpression
- {
- $$ = $1;
- g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $3);
- g_object_unref(G_OBJECT($3));
- }
- ;
+ set : "(" ")"
+ {
+ $$ = g_scan_generic_set_new();
+ }
+ | "(" cexpression "," ")"
+ {
+ $$ = g_scan_generic_set_new();
+ g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $2);
+ g_object_unref(G_OBJECT($2));
+ }
+ | "(" set_items ")"
+ {
+ $$ = $2;
+ }
+ ;
- set_access : cexpression "[" cexpression "]"
+ set_items : cexpression "," cexpression
{
- $$ = g_scan_set_item_new($1, $3);
+ $$ = g_scan_generic_set_new();
+ g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $1);
g_object_unref(G_OBJECT($1));
+ g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $3);
+ g_object_unref(G_OBJECT($3));
+ }
+ | set_items "," cexpression
+ {
+ $$ = $1;
+ g_scan_generic_set_add_item(G_SCAN_GENERIC_SET($$), $3);
g_object_unref(G_OBJECT($3));
}
;
+
intersection : cexpression "in" cexpression
{
$$ = g_scan_sets_intersection_new($1, $3);
@@ -1355,7 +1355,20 @@ relational_expr : cexpression "<" cexpression { $$ = g_scan_relational_operatio
}
;
- pattern_handler : BYTES_ID
+
+ pattern_handler : _pattern_handler
+ {
+ $$ = $1;
+ }
+ | pattern_handler "[" cexpression "]"
+ {
+ $$ = g_scan_set_item_new($1, $3);
+ g_object_unref(G_OBJECT($1));
+ g_object_unref(G_OBJECT($3));
+ }
+ ;
+
+ _pattern_handler : BYTES_ID
{
GSearchPattern *__pat;
__pat = g_scan_rule_get_local_variable(*built_rule, $1.data);