From 1231f59b1a84fa94e2b0ecfeafe3936a280845d7 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Sun, 15 Mar 2020 14:16:44 +0000 Subject: [PATCH] DataFilter Grammar for [index] .. expressions like a+b*c[n] were being parsed as equivalent to (a+b*c)[n] instead of a+b+(c[n]). .. to resolve this symbol[index] is declared first in the grammar and whilst it will introduce reduce/reduce warnings that is actually what we want (we declare it early to override the definition from expr below). .. keener yacc wizards might have a more elegant solution for this one.... --- src/Core/DataFilter.cpp | 1 + src/Core/DataFilter.y | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Core/DataFilter.cpp b/src/Core/DataFilter.cpp index 0e1a81da7..7f58fa6df 100644 --- a/src/Core/DataFilter.cpp +++ b/src/Core/DataFilter.cpp @@ -2705,6 +2705,7 @@ Result Leaf::eval(DataFilterRuntime *df, Leaf *leaf, float x, long it, RideItem returning.vector[1]=calc.b; returning.vector[2]=calc.r2; returning.vector[3]=calc.see; + returning.number = calc.m + calc.b + calc.r2 + calc.see; // sum return returning; } diff --git a/src/Core/DataFilter.y b/src/Core/DataFilter.y index 3767e7347..a7206003a 100644 --- a/src/Core/DataFilter.y +++ b/src/Core/DataFilter.y @@ -297,7 +297,17 @@ lexpr: } ; -array: expr '[' expr ']' { +array: + symbol '[' expr ']' { // reduce/reduce conflict, but added here so gets resolved + // first (order appeared in this file. + // e.g. a+b[1] is resolved as a+(b[1]) rather than (a+b)[1] + $$ = new Leaf(@1.first_column, @4.last_column); + $$->type = Leaf::Index; + $$->lvalue.l = $1; + $$->fparms << $3; + $$->op = 0; + } + | expr '[' expr ']' { $$ = new Leaf(@1.first_column, @4.last_column); $$->type = Leaf::Index; $$->lvalue.l = $1;