ECL中TRANSFORM调用distcomp报expected:=语法错误咨询
HPCC ECL TRANSFORM字段赋值
syntax error near ')':expected:= 问题解决 报错含义
这个错误是ECL编译器抛出的语法解析错误,代表编译器扫描到右括号)附近的代码时,没有识别到合法的语法结构,按照语法规则此处应该出现赋值操作符:=。
触发原因
一共3个问题,其中前两个直接触发语法报错:
- 自定义函数
distcomp定义时缺失返回值类型声明
ECL语法强制要求FUNCTION结构的自定义函数必须在参数列表后显式声明返回值类型,原代码的函数定义头没有写返回类型,编译器无法将其识别为合法可调用的函数,解析到函数调用位置的闭合右括号时无法匹配函数调用语法,直接抛出错误。 - TRANSFORM内
SELF := LEFT语句末尾缺失分号
ECL以分号作为单条语句的结束标识,原代码中这行末尾只有注释没有分号,会导致编译器解析语句边界错乱,进一步加剧报错位置偏移。 - TRANSFORM内赋值顺序逻辑错误(语法不报错但结果不符合预期)
原代码先给SELF.Qualify、SELF.RecCount赋值,最后执行SELF := LEFT批量导入左记录字段,会导致之前赋值的两个字段被左记录集中的同名字段覆盖,自定义计算逻辑不生效。
修复方法
按照以下三点修改代码即可:
- 给
distcomp函数补充返回值类型声明,该函数返回0/1的距离匹配标记值,返回类型设为INTEGER即可 - 调整TRANSFORM内的赋值顺序:先执行
SELF := LEFT批量导入左记录所有字段,再对需要覆盖、新增的字段单独赋值,同时给所有语句补全结束分号 - 函数参数列表内的跨行为ECL语法允许的合法写法,不需要额外调整
修复后的可运行代码如下:
// 补充返回值类型INTEGER distcomp (REAL4 lat1, REAL4 lon1,REAL4 lat2, REAL4 lon2, REAL4 dist) : INTEGER := FUNCTION REAL4 lo1 := lon1/57.29577951; REAL4 lo2 := lon2/57.29577951; REAL4 la1 := lat1/57.29577951; REAL4 la2 := lat2/57.29577951; REAL4 dlon := lo2 - lo1; REAL4 dlat := la2 - la1; REAL4 a := sin(dlat / 2)*sin(dlat / 2) + cos(la1) * cos(la2) * sin(dlon/2)*sin(dlon/ 2); REAL4 c := 2 * asin(sqrt(a)); REAL4 di := 6371 * c; RETURN IF( di <= dist, 1,0); END; ProjResult := PROJECT(MENTORS, TRANSFORM(New_MentorsRaw_Rec, SELF := LEFT; // 先批量赋值左记录所有字段,补全分号 // 再单独赋值需要自定义计算/覆写的字段 SELF.Qualify := distcomp(LEFT.Latitude,LEFT.Longitude, Latitude, Longitude, Distance); SELF.RecCount := 0; ));
内容的提问来源于stack exchange,提问作者Sai Lahari
相关产品推荐
相关产品推荐

