Ver código fonte

HPCC-10456 Codegen support for streamed datasets from embedded languages

Allow the attributes on an embed to be non-constant

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 11 anos atrás
pai
commit
82d56bc023
2 arquivos alterados com 15 adições e 9 exclusões
  1. 10 6
      ecl/hql/hqlgram.y
  2. 5 3
      ecl/hql/hqlgram2.cpp

+ 10 - 6
ecl/hql/hqlgram.y

@@ -562,6 +562,8 @@ static void eclsyntaxerror(HqlGram * parser, const char * s, short yystate, int
 %left OR
 %left AND
 
+%left reduceAttrib
+
 %left ORDER UNICODEORDER
 %left SHIFTL SHIFTR
 %left '+' '-'
@@ -576,6 +578,7 @@ static void eclsyntaxerror(HqlGram * parser, const char * s, short yystate, int
 %left '['
 %left HIGHEST_PRECEDENCE
 
+
 %%
 
 //================================== begin of syntax section ==========================
@@ -3806,19 +3809,20 @@ attrib
                             parser->reportWarning(WRN_OBSOLETED_SYNTAX,$1.pos,"Syntax obsoleted; use alternative: id = '<string constant>'");
                             $$.setExpr(createAttribute($1.getId()->lower(), createConstant(*$3.getId())));
                         }
-    | knownOrUnknownId EQ const
+    | knownOrUnknownId EQ expr %prec reduceAttrib
                         {
-                            $$.setExpr(createAttribute($1.getId()->lower(), $3.getExpr()), $1);
+                            //NOTE %prec is there to prevent a s/r error from the "SERVICE : attrib" production
+                            $$.setExpr(createExprAttribute($1.getId()->lower(), $3.getExpr()), $1);
                         }
     | knownOrUnknownId                  
                         {   $$.setExpr(createAttribute($1.getId()->lower()));  }
-    | knownOrUnknownId '(' const ')'
+    | knownOrUnknownId '(' expr ')'
                         {
-                            $$.setExpr(createAttribute($1.getId()->lower(), $3.getExpr()), $1);
+                            $$.setExpr(createExprAttribute($1.getId()->lower(), $3.getExpr()), $1);
                         }
-    | knownOrUnknownId '(' const ',' const ')'
+    | knownOrUnknownId '(' expr ',' expr ')'
                         {
-                            $$.setExpr(createAttribute($1.getId()->lower(), $3.getExpr(), $5.getExpr()), $1);
+                            $$.setExpr(createExprAttribute($1.getId()->lower(), $3.getExpr(), $5.getExpr()), $1);
                         }
     ;
 

+ 5 - 3
ecl/hql/hqlgram2.cpp

@@ -3519,6 +3519,8 @@ IHqlExpression* HqlGram::checkServiceDef(IHqlScope* serviceScope,IIdAtom * name,
         {
             IHqlExpression* attr = &attrArray.item(i);
             IAtom * name = attr->queryName();
+            if (attr->queryChild(0) && !attr->queryChild(0)->queryValue())
+                reportError(ERR_EXPECTED_CONST, errpos.pos, "Expected a constant argument for service attribute: '%s';", name->str());
 
             // check duplication
             unsigned j;
@@ -3542,7 +3544,7 @@ IHqlExpression* HqlGram::checkServiceDef(IHqlScope* serviceScope,IIdAtom * name,
                     invalid = true;
                 else
                 {
-                    attr->queryChild(0)->queryValue()->getStringValue(buf);
+                    getStringValue(buf, attr->queryChild(0));
                     if (!isCIdentifier(buf.str()))
                         invalid = true;
                 }
@@ -3570,7 +3572,7 @@ IHqlExpression* HqlGram::checkServiceDef(IHqlScope* serviceScope,IIdAtom * name,
                 else
                 {
                     StringBuffer buf;
-                    attr->queryChild(0)->queryValue()->getStringValue(buf);
+                    getStringValue(buf, attr->queryChild(0));
                     
                     // can we do better?
                     if (*buf.str() == 0)
@@ -3587,7 +3589,7 @@ IHqlExpression* HqlGram::checkServiceDef(IHqlScope* serviceScope,IIdAtom * name,
                 if (attr->numChildren()!=0)
                 {
                     StringBuffer buf;
-                    attr->queryChild(0)->queryValue()->getStringValue(buf);
+                    getStringValue(buf, attr->queryChild(0));
                     
                     // can we do better?
                     if (*buf.str() == 0)