163 lines
3.9 KiB
Diff
163 lines
3.9 KiB
Diff
|
From 160d84fb761c54a5f757aff907fc197d259196bd Mon Sep 17 00:00:00 2001
|
||
|
From: Phil Sutter <psutter@redhat.com>
|
||
|
Date: Mon, 17 Feb 2020 15:26:42 +0100
|
||
|
Subject: [PATCH] parser: add a helper for concat expression handling
|
||
|
|
||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1795224
|
||
|
Upstream Status: nftables commit 10f114806ccd9
|
||
|
|
||
|
commit 10f114806ccd9d64f9d72eaa813babb04d719688
|
||
|
Author: Florian Westphal <fw@strlen.de>
|
||
|
Date: Wed Dec 11 14:31:44 2019 +0100
|
||
|
|
||
|
parser: add a helper for concat expression handling
|
||
|
|
||
|
Cull the repeated copy&paste snippets and add/use a helper for this.
|
||
|
|
||
|
Signed-off-by: Florian Westphal <fw@strlen.de>
|
||
|
---
|
||
|
src/parser_bison.y | 99 ++++++++++++++++++++++++------------------------------
|
||
|
1 file changed, 43 insertions(+), 56 deletions(-)
|
||
|
|
||
|
diff --git a/src/parser_bison.y b/src/parser_bison.y
|
||
|
index 707f467..0fd9b94 100644
|
||
|
--- a/src/parser_bison.y
|
||
|
+++ b/src/parser_bison.y
|
||
|
@@ -102,6 +102,25 @@ static void location_update(struct location *loc, struct location *rhs, int n)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+static struct expr *handle_concat_expr(const struct location *loc,
|
||
|
+ struct expr *expr,
|
||
|
+ struct expr *expr_l, struct expr *expr_r,
|
||
|
+ struct location loc_rhs[3])
|
||
|
+{
|
||
|
+ if (expr->etype != EXPR_CONCAT) {
|
||
|
+ expr = concat_expr_alloc(loc);
|
||
|
+ compound_expr_add(expr, expr_l);
|
||
|
+ } else {
|
||
|
+ location_update(&expr_r->location, loc_rhs, 2);
|
||
|
+
|
||
|
+ expr = expr_l;
|
||
|
+ expr->location = *loc;
|
||
|
+ }
|
||
|
+
|
||
|
+ compound_expr_add(expr, expr_r);
|
||
|
+ return expr;
|
||
|
+}
|
||
|
+
|
||
|
#define YYLLOC_DEFAULT(Current, Rhs, N) location_update(&Current, Rhs, N)
|
||
|
|
||
|
#define symbol_value(loc, str) \
|
||
|
@@ -1878,20 +1897,12 @@ data_type_atom_expr : type_identifier
|
||
|
data_type_expr : data_type_atom_expr
|
||
|
| data_type_expr DOT data_type_atom_expr
|
||
|
{
|
||
|
- if ($1->etype != EXPR_CONCAT) {
|
||
|
- $$ = concat_expr_alloc(&@$);
|
||
|
- compound_expr_add($$, $1);
|
||
|
- } else {
|
||
|
- struct location rhs[] = {
|
||
|
- [1] = @2,
|
||
|
- [2] = @3,
|
||
|
- };
|
||
|
- location_update(&$3->location, rhs, 2);
|
||
|
-
|
||
|
- $$ = $1;
|
||
|
- $$->location = @$;
|
||
|
- }
|
||
|
- compound_expr_add($$, $3);
|
||
|
+ struct location rhs[] = {
|
||
|
+ [1] = @2,
|
||
|
+ [2] = @3,
|
||
|
+ };
|
||
|
+
|
||
|
+ $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
|
||
|
}
|
||
|
;
|
||
|
|
||
|
@@ -2992,20 +3003,12 @@ basic_stmt_expr : inclusive_or_stmt_expr
|
||
|
concat_stmt_expr : basic_stmt_expr
|
||
|
| concat_stmt_expr DOT primary_stmt_expr
|
||
|
{
|
||
|
- if ($$->etype != EXPR_CONCAT) {
|
||
|
- $$ = concat_expr_alloc(&@$);
|
||
|
- compound_expr_add($$, $1);
|
||
|
- } else {
|
||
|
- struct location rhs[] = {
|
||
|
- [1] = @2,
|
||
|
- [2] = @3,
|
||
|
- };
|
||
|
- location_update(&$3->location, rhs, 2);
|
||
|
-
|
||
|
- $$ = $1;
|
||
|
- $$->location = @$;
|
||
|
- }
|
||
|
- compound_expr_add($$, $3);
|
||
|
+ struct location rhs[] = {
|
||
|
+ [1] = @2,
|
||
|
+ [2] = @3,
|
||
|
+ };
|
||
|
+
|
||
|
+ $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
|
||
|
}
|
||
|
;
|
||
|
|
||
|
@@ -3525,20 +3528,12 @@ basic_expr : inclusive_or_expr
|
||
|
concat_expr : basic_expr
|
||
|
| concat_expr DOT basic_expr
|
||
|
{
|
||
|
- if ($$->etype != EXPR_CONCAT) {
|
||
|
- $$ = concat_expr_alloc(&@$);
|
||
|
- compound_expr_add($$, $1);
|
||
|
- } else {
|
||
|
- struct location rhs[] = {
|
||
|
- [1] = @2,
|
||
|
- [2] = @3,
|
||
|
- };
|
||
|
- location_update(&$3->location, rhs, 2);
|
||
|
-
|
||
|
- $$ = $1;
|
||
|
- $$->location = @$;
|
||
|
- }
|
||
|
- compound_expr_add($$, $3);
|
||
|
+ struct location rhs[] = {
|
||
|
+ [1] = @2,
|
||
|
+ [2] = @3,
|
||
|
+ };
|
||
|
+
|
||
|
+ $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
|
||
|
}
|
||
|
;
|
||
|
|
||
|
@@ -3946,20 +3941,12 @@ basic_rhs_expr : inclusive_or_rhs_expr
|
||
|
concat_rhs_expr : basic_rhs_expr
|
||
|
| concat_rhs_expr DOT basic_rhs_expr
|
||
|
{
|
||
|
- if ($$->etype != EXPR_CONCAT) {
|
||
|
- $$ = concat_expr_alloc(&@$);
|
||
|
- compound_expr_add($$, $1);
|
||
|
- } else {
|
||
|
- struct location rhs[] = {
|
||
|
- [1] = @2,
|
||
|
- [2] = @3,
|
||
|
- };
|
||
|
- location_update(&$3->location, rhs, 2);
|
||
|
-
|
||
|
- $$ = $1;
|
||
|
- $$->location = @$;
|
||
|
- }
|
||
|
- compound_expr_add($$, $3);
|
||
|
+ struct location rhs[] = {
|
||
|
+ [1] = @2,
|
||
|
+ [2] = @3,
|
||
|
+ };
|
||
|
+
|
||
|
+ $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
|
||
|
}
|
||
|
;
|
||
|
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|