hqlgram.hpp 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef HQLGRAM_HPP_INCL
  14. #define HQLGRAM_HPP_INCL
  15. #include "platform.h"
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include "jstream.hpp"
  20. #include "jmisc.hpp"
  21. #include "hqlexpr.hpp"
  22. #include "jprop.hpp"
  23. #include "jexcept.hpp"
  24. #include "hqlpmap.hpp"
  25. #include "hqlutil.hpp"
  26. #include "hqlxmldb.hpp"
  27. #define DEFAULT_MAX_ERRORS 100
  28. #define EXPORT_FLAG 1
  29. #define VIRTUAL_FLAG 2
  30. #define SHARED_FLAG 4
  31. #define REC_FLD_ERR_STR "Need to supply a value for field '%s'"
  32. #define ERR_WRONGSCOPING_ERR_STR "Value for field '%s' cannot be computed in this scope"
  33. struct DefineIdSt
  34. {
  35. private:
  36. ITypeInfo* type;
  37. IPropertyTree * doc;
  38. public:
  39. IIdAtom * id;
  40. int scope;
  41. DefineIdSt() { type = NULL; id = NULL; scope = 0; doc = NULL; }
  42. ~DefineIdSt() { ::Release(type); ::Release(doc); }
  43. void setDoc(IPropertyTree * _doc) { doc = _doc; }
  44. void setType(ITypeInfo* t) { type = t; }
  45. ITypeInfo* queryType() const { return type; }
  46. IPropertyTree* queryDoc() const { return doc; }
  47. ITypeInfo* getType() { ITypeInfo* rt = type; type = NULL; return rt; }
  48. };
  49. struct attribute
  50. {
  51. private:
  52. union
  53. {
  54. IHqlExpression *expr;
  55. ITypeInfo *type;
  56. IIdAtom * name;
  57. IIdAtom * cname;
  58. char *str_val;
  59. __int64 int_val;
  60. DefineIdSt *defineid;
  61. IFileContents *contents;
  62. };
  63. enum { t_none,t_expr,t_scope,t_atom,t_catom,t_string,t_int,t_type,t_defineid,t_contents } atr_type;
  64. public:
  65. ECLlocation pos;
  66. public:
  67. void annotateExprWithLocation();
  68. inline void clearPosition()
  69. {
  70. pos.clear();
  71. }
  72. inline void setPosition(const attribute &from)
  73. {
  74. setPosition(from.pos);
  75. }
  76. inline void setPosition(const ECLlocation &from)
  77. {
  78. setPosition(from.lineno, from.column, from.position, from.sourcePath);
  79. }
  80. inline void querySetPosition(const attribute &from)
  81. {
  82. if (pos.column == 0 && pos.lineno == 0 && pos.position == 0)
  83. setPosition(from);
  84. }
  85. void setPosition(int _line, int _column, int _position, ISourcePath * _sourcePath);
  86. inline IHqlExpression *getExpr()
  87. {
  88. assertex(atr_type==t_expr);
  89. atr_type = t_none;
  90. return expr;
  91. }
  92. inline IHqlExpression *queryExpr() const
  93. {
  94. assertex(atr_type==t_expr);
  95. return expr;
  96. }
  97. inline ITypeInfo *queryExprType() const
  98. {
  99. assertex(atr_type==t_expr);
  100. return expr->queryType();
  101. }
  102. inline DefineIdSt* queryDefineId() const
  103. {
  104. assertex(atr_type==t_defineid);
  105. return defineid;
  106. }
  107. /* getters */
  108. inline IFileContents * getContents()
  109. {
  110. assertex(atr_type==t_contents);
  111. atr_type = t_none;
  112. return contents;
  113. }
  114. inline IIdAtom * getId()
  115. {
  116. assertex(atr_type==t_catom);
  117. atr_type = t_none;
  118. return cname;
  119. }
  120. inline char *getString()
  121. {
  122. assertex(atr_type==t_string);
  123. atr_type = t_none;
  124. return str_val;
  125. }
  126. inline __int64 getInt()
  127. {
  128. assertex(atr_type==t_int);
  129. atr_type = t_none;
  130. return int_val;
  131. }
  132. inline ITypeInfo *getType()
  133. {
  134. assertex(atr_type==t_type);
  135. atr_type = t_none;
  136. return type;
  137. }
  138. inline DefineIdSt* getDefineId()
  139. {
  140. assertex(atr_type==t_defineid);
  141. atr_type = t_none;
  142. return defineid;
  143. }
  144. inline node_operator getOperator() const
  145. {
  146. return queryExpr()->getOperator();
  147. }
  148. inline bool isDataset() const
  149. {
  150. return queryExpr()->isDataset();
  151. }
  152. inline bool isDatarow() const
  153. {
  154. return queryExpr()->isDatarow();
  155. }
  156. inline bool isDictionary() const
  157. {
  158. return queryExpr()->isDictionary();
  159. }
  160. /* setters */
  161. inline void inherit(attribute & other)
  162. {
  163. *this = other;
  164. other.clear();
  165. }
  166. bool isZero() const;
  167. inline void setNullExpr()
  168. {
  169. atr_type=t_expr;
  170. expr = NULL;
  171. clearPosition();
  172. }
  173. inline void setExpr(IHqlExpression *v)
  174. {
  175. atr_type=t_expr;
  176. expr = v;
  177. }
  178. inline void setType(ITypeInfo *t)
  179. {
  180. atr_type=t_type;
  181. type = t;
  182. }
  183. inline void setContents(IFileContents * _contents)
  184. {
  185. atr_type = t_contents;
  186. contents = _contents;
  187. }
  188. inline void setId(IIdAtom * v)
  189. {
  190. atr_type=t_catom;
  191. cname = v;
  192. }
  193. inline void setString(char *v)
  194. {
  195. atr_type=t_string;
  196. str_val = v;
  197. }
  198. inline void setInt(__int64 v)
  199. {
  200. atr_type=t_int;
  201. int_val = v;
  202. }
  203. inline void setDefineId(DefineIdSt* defid)
  204. {
  205. atr_type = t_defineid;
  206. defineid = defid;
  207. }
  208. inline void unwindCommaList(HqlExprArray & tgt)
  209. {
  210. IHqlExpression * e = getExpr();
  211. if (e)
  212. flattenListOwn(tgt, e);
  213. }
  214. inline void setExpr(IHqlExpression *v, const attribute &from)
  215. {
  216. setExpr(v);
  217. setPosition(from);
  218. }
  219. inline void setType(ITypeInfo *t, const attribute &from)
  220. {
  221. setType(t);
  222. setPosition(from);
  223. }
  224. attribute & release()
  225. {
  226. switch(atr_type)
  227. {
  228. case t_expr:
  229. ::Release(expr);
  230. break;
  231. case t_string:
  232. free(str_val);
  233. break;
  234. case t_type:
  235. ::Release(type);
  236. break;
  237. case t_none:
  238. break;
  239. case t_int:
  240. break;
  241. case t_atom:
  242. case t_catom:
  243. break;
  244. case t_contents:
  245. ::Release(contents);
  246. break;
  247. case t_defineid:
  248. delete defineid;
  249. break;
  250. default:
  251. assertex(false);
  252. }
  253. //Don't need to release pos because it will be cleaned up properly anyway since a real member.
  254. atr_type = t_none;
  255. return *this;
  256. }
  257. inline void clear()
  258. {
  259. atr_type = t_none;
  260. }
  261. inline void clear(const attribute &from)
  262. {
  263. clear();
  264. setPosition(from);
  265. }
  266. inline attribute()
  267. {
  268. atr_type = t_none;
  269. }
  270. };
  271. #define YYSTYPE attribute
  272. class HqlLex;
  273. struct ActiveScopeInfo : public CInterface
  274. {
  275. public:
  276. ActiveScopeInfo() { firstSideEffect = 0; isParametered = false; }
  277. void newPrivateScope();
  278. void resetParameters() { isParametered = false; activeParameters.kill(); activeDefaults.kill(); }
  279. IHqlExpression * createDefaults();
  280. IHqlExpression * createFormals(bool oldSetFormat);
  281. IHqlExpression * queryParameter(IIdAtom * name);
  282. public:
  283. Owned<IHqlScope> localScope;
  284. Owned<IHqlScope> privateScope;
  285. unsigned firstSideEffect;
  286. //The following are used for the symbol currently being defined.... Here so correctly scoped.
  287. bool isParametered;
  288. HqlExprArray activeParameters;
  289. HqlExprArray activeDefaults;
  290. Owned<IHqlScope> templateAttrContext;
  291. };
  292. class TransformSaveInfo : public CInterface
  293. {
  294. public:
  295. Owned<IHqlScope> transformScope;
  296. Owned<IHqlExpression> curTransform;
  297. };
  298. class FunctionCallInfo : public CInterface
  299. {
  300. public:
  301. FunctionCallInfo(IHqlExpression * _funcdef);
  302. void fillWithOmitted(unsigned next);
  303. void flushPendingComponents();
  304. IHqlExpression * getFinalActuals();
  305. public:
  306. LinkedHqlExpr funcdef;
  307. HqlExprArray actuals;
  308. HqlExprArray pendingComponents;
  309. unsigned numFormals;
  310. bool hasActiveTopDataset;
  311. bool hadNamed;
  312. };
  313. class HqlExprArrayItem : public CInterface
  314. {
  315. public:
  316. HqlExprArray array;
  317. };
  318. typedef CIArrayOf<HqlExprArrayItem> HqlExprArrayArray;
  319. class HqlGramCtx : public CInterface
  320. {
  321. public:
  322. HqlGramCtx(HqlLookupContext & _lookupCtx) : lookupCtx(_lookupCtx) {}
  323. bool hasAnyActiveParameters();
  324. public:
  325. CIArrayOf<ActiveScopeInfo> defineScopes;
  326. HqlScopeArray defaultScopes;
  327. Owned<IHqlScope> globalScope;
  328. Linked<ISourcePath> sourcePath;
  329. HqlLookupContext lookupCtx;
  330. HqlExprArray imports;
  331. };
  332. typedef const IAtom * const * AtomList;
  333. struct TokenMap;
  334. class HqlGram;
  335. class LeftRightScope : public CInterface
  336. {
  337. public:
  338. OwnedHqlExpr left;
  339. OwnedHqlExpr right;
  340. OwnedHqlExpr selSeq;
  341. OwnedHqlExpr rowsScope;
  342. OwnedHqlExpr rowsId;
  343. };
  344. extern int eclyyparse(HqlGram * parser);
  345. class HqlGram : public CInterface, implements IErrorReceiver
  346. {
  347. friend class HqlLex;
  348. friend int eclyyparse(HqlGram * parser);
  349. public:
  350. HqlGram(HqlGramCtx &parent, IHqlScope * containerScope, IFileContents * text, IXmlScope *xmlScope, bool _parseConstantText);
  351. HqlGram(IHqlScope * _globalScope, IHqlScope * _containerScope, IFileContents * text, HqlLookupContext & _ctx, IXmlScope *xmlScope, bool _hasFieldMap, bool loadImplicit);
  352. virtual ~HqlGram();
  353. IMPLEMENT_IINTERFACE
  354. IHqlExpression *yyParse(bool parsingTemplateAttribute, bool catchAbort);
  355. void setQuery(bool _value) { isQuery = _value; }
  356. void yySetLexer(HqlLex *LexObject);
  357. HqlLex* getLexer() { return lexObject; }
  358. void saveContext(HqlGramCtx & ctx, bool cloneScopes);
  359. IHqlScope * queryGlobalScope();
  360. bool canFollowCurrentState(int tok, const short * yyps);
  361. void syntaxError(const char *s, int token, int *expected);
  362. int mapToken(int lexToken) const;
  363. IHqlExpression *lookupSymbol(IIdAtom * name, const attribute& errpos);
  364. IHqlExpression *lookupSymbol(IHqlScope * scope, IIdAtom * name);
  365. void enableAttributes(int activityToken);
  366. IHqlExpression * recordLookupInTemplateContext(IIdAtom * name, IHqlExpression * expr, IHqlScope * templateScope);
  367. void processImportAll(attribute & modulesAttr);
  368. void processImport(attribute & modulesAttr, IIdAtom * as);
  369. void processImport(attribute & membersAttr, attribute & modulesAttr, IIdAtom * as);
  370. void applyDefaultPromotions(attribute &a1, bool extendPrecision);
  371. unsigned checkCompatible(ITypeInfo * a1, ITypeInfo * t2, const attribute &ea, bool complain=true);
  372. void checkMaxCompatible(IHqlExpression * sortOrder, IHqlExpression * values, attribute & errpos);
  373. void checkCompatibleTransforms(HqlExprArray & values, IHqlExpression * record, attribute & errpos);
  374. void checkBoolean(attribute &atr);
  375. void checkBooleanOrNumeric(attribute &atr);
  376. void checkDatarow(attribute &atr);
  377. void checkDataset(attribute &atr);
  378. void checkDictionary(attribute &atr);
  379. void checkFieldnameValid(const attribute &errpos, IIdAtom * name);
  380. void checkList(attribute &atr);
  381. void checkScalar(attribute &atr);
  382. void checkUseLocation(const attribute & errpos);
  383. void checkCosort(IHqlExpression * sortlist, IHqlExpression * partition, const attribute & ea);
  384. ITypeInfo * checkPromoteNumeric(attribute &a1, bool extendPrecision);
  385. ITypeInfo * checkPromoteType(attribute &a1, attribute &a2);
  386. ITypeInfo * checkPromoteIfType(attribute &a1, attribute &a2);
  387. void checkSameType(attribute &a1, attribute &a2);
  388. void checkType(attribute &a1, ITypeInfo *t2);
  389. ITypeInfo *checkType(attribute &e1, attribute &e2);
  390. bool checkAlienTypeDef(IHqlScope* scope, const attribute& errpos);
  391. IHqlExpression* checkServiceDef(IHqlScope* serviceScope,IIdAtom * name, IHqlExpression* attrs, const attribute& errpos);
  392. void checkConstant(attribute & attr);
  393. IHqlExpression * checkConstant(const attribute & errpos, IHqlExpression * expr);
  394. void checkConstantEvent(attribute & attr);
  395. IHqlExpression * checkConcreteModule(const attribute & errpos, IHqlExpression * expr);
  396. void checkFoldConstant(attribute & attr);
  397. void checkInteger(attribute &e1);
  398. void checkPositive(attribute &e1);
  399. bool checkString(attribute &e1);
  400. bool checkStringOrUnicode(attribute &e1);
  401. void checkIntegerOrString(attribute & e1);
  402. void checkNumeric(attribute &e1);
  403. ITypeInfo *checkNumericGetType(attribute &e1);
  404. void checkLibraryParametersMatch(const attribute & errpos, bool isParametered, const HqlExprArray & activeParameters, IHqlExpression * definition);
  405. void checkReal(attribute &e1);
  406. ITypeInfo *checkStringIndex(attribute & strAttr, attribute & idxAttr);
  407. void checkWorkflowScheduling(IHqlExpression * expr, attribute& errpos);
  408. void checkWorkflowMultiples(IHqlExpression * currentWorkflow, IHqlExpression * newWorkflow, attribute& errpos);
  409. void checkJoinFlags(const attribute & err, IHqlExpression * joinExpr);
  410. void checkLoopFlags(const attribute & err, IHqlExpression * loopExpr);
  411. IHqlExpression * checkIndexRecord(IHqlExpression * record, const attribute & errpos, OwnedHqlExpr & indexAttrs);
  412. void checkIndexFieldType(IHqlExpression * cur, bool isPayload, bool insideNestedRecord, const attribute & errpos);
  413. void checkIndexRecordType(IHqlExpression * record, unsigned numPayloadFields, bool insideNestedRecord, const attribute & errpos);
  414. void checkIndexRecordTypes(IHqlExpression * index, const attribute & errpos);
  415. void reportIndexFieldType(IHqlExpression * expr, bool isPayload, const attribute & errpos);
  416. void reportUnsupportedFieldType(ITypeInfo * type, const attribute & errpos);
  417. void checkCaseForDuplicates(HqlExprArray & exprs, attribute &err);
  418. void checkOnFailRecord(IHqlExpression * expr, attribute & errpos);
  419. void checkAggregateRecords(IHqlExpression * expr, IHqlExpression * record, attribute & errpos);
  420. void checkExportedModule(const attribute & errpos, IHqlExpression * scopeExpr);
  421. bool checkCompatibleSymbol(const attribute & errpos, IHqlExpression * prevValue, IHqlExpression * newValue);
  422. IHqlExpression * createAveList(const attribute & errpos, IHqlExpression * list);
  423. IHqlExpression * createIff(attribute & condAttr, attribute & leftAttr, attribute & rightAttr);
  424. IHqlExpression * createListFromExpressionList(attribute & attr);
  425. IHqlExpression * createListIndex(attribute & list, attribute & which, IHqlExpression * attr);
  426. IHqlExpression * createNullPattern();
  427. IHqlExpression * createLibraryInstance(const attribute & errpos, IHqlExpression * name, IHqlExpression * func, HqlExprArray & actuals);
  428. IHqlExpression * createLocationAttr(const attribute & errpos);
  429. IHqlExpression * createSortExpr(node_operator op, attribute & dsAttr, const attribute & orderAttr, HqlExprArray & args);
  430. IHqlExpression * createIffDataset(IHqlExpression * record, IHqlExpression * value);
  431. bool isSingleValuedExpressionList(const attribute & attr);
  432. bool convertAllToAttribute(attribute &atr);
  433. IHqlExpression * convertToOutOfLineFunction(const ECLlocation & errpos, IHqlExpression * expr);
  434. void ensureBoolean(attribute &a);
  435. void ensureDataset(attribute & attr);
  436. void ensureString(attribute &a);
  437. void ensureTypeCanBeIndexed(attribute &a);
  438. void ensureUnicode(attribute &a);
  439. void ensureData(attribute &a);
  440. void ensureTransformTypeMatch(attribute & tattr, IHqlExpression * ds);
  441. bool checkTransformTypeMatch(const attribute & errpos, IHqlExpression * ds, IHqlExpression * transform);
  442. void ensureDatasetTypeMatch(attribute & tattr, IHqlExpression * ds);
  443. IAtom * ensureCommonLocale(attribute &a, attribute &b);
  444. void ensureUnicodeLocale(attribute & a, char const * locale);
  445. void ensureType(attribute &atr, ITypeInfo * type);
  446. void inheritRecordMaxLength(IHqlExpression * dataset, SharedHqlExpr & record);
  447. void normalizeExpression(attribute & expr);
  448. void normalizeExpression(attribute & expr, type_t expectedType, bool isConstant);
  449. IHqlExpression * createListFromExprArray(const attribute & errpos, HqlExprArray & args);
  450. IHqlExpression * normalizeExprList(const attribute & errpos, const HqlExprArray & values);
  451. bool isDiskFile(IHqlExpression * expr);
  452. bool isFilteredDiskFile(IHqlExpression * expr);
  453. bool isSaved(IHqlExpression * failure);
  454. bool okToAddSideEffects(IHqlExpression * expr);
  455. void processUpdateAttr(attribute & attr);
  456. IHqlExpression * createArithmeticOp(node_operator op, attribute &a1, attribute &a2);
  457. ITypeInfo *promoteToSameType(attribute &a1, attribute &a2);
  458. ITypeInfo *promoteToSameType(HqlExprArray & exprs, const attribute &ea, ITypeInfo * otherType, bool allowVariableLength);
  459. void promoteToSameCompareType(attribute &a1, attribute &a2, node_operator op);
  460. ITypeInfo *promoteToSameCompareType(attribute &a1, attribute &a2);
  461. void promoteToSameCompareType(attribute &a1, attribute &a2, attribute &a3);
  462. void promoteToSameListType(attribute & leftAttr, attribute & rightAttr);
  463. ITypeInfo *promoteCaseToSameType(attribute &eTest, HqlExprArray & exprs, attribute &eElse);
  464. ITypeInfo *promoteMapToSameType(HqlExprArray & exprs, attribute &eElse);
  465. ITypeInfo *promoteSetToSameType(HqlExprArray & exprs, attribute &errpos);
  466. ITypeInfo * queryElementType(const attribute & errpos, IHqlExpression * list);
  467. IHqlExpression *createINExpression(node_operator op, IHqlExpression *expr, IHqlExpression *set, attribute &errpos);
  468. IHqlExpression * createLoopCondition(IHqlExpression * left, IHqlExpression * arg1, IHqlExpression * arg2, IHqlExpression * seq, IHqlExpression * rowsid);
  469. void setTemplateAttribute();
  470. void warnIfFoldsToConstant(IHqlExpression * expr, const attribute & errpos);
  471. void warnIfRecordPacked(IHqlExpression * expr, const attribute & errpos);
  472. void warnIfRecordPacked(const attribute & errpos) { warnIfRecordPacked(errpos.queryExpr(), errpos); }
  473. void validateParseTerminate(IHqlExpression * e, attribute & errpos);
  474. void validateXPath(attribute & a);
  475. void beginFunctionCall(attribute & function);
  476. IHqlExpression * endFunctionCall();
  477. void addActual(const attribute & errpos, IHqlExpression * ownedExpr);
  478. void addNamedActual(const attribute & errpos, IIdAtom * name, IHqlExpression * ownedExpr);
  479. bool processParameter(FunctionCallInfo & call, IIdAtom * name, IHqlExpression * actualValue, const attribute& errpos);
  480. void checkActualTopScope(FunctionCallInfo & call, IHqlExpression * formal, IHqlExpression * actual);
  481. void leaveActualTopScope(FunctionCallInfo & call);
  482. bool doCheckValidFieldValue(const attribute &errpos, IHqlExpression *value, IHqlExpression * field);
  483. bool checkValidFieldValue(const attribute &errpos, IHqlExpression *value, IHqlExpression * field);
  484. IHqlExpression * createCheckMatchAttr(attribute & attr, type_t tc);
  485. bool extractConstantString(StringBuffer & text, attribute & attr);
  486. //Various grammar rule productions.
  487. void beginAlienType(const attribute & errpos);
  488. void beginDefineId(IIdAtom * name, ITypeInfo * type);
  489. IHqlExpression * processAlienType(const attribute & errpos);
  490. IHqlExpression * processIndexBuild(attribute & indexAttr, attribute * recordAttr, attribute * payloadAttr, attribute & filenameAttr, attribute & flagsAttr);
  491. IHqlExpression * processCompoundFunction(attribute & result, bool outOfLine);
  492. IHqlExpression * processEmbedBody(const attribute & errpos, IHqlExpression * embedText, IHqlExpression * language, IHqlExpression *attribs);
  493. void processEnum(attribute & idAttr, IHqlExpression * value);
  494. void processError(bool full);
  495. void processLoadXML(attribute & a1, attribute * a2);
  496. IHqlExpression * processModuleDefinition(const attribute & errpos);
  497. IHqlExpression * processRowset(attribute & selectorAttr);
  498. void processServiceFunction(const attribute & errpos, IIdAtom * name, IHqlExpression * thisAttrs, ITypeInfo * type);
  499. void processStartTransform(const attribute & errpos);
  500. IHqlExpression * processUserAggregate(const attribute & mainPos, attribute & dsAttr, attribute & recordAttr, attribute & transformAttr, attribute * mergeAttr,
  501. attribute *itemsAttr, attribute &rowsAttr, attribute &seqAttr);
  502. void enterEnum(const attribute & errpos, ITypeInfo * type);
  503. void setEnumType(const attribute & errpos, ITypeInfo * type);
  504. void enterService(attribute & attrs);
  505. IHqlExpression * leaveEnum(const attribute & errpos);
  506. IHqlExpression * leaveService(const attribute & errpos);
  507. IHqlExpression * nextEnumValue();
  508. // Error handling
  509. void doReportWarning(WarnErrorCategory category, int warnNo, const char *msg, const char *filename, int lineno, int column, int pos);
  510. void reportError(int errNo, const attribute& a, const char* format, ...) __attribute__((format(printf, 4, 5)));
  511. void reportError(int errNo, const ECLlocation & pos, const char* format, ...) __attribute__((format(printf, 4, 5)));
  512. void reportMacroExpansionPosition(IECLError * warning, HqlLex * lexer);
  513. void reportErrorUnexpectedX(const attribute & errpos, IAtom * unexpected);
  514. // Don't use overloading: va_list is the same as char*!!
  515. void reportErrorVa(int errNo, const ECLlocation & a, const char* format, va_list args);
  516. void reportError(int errNo, const char *msg, int lineno, int column, int position=0);
  517. void reportWarning(WarnErrorCategory category, int warnNo, const ECLlocation & pos, const char* format, ...) __attribute__((format(printf, 5,6)));
  518. void reportWarning(WarnErrorCategory category, ErrorSeverity severity, int warnNo, const ECLlocation & pos, const char* format, ...) __attribute__((format(printf, 6, 7)));
  519. void reportWarningVa(WarnErrorCategory category, int errNo, const attribute& a, const char* format, va_list args);
  520. void reportWarning(WarnErrorCategory category, int warnNo, const char *msg, int lineno, int column);
  521. void addResult(IHqlExpression *query, const attribute& errpos);
  522. // interface IErrorReceiver
  523. virtual void reportError(int errNo, const char *msg, const char *filename=NULL, int lineno=0, int column=0, int pos=0);
  524. virtual void report(IECLError * error);
  525. virtual IECLError * mapError(IECLError * error);
  526. void reportWarning(WarnErrorCategory category, int warnNo, const char *msg, const char *filename=NULL, int lineno=0, int column=0, int pos=0);
  527. virtual size32_t errCount();
  528. virtual size32_t warnCount();
  529. IHqlExpression * findAssignment(IHqlExpression *field);
  530. void addAssignment(attribute &field, attribute &source);
  531. void addAssignment(const attribute & errpos, IHqlExpression * targetExpr, IHqlExpression * srcExpr);
  532. void addAssignall(IHqlExpression * record, IHqlExpression * src,const attribute& errpos);
  533. void addConditionalAssign(const attribute & errpos, IHqlExpression * self, IHqlExpression * leftSelect, IHqlExpression * rightSelect, IHqlExpression * field);
  534. void addConditionalRowAssign(const attribute & errpos, IHqlExpression * self, IHqlExpression * leftSelect, IHqlExpression * rightSelect, IHqlExpression * record);
  535. void checkAllAssigned(IHqlExpression * record, const attribute &errpos);
  536. void checkGrouping(const attribute & errpos, HqlExprArray & parms, IHqlExpression* record, IHqlExpression* groups);
  537. void checkGrouping(const attribute & errpos, IHqlExpression * dataset, IHqlExpression* record, IHqlExpression* groups);
  538. void checkFieldMap(IHqlExpression* map, attribute& errpos);
  539. IHqlExpression * createDistributeCond(IHqlExpression * left, IHqlExpression * right, const attribute & err, const attribute & seqAttr);
  540. IHqlExpression * addSideEffects(IHqlExpression * expr);
  541. IHqlExpression * associateSideEffects(IHqlExpression * expr, const ECLlocation & errpos);
  542. void clearSideEffects();
  543. bool sideEffectsPending() const;
  544. void checkAssignedNormalizeTransform(IHqlExpression * record, const attribute &errpos);
  545. void doCheckAssignedNormalizeTransform(HqlExprArray * assigns, IHqlExpression* select, IHqlExpression* targetSelect, IHqlExpression * cur, const attribute& errpos, bool & modified);
  546. bool checkValidBaseModule(const attribute & attr, SharedHqlExpr & expr);
  547. IHqlExpression * implementInterfaceFromModule(attribute & iAttr, attribute & mAttr, IHqlExpression * flags);
  548. IHqlExpression * implementInterfaceFromModule(const attribute & modpos, const attribute & ipos, IHqlExpression * implementModule, IHqlExpression * projectInterface, IHqlExpression * flags);
  549. DefineIdSt * createDefineId(int scope, ITypeInfo * ownedType);
  550. void enterCompoundObject();
  551. void leaveCompoundObject();
  552. void enterScope(IHqlScope * scope, bool allowExternal);
  553. void enterScope(bool allowExternal);
  554. void enterVirtualScope();
  555. void leaveScope(const attribute & errpos);
  556. IHqlExpression * leaveLamdaExpression(attribute & exprattr);
  557. IHqlScope * closeLeaveScope(const YYSTYPE & errpos);
  558. void enterPatternScope(IHqlExpression * pattern);
  559. void leavePatternScope(const YYSTYPE & errpos);
  560. bool insideNestedScope() const;
  561. void beginTransform(ITypeInfo * type);
  562. IHqlExpression *endTransform(const attribute &errpos);
  563. void openTransform(ITypeInfo * type);
  564. IHqlExpression *closeTransform(const attribute &errpos);
  565. void appendTransformAssign(IHqlExpression * transform, IHqlExpression * to, IHqlExpression * from, const attribute& errpos);
  566. void beginRecord();
  567. void addRecordOption(attribute & attr);
  568. void attachPendingWarnings(attribute & exprAttr) { if (pendingWarnings.ordinality()) doAttachPendingWarnings(exprAttr); }
  569. void doAttachPendingWarnings(attribute & exprAttr);
  570. IHqlExpression * attachPendingWarnings(IHqlExpression * ownedExpr);
  571. IHqlExpression * attachMetaAttributes(IHqlExpression * ownedExpr, HqlExprArray & meta);
  572. void addDatasetField(const attribute &errpos, IIdAtom * name, ITypeInfo * type, IHqlExpression *value, IHqlExpression * attrs);
  573. void addDictionaryField(const attribute &errpos, IIdAtom * name, ITypeInfo * type, IHqlExpression *value, IHqlExpression * attrs);
  574. void addField(const attribute &errpos, IIdAtom * name, ITypeInfo *type, IHqlExpression *value, IHqlExpression *attrs);
  575. void addFields(const attribute &errpos, IHqlExpression *record, IHqlExpression * dataset, bool clone);
  576. void addIfBlockToActive(const attribute &errpos, IHqlExpression * ifblock);
  577. void addToActiveRecord(IHqlExpression * newField);
  578. void beginIfBlock();
  579. IHqlExpression * endIfBlock();
  580. void beginPayload();
  581. IHqlExpression * endPayload();
  582. IHqlExpression * expandedSortListByReference(attribute * module, attribute & list);
  583. IHqlExpression *bindParameters(const attribute & errpos, IHqlExpression * function, HqlExprArray & ownedActuals);
  584. IHqlExpression *bindParameters(attribute &a, IHqlExpression *parms);
  585. IHqlExpression *bindParameters(const attribute & errpos, IHqlExpression * func, IHqlExpression *parms);
  586. IHqlExpression* bindTemplateFunctionParameters(IHqlExpression* origFunc, HqlExprArray& actuals, const attribute& errpos);
  587. IHqlExpression* bindDatasetParameter(IHqlExpression* expr, IHqlExpression* formal, IHqlExpression* actual, const attribute& errpos);
  588. IHqlExpression* bindConcreteDataset(IHqlExpression* expr, IHqlExpression* formal, IHqlExpression* actual, const attribute& errpos);
  589. IHqlExpression* bindAbstractDataset(IHqlExpression* expr, IHqlExpression* formal, IHqlExpression* actual, const attribute& errpos);
  590. IHqlExpression* processAbstractDataset(IHqlExpression* _expr, IHqlExpression* formal, IHqlExpression* actual, IHqlExpression * mapping, const attribute& errpos, bool errorIfNotFound, bool & hadError);
  591. void enterType(const attribute &errpos, bool isParameteried);
  592. void leaveType(const YYSTYPE & errpos);
  593. void checkRecordTypesMatch(IHqlExpression *ds1, IHqlExpression *ds2, const attribute & errpos);
  594. int checkRecordTypesSimilar(IHqlExpression *left, IHqlExpression *right, const attribute &atr, unsigned maxFields = (unsigned)-1);
  595. bool checkRecordCreateTransform(HqlExprArray & assigns, IHqlExpression *leftExpr, IHqlExpression *leftSelect, IHqlExpression *rightExpr, IHqlExpression *rightSelect, const attribute &atr);
  596. IHqlExpression * checkEnsureRecordsMatch(IHqlExpression * left, IHqlExpression * right, const attribute & errpos, bool rightIsRow);
  597. void ensureMapToRecordsMatch(OwnedHqlExpr & recordExpr, HqlExprArray & args, const attribute & errpos, bool isRow);
  598. void checkRecordIsValid(const attribute &atr, IHqlExpression *record);
  599. void checkValidRecordMode(IHqlExpression * dataset, attribute & atr, attribute & modeatr);
  600. void checkValidCsvRecord(const attribute & errpos, IHqlExpression * record);
  601. void checkValidPipeRecord(const attribute & errpos, IHqlExpression * record, IHqlExpression * attrs, IHqlExpression * expr);
  602. void createAppendDictionaries(attribute & targetAttr, attribute & leftAttr, attribute & rightAttr, IAtom * kind);
  603. void createAppendFiles(attribute & targetAttr, attribute & leftAttr, attribute & rightAttr, IAtom * kind);
  604. IHqlExpression * processIfProduction(attribute & condAttr, attribute & trueAttr, attribute * falseAttr);
  605. IHqlExpression * createSymbolFromValue(IHqlExpression * primaryExpr, IHqlExpression * value);
  606. unsigned getMaxErrorsAllowed() { return m_maxErrorsAllowed; }
  607. void setMaxErrorsAllowed(unsigned n) { m_maxErrorsAllowed = n; }
  608. void setAssociateWarnings(bool value) { associateWarnings = value; }
  609. IHqlExpression* clearFieldMap(IHqlExpression* expr);
  610. void setExpectedAttribute(IIdAtom * _expectedAttribute) { expectedAttribute = _expectedAttribute; current_id = _expectedAttribute; }
  611. void setCurrentToExpected() { current_id = expectedAttribute; }
  612. IHqlScope * queryPrimaryScope(bool isPrivate);
  613. unsigned nextParameterIndex() { return 0; } // not commoned up at moment{ return activeParameters.length()+savedParameters.length(); }
  614. void addActiveParameterOwn(const attribute & errpos, IHqlExpression * expr, IHqlExpression * defaultValue);
  615. void gatherActiveParameters(HqlExprCopyArray & target);
  616. IHqlExpression * createUniqueId();
  617. void onOpenBra();
  618. void onCloseBra();
  619. int yyLex(attribute * yylval, const short * activeState);
  620. protected:
  621. IIdAtom * createUnnamedFieldId();
  622. IIdAtom * createUnnamedFieldId(const char * prefix);
  623. IIdAtom * getNameFromExpr(attribute& attr);
  624. IIdAtom * createFieldNameFromExpr(IHqlExpression * expr);
  625. IHqlExpression * createAssert(attribute & cond, attribute * msg, attribute & flags);
  626. void defineImport(const attribute & errpos, IHqlExpression * imported, IIdAtom * newName);
  627. IHqlExpression * resolveImportModule(const attribute & errpos, IHqlExpression * expr);
  628. void setActiveAttrs(int activityToken, const TokenMap * attrs);
  629. IHqlExpression *doParse();
  630. IHqlExpression * checkBuildIndexRecord(IHqlExpression *record, attribute & errpos);
  631. void checkNotAlreadyDefined(IIdAtom * name, IHqlScope * scope, const attribute & idattr);
  632. void checkNotAlreadyDefined(IIdAtom * name, const attribute & idattr);
  633. void checkBuildIndexFilenameFlags(IHqlExpression * dataset, attribute & flags);
  634. IHqlExpression * createBuildFileFromTable(IHqlExpression * table, attribute & flagsAttr, IHqlExpression * filename, attribute & errpos);
  635. IHqlExpression * createBuildIndexFromIndex(attribute & indexAttr, attribute & flagsAttr, IHqlExpression * filename, attribute & errpos);
  636. void checkOutputRecord(attribute & errpos, bool outerLevel);
  637. void checkSoapRecord(attribute & errpos);
  638. IHqlExpression * checkOutputRecord(IHqlExpression *record, const attribute & errpos, bool & allConstant, bool outerLevel);
  639. void doAddAssignment(IHqlExpression * transform, IHqlExpression * field, IHqlExpression * rhs, const attribute& errpos);
  640. void doAddAssignall(IHqlExpression* assignall, IHqlExpression *tgt, IHqlExpression *src,const attribute& errpos);
  641. void doAddAssignSelf(IHqlExpression* assignall, IHqlExpression *tgt, IHqlExpression *src,const attribute& errpos);
  642. void doAddAssignCompound(IHqlExpression * assignall, IHqlExpression * target, IHqlExpression * src, IHqlExpression * record, const attribute& errpos);
  643. void doAddAssignCompoundOwn(IHqlExpression * assignall, IHqlExpression * target, IHqlExpression * src, IHqlExpression * record, const attribute& errpos);
  644. IHqlExpression * doFindAssignment(IHqlExpression *in, IHqlExpression *field);
  645. IHqlExpression * replaceSelfReferences(IHqlExpression * transform, IHqlExpression * rhs, IHqlExpression * self, const attribute& errpos);
  646. void appendToActiveScope(IHqlExpression * arg);
  647. bool isVirtualFunction(DefineIdSt * defineid, const attribute & errpos);
  648. IHqlExpression * processSortList(const attribute & errpos, node_operator op, IHqlExpression * dataset, HqlExprArray & items, OwnedHqlExpr *joinedClause, OwnedHqlExpr *attributes);
  649. void expandSortedAsList(HqlExprArray & args);
  650. bool expandWholeAndExcept(IHqlExpression * dataset, const attribute & errpos, HqlExprArray & parms);
  651. void expandWholeAndExcept(IHqlExpression * dataset, attribute & a);
  652. void cleanCurTransform();
  653. void unwindSelect(IHqlExpression* expr, HqlExprArray& r);
  654. void setDefaultString(attribute &a);
  655. void canNotAssignTypeError(ITypeInfo* expected, ITypeInfo* given, const attribute& errpos);
  656. void canNotAssignTypeWarn(ITypeInfo* expected, ITypeInfo* given, const attribute& errpos);
  657. void abortParsing();
  658. bool isExceptionalCase(attribute& defineid, attribute& object, attribute& failure);
  659. void checkSvcAttrNoValue(IHqlExpression* attr, const attribute& errpos);
  660. void checkFormals(IIdAtom * name, HqlExprArray & parms, HqlExprArray & defaults, attribute& object);
  661. IHqlExpression * checkParameter(const attribute * errpos, IHqlExpression * actual, IHqlExpression * formal, bool isDefault, IHqlExpression * funcdef);
  662. void checkDedup(IHqlExpression *ds, IHqlExpression *flags, attribute &errpos);
  663. void addParameter(const attribute & errpos, IIdAtom * name, ITypeInfo* type, IHqlExpression* defValue);
  664. void addFunctionParameter(const attribute & errpos, IIdAtom * name, ITypeInfo* type, IHqlExpression* defValue);
  665. void addFunctionProtoParameter(const attribute & errpos, IIdAtom * name, IHqlExpression * like, IHqlExpression* defValue);
  666. bool checkParameters(IHqlExpression* func, HqlExprArray& actuals, const attribute& errpos);
  667. bool checkTemplateFunctionParameters(IHqlExpression* func, HqlExprArray& actuals, const attribute& errpos);
  668. void checkSizeof(IHqlExpression* expr, attribute& errpos);
  669. void checkSizeof(ITypeInfo* expr, attribute& errpos, bool isDataset = false);
  670. void normalizeStoredNameExpression(attribute & a);
  671. void checkPatternFailure(attribute & attr);
  672. void checkDistributer(attribute & err, HqlExprArray & args);
  673. IHqlExpression * createScopedSequenceExpr();
  674. IHqlExpression * createPatternOr(HqlExprArray & args, const attribute & errpos);
  675. IHqlExpression * mapAlienArg(IHqlSimpleScope * scope, IHqlExpression * expr);
  676. ITypeInfo * mapAlienType(IHqlSimpleScope * scope, ITypeInfo * type, const attribute & errpos);
  677. void disableError() { errorDisabled = true; }
  678. void enableError() { errorDisabled = false; }
  679. bool isAborting() { return errorDisabled; }
  680. IIdAtom * fieldMapTo(IHqlExpression* expr, IIdAtom * name);
  681. IIdAtom * fieldMapFrom(IHqlExpression* expr, IIdAtom * name);
  682. bool requireLateBind(IHqlExpression* funcdef, Array& actuals);
  683. IHqlExpression* createDefJoinTransform(IHqlExpression* left,IHqlExpression* right,attribute& errpos, IHqlExpression * seq, IHqlExpression * flags);
  684. IHqlExpression * createRowAssignTransform(const attribute & srcAttr, const attribute & tgtAttr, const attribute & seqAttr);
  685. IHqlExpression * createClearTransform(IHqlExpression * record, const attribute & errpos);
  686. IHqlExpression * createDefaultAssignTransform(IHqlExpression * record, IHqlExpression * rowValue, const attribute & errpos);
  687. IHqlExpression * createDefaultProjectDataset(IHqlExpression * record, IHqlExpression * src, const attribute & errpos);
  688. IHqlExpression * createDatasetFromList(attribute & listAttr, attribute & recordAttr);
  689. void checkConditionalAggregates(IIdAtom * name, IHqlExpression * value, const attribute & errpos);
  690. void checkProjectedFields(IHqlExpression * e, attribute & errpos);
  691. IHqlExpression * createRecordFromDataset(IHqlExpression * ds);
  692. IHqlExpression * cleanIndexRecord(IHqlExpression * record);
  693. IHqlExpression * createRecordIntersection(IHqlExpression * left, IHqlExpression * right, const attribute & errpos);
  694. IHqlExpression * createRecordUnion(IHqlExpression * left, IHqlExpression * right, const attribute & errpos);
  695. IHqlExpression * createRecordDifference(IHqlExpression * left, IHqlExpression * right, const attribute & errpos);
  696. IHqlExpression * createRecordExcept(IHqlExpression * left, IHqlExpression * right, const attribute & errpos);
  697. IHqlExpression * createIndexFromRecord(IHqlExpression * record, IHqlExpression * attr, const attribute & errpos);
  698. IHqlExpression * createProjectRow(attribute & rowAttr, attribute & transformAttr, attribute & seqAttr);
  699. void doDefineSymbol(DefineIdSt * defineid, IHqlExpression * expr, IHqlExpression * failure, const attribute & idattr, int assignPos, int semiColonPos, bool isParametered);
  700. void defineSymbolInScope(IHqlScope * scope, DefineIdSt * defineid, IHqlExpression * expr, IHqlExpression * failure, const attribute & idattr, int assignPos, int semiColonPos, bool isParametered, HqlExprArray & parameters, IHqlExpression * defaults);
  701. void checkDerivedCompatible(IIdAtom * name, IHqlExpression * scope, IHqlExpression * expr, bool isParametered, HqlExprArray & parameters, attribute const & errpos);
  702. void defineSymbolProduction(attribute & nameattr, attribute & paramattr, attribute & assignattr, attribute * valueattr, attribute * failattr, attribute & semiattr);
  703. void definePatternSymbolProduction(attribute & nameattr, const attribute & assignAttr, attribute & valueAttr, attribute & workflowAttr, const attribute & semiattr);
  704. void cloneInheritedAttributes(IHqlScope * scope, const attribute & errpos);
  705. IHqlExpression * createEvaluateOutputModule(const attribute & errpos, IHqlExpression * scopeExpr, IHqlExpression * ifaceExpr, node_operator outputOp, IIdAtom *matchId);
  706. IHqlExpression * createStoredModule(const attribute & errpos, IHqlExpression * scopeExpr);
  707. void processForwardModuleDefinition(const attribute & errpos);
  708. void checkNonGlobalModule(const attribute & errpos, IHqlExpression * scopeExpr);
  709. const HqlExprArray & queryActiveParameters() { return defineScopes.tos().activeParameters; }
  710. bool queryParametered() { return defineScopes.tos().isParametered; }
  711. void resetParameters() { defineScopes.tos().resetParameters(); }
  712. void setParametered(bool value) { defineScopes.tos().isParametered = value; }
  713. inline void setDotScope(IHqlExpression * expr) { dotScope.set(expr); }
  714. IHqlScope * queryTemplateContext();
  715. bool insideTemplateFunction() { return queryTemplateContext() != NULL; }
  716. inline const char * querySourcePathText() { return sourcePath->str(); } // safe if null
  717. bool areSymbolsCompatible(IHqlExpression * expr, bool isParametered, HqlExprArray & parameters, IHqlExpression * prevValue);
  718. IHqlExpression * extractBranchMatch(const attribute & errpos, IHqlExpression & curSym, HqlExprArray & values);
  719. ITypeInfo * extractBranchMatches(const attribute & errpos, IHqlExpression & curSym, HqlExprArrayArray & branches, HqlExprArray & extracted);
  720. void expandScopeEntries(HqlExprArrayArray & branches, IHqlExpression * scope);
  721. void processIfScope(const attribute & errpos, IHqlExpression * cond, IHqlExpression * trueScope, IHqlExpression * falseScope);
  722. unsigned getExtraLookupFlags(IHqlScope * scope);
  723. void appendTransformOption(IHqlExpression * expr)
  724. {
  725. if (curTransform)
  726. curTransform->addOperand(expr);
  727. else
  728. expr->Release();
  729. }
  730. void restoreTypeFromActiveTransform()
  731. {
  732. //Now restore the active "global" variables.
  733. current_type = curTransform->queryType();
  734. }
  735. protected:
  736. bool errorDisabled;
  737. bool parsingTemplateAttribute;
  738. bool expectedUnknownId;
  739. bool insideEvaluate;
  740. bool fieldMapUsed;
  741. bool resolveSymbols;
  742. bool forceResult;
  743. bool associateWarnings;
  744. bool legacyImportSemantics;
  745. bool legacyWhenSemantics;
  746. bool isQuery;
  747. bool parseConstantText;
  748. bool expandingMacroPosition;
  749. unsigned m_maxErrorsAllowed;
  750. IECLErrorArray pendingWarnings;
  751. Linked<ISourcePath> sourcePath;
  752. IIdAtom * moduleName;
  753. IIdAtom * current_id;
  754. IIdAtom * expectedAttribute;
  755. IHqlScope *transformScope;
  756. PointerArray savedIds;
  757. UnsignedArray savedLastpos;
  758. unsigned lastpos;
  759. bool inType;
  760. Owned<IHqlScope> modScope;
  761. OwnedHqlExpr dotScope;
  762. unsigned outerScopeAccessDepth;
  763. IHqlScope* containerScope;
  764. IHqlScope* globalScope;
  765. ITypeInfo *current_type;
  766. HqlExprArray topScopes;
  767. CIArrayOf<LeftRightScope> leftRightScopes;
  768. HqlExprArray selfScopes;
  769. HqlExprArray localeStack;
  770. HqlExprArray localFunctionCache;
  771. HqlExprArray curListStack;
  772. CIArrayOf<OwnedHqlExprItem> counterStack;
  773. CIArrayOf<TransformSaveInfo> transformSaveStack;
  774. CIArrayOf<ActiveScopeInfo> defineScopes;
  775. OwnedHqlExpr curList;
  776. BoolArray wasInEvaluate;
  777. HqlExprCopyArray activeRecords;
  778. HqlExprArray activeIfBlocks;
  779. HqlLex *lexObject;
  780. HqlExprArray parseResults;
  781. IErrorReceiver *errorHandler;
  782. IHqlExpression *curTransform;
  783. ITypeInfo * defaultIntegralType;
  784. ITypeInfo * uint4Type;
  785. ITypeInfo * defaultRealType;
  786. ITypeInfo * boolType;
  787. HqlScopeArray defaultScopes;
  788. PointerArray savedType;
  789. HqlExprAttr curFeatureParams;
  790. HqlExprCopyArray implicitFeatureNames;
  791. HqlExprCopyArray implicitFeatureValues;
  792. Owned<IHqlScope> parseScope;
  793. HqlExprAttr lastEnumValue;
  794. Owned<ITypeInfo> curEnumType;
  795. unsigned sortDepth;
  796. Owned<IHqlScope> serviceScope;
  797. HqlLookupContext lookupCtx;
  798. HqlExprAttr defaultServiceAttrs;
  799. CIArrayOf<FunctionCallInfo> activeFunctionCalls;
  800. OwnedHqlExpr serviceExtraAttributes;
  801. ConstPointerArray validAttributesStack;
  802. unsigned minimumScopeIndex;
  803. const TokenMap * pendingAttributes;
  804. bool aborting;
  805. void setIdUnknown(bool expected) { expectedUnknownId = expected; }
  806. bool getIdUnknown() { return expectedUnknownId; }
  807. void init(IHqlScope * _globalScope, IHqlScope * _containerScope);
  808. void addProperty(const char *prop, const char *val);
  809. IHqlExpression * createSelect(IHqlExpression * lhs, IHqlExpression * rhs, const attribute & errpos);
  810. IHqlExpression * createIndirectSelect(IHqlExpression * lhs, IHqlExpression * rhs, const attribute & errpos);
  811. IHqlExpression * addDatasetSelector(IHqlExpression * lhs, IHqlExpression * rhs);
  812. void pushTopScope(IHqlExpression *);
  813. void pushLeftRightScope(IHqlExpression * left, IHqlExpression * right);
  814. void pushPendingLeftRightScope(IHqlExpression * left, IHqlExpression * right);
  815. void setRightScope(IHqlExpression *);
  816. void beginRowsScope(node_operator side);
  817. void pushSelfScope(IHqlExpression *);
  818. void pushSelfScope(ITypeInfo * selfType);
  819. IHqlExpression * getSelector(const attribute & errpos, node_operator side);
  820. IHqlExpression * createActiveSelectorSequence(IHqlExpression * left, IHqlExpression * right);
  821. IHqlExpression * getSelectorSequence();
  822. IHqlExpression * forceEnsureExprType(IHqlExpression * expr, ITypeInfo * type);
  823. void popTopScope();
  824. IHqlExpression * endRowsScope();
  825. IHqlExpression * popLeftRightScope();
  826. void popSelfScope();
  827. void beginList();
  828. void addListElement(IHqlExpression * expr);
  829. void endList(HqlExprArray & args);
  830. void pushLocale(IHqlExpression *);
  831. void popLocale();
  832. IHqlExpression *queryDefaultLocale();
  833. IHqlExpression * getActiveCounter(attribute & errpos);
  834. void pushRecord(IHqlExpression *);
  835. IHqlExpression *endRecordDef();
  836. IHqlExpression *popRecord();
  837. IHqlExpression *queryTopScope();
  838. ITypeInfo * getPromotedECLType(HqlExprArray & args, ITypeInfo * otherType, bool allowVariableLength);
  839. IHqlExpression *getTopScope();
  840. IHqlExpression *queryLeftScope();
  841. IHqlExpression *queryRightScope();
  842. IHqlExpression *getSelfScope();
  843. IHqlExpression *getSelfDotExpr(const attribute & errpos);
  844. IHqlExpression *resolveRows(const attribute & errpos, IHqlExpression * ds);
  845. void releaseScopes();
  846. static void simplify(int *expected, int first, ...);
  847. static void simplifyExpected(int *expected);
  848. static bool isExplicitlyDistributed(IHqlExpression *e);
  849. void checkMergeSortOrder(attribute &errpos, IHqlExpression *ds1, IHqlExpression *ds2, IHqlExpression * sortOrder);
  850. void checkDistribution(attribute &errpos, IHqlExpression *input, bool localSpecified, bool ignoreGrouping);
  851. void checkDistribution(attribute &errpos, IHqlExpression *newExpr, bool ignoreGrouping);
  852. void checkMergeInputSorted(attribute &atr, bool isLocal);
  853. void checkGrouped(attribute & atr);
  854. void checkRegrouping(attribute & atr, HqlExprArray & args);
  855. void checkRecordsMatch(attribute & atr, HqlExprArray & args);
  856. IHqlExpression * transformRecord(IHqlExpression *dataset, IAtom * targetCharset, const attribute & errpos);
  857. IHqlExpression * transformRecord(IHqlExpression *record, IAtom * targetCharset, IHqlExpression * scope, bool & changed, const attribute & errpos);
  858. IHqlExpression * translateFieldsToNewScope(IHqlExpression * expr, IHqlSimpleScope * record, const attribute & err);
  859. ITypeInfo *queryCurrentRecordType();
  860. ITypeInfo *queryCurrentTransformType();
  861. IHqlExpression *queryCurrentTransformRecord();
  862. IHqlExpression* queryFieldMap(IHqlExpression* expr);
  863. IHqlExpression* bindFieldMap(IHqlExpression*, IHqlExpression*);
  864. void extractIndexRecordAndExtra(SharedHqlExpr & record, SharedHqlExpr & extra);
  865. void transferOptions(attribute & filenameAttr, attribute & optionsAttr);
  866. IHqlExpression * extractTransformFromExtra(SharedHqlExpr & extra);
  867. void expandPayload(HqlExprArray & fields, IHqlExpression * payload, IHqlSimpleScope * scope, ITypeInfo * & lastFieldType, const attribute & errpos);
  868. void mergeDictionaryPayload(OwnedHqlExpr & record, IHqlExpression * payload, const attribute & errpos);
  869. void modifyIndexPayloadRecord(SharedHqlExpr & record, SharedHqlExpr & payload, SharedHqlExpr & extra, const attribute & errpos);
  870. bool haveAssignedToChildren(IHqlExpression * select);
  871. void checkPattern(attribute & pattern, bool isCompound);
  872. void checkSubPattern(attribute & pattern);
  873. void checkPattern(attribute & pattern, HqlExprArray & values);
  874. ITypeInfo * getCompoundRuleType(IHqlExpression * lhs);
  875. ITypeInfo * getCompoundRuleType(ITypeInfo * lType, ITypeInfo * rType);
  876. IHqlExpression * convertPatternToExpression(attribute & text);
  877. void checkProduction(const HqlExprArray & args, const attribute & errpos);
  878. IHqlExpression * processExprInPattern(attribute & attr);
  879. IHqlExpression * getFeatureParams();
  880. IHqlExpression * deduceGuardFeature(IHqlExpression * expr, attribute & errpos);
  881. void expandImplicitFeatures();
  882. void expandImplicitFeatures(IHqlExpression * feature, IHqlExpression * value);
  883. IHqlExpression * findFeature(IHqlExpression * value);
  884. void setFeatureParamsOwn(IHqlExpression * expr);
  885. };
  886. #ifndef YY_TYPEDEF_YY_SCANNER_T
  887. #define YY_TYPEDEF_YY_SCANNER_T
  888. typedef void* yyscan_t;
  889. #endif
  890. enum
  891. {
  892. HEFhadtrue = 0x0001,
  893. HEFhadelse = 0x0002,
  894. };
  895. class HqlLex
  896. {
  897. public:
  898. HqlLex(HqlGram *gram, IFileContents * _text, IXmlScope *xmlScope, IHqlExpression *macroExpr);
  899. ~HqlLex();
  900. void enterEmbeddedMode();
  901. static int doyyFlex(YYSTYPE & returnToken, yyscan_t yyscanner, HqlLex * lexer, bool lookup, const short * activeState);
  902. static int lookupIdentifierToken(YYSTYPE & returnToken, HqlLex * lexer, bool lookup, const short * activeState, const char * tokenText);
  903. int yyLex(YYSTYPE & returnToken, bool lookup, const short * activeState); /* lexical analyzer */
  904. bool assertNext(YYSTYPE & returnToken, int expected, unsigned code, const char * msg);
  905. bool assertNextOpenBra();
  906. bool assertNextComma();
  907. void set_yyLineNo(int lineno) { yyLineNo = lineno; }
  908. void set_yyColumn(int column) { yyColumn = column; }
  909. int get_yyLineNo(void) { return yyLineNo; }
  910. int get_yyColumn(void) { return yyColumn; }
  911. IFileContents* query_FileContents(void);
  912. // report error line/column for macro
  913. int getActualLineNo(void) { return (inmacro) ? inmacro->getActualLineNo() : yyLineNo; }
  914. int getActualColumn(void) { return (inmacro) ? inmacro->getActualColumn() : yyColumn; }
  915. // yyPosition handles directly to buffer. Don't mess with it!
  916. int get_yyPosition(void) { return yyPosition; }
  917. /* push back a string to the input */
  918. HqlLex* getMacroLex() { return inmacro; }
  919. char *get_yyText(void);
  920. StringBuffer &getTokenText(StringBuffer &);
  921. HqlLex* getParentLex() { return parentLex; }
  922. void setParentLex(HqlLex* pLex) { parentLex = pLex; }
  923. const char* getMacroName() { return (macroExpr) ? macroExpr->queryName()->str() : "<param>"; }
  924. IPropertyTree * getClearJavadoc();
  925. void loadXML(const YYSTYPE & errpos, const char * value, const char * child = NULL);
  926. void getPosition(ECLlocation & pos)
  927. {
  928. if (inmacro)
  929. inmacro->getPosition(pos);
  930. else
  931. pos.set(yyLineNo, yyColumn, yyPosition, sourcePath);
  932. }
  933. inline IFileContents * queryFileContents() { return text; }
  934. inline ISourcePath * querySourcePath() { return sourcePath; }
  935. inline int queryLastToken() const { return lastToken; }
  936. ISourcePath * queryActualSourcePath()
  937. {
  938. if (inmacro)
  939. {
  940. ISourcePath * macName = inmacro->queryActualSourcePath();
  941. if (macName)
  942. return macName;
  943. }
  944. return sourcePath;
  945. }
  946. inline void setMacroParams(IProperties * _macroParams) { macroParms.set(_macroParams); }
  947. inline void setTokenPosition(YYSTYPE & returnToken)
  948. {
  949. returnToken.setPosition(yyLineNo, yyColumn, yyPosition, sourcePath);
  950. }
  951. inline void updatePosition(unsigned delta)
  952. {
  953. yyPosition += delta;
  954. yyColumn += delta;
  955. }
  956. inline void updateNewline()
  957. {
  958. yyColumn = 1;
  959. ++yyLineNo;
  960. }
  961. StringBuffer& doGetDataType(StringBuffer & type, const char * text, int lineno, int column);
  962. void pushText(const char *);
  963. protected:
  964. void init(IFileContents * _text);
  965. private:
  966. static void doEnterEmbeddedMode(yyscan_t yyscanner);
  967. void declareXmlSymbol(const YYSTYPE & errpos, const char *name);
  968. StringBuffer &lookupXmlSymbol(const YYSTYPE & errpos, const char *name, StringBuffer &value);
  969. void setXmlSymbol(const YYSTYPE & errpos, const char *name, const char *value, bool append);
  970. IIterator *getSubScopes(const YYSTYPE & errpos, const char *name, bool doAll);
  971. IXmlScope *queryTopXmlScope();
  972. IXmlScope *ensureTopXmlScope(const YYSTYPE & errpos);
  973. IHqlExpression *lookupSymbol(IIdAtom * name, const attribute& errpos);
  974. void reportError(const YYSTYPE & returnToken, int errNo, const char *format, ...) __attribute__((format(printf, 4, 5)));
  975. void reportWarning(WarnErrorCategory category, const YYSTYPE & returnToken, int warnNo, const char *format, ...) __attribute__((format(printf, 5, 6)));
  976. void beginNestedHash(unsigned kind) { hashendKinds.append(kind); hashendFlags.append(0); }
  977. void endNestedHash() { hashendKinds.pop(); hashendFlags.pop(); }
  978. void clearNestedHash() { hashendKinds.kill(); hashendFlags.kill(); }
  979. void setHashEndFlags(unsigned i) { if (hashendFlags.ordinality()) { hashendFlags.pop(); hashendFlags.append(i); } }
  980. inline bool parserExpecting(int tok, const short * activeState)
  981. {
  982. return yyParser->canFollowCurrentState(tok, activeState);
  983. }
  984. inline int mapToken(int tok)
  985. {
  986. return yyParser->mapToken(tok);
  987. }
  988. inline void onOpenBra() { yyParser->onOpenBra(); }
  989. inline void onCloseBra() { yyParser->onCloseBra(); }
  990. inline ISourcePath * querySourcePath() const { return sourcePath; }
  991. bool isMacroActive(IHqlExpression *expr);
  992. bool isAborting();
  993. void pushMacro(IHqlExpression *expr);
  994. void pushText(IFileContents * text, int startLineNo, int startColumn);
  995. void pushText(const char *s, int startLineNo, int startColumn);
  996. bool getParameter(StringBuffer &curParam, const char* for_what, int* startLine=NULL, int* startCol=NULL);
  997. IValue *foldConstExpression(const YYSTYPE & errpos, IHqlExpression * expr, IXmlScope *xmlScope, int startLine, int startCol);
  998. IValue *parseConstExpression(const YYSTYPE & errpos, StringBuffer &curParam, IXmlScope *xmlScope, int line, int col);
  999. IValue *parseConstExpression(const YYSTYPE & errpos, IFileContents * contents, IXmlScope *xmlScope, int line, int col);
  1000. IHqlExpression * parseECL(IFileContents * contents, IXmlScope *xmlScope, int startLine, int startCol);
  1001. IHqlExpression * parseECL(const char * curParam, IXmlScope *xmlScope, int startLine, int startCol);
  1002. void setMacroParam(const YYSTYPE & errpos, IHqlExpression* funcdef, StringBuffer& curParam, IIdAtom * argumentName, unsigned& parmno,IProperties *macroParms);
  1003. unsigned getTypeSize(unsigned lengthTypeName);
  1004. static IHqlExpression * createIntegerConstant(__int64 value, bool isSigned);
  1005. void doPreprocessorLookup(const YYSTYPE & errpos, bool stringify, int extra);
  1006. void doApply(YYSTYPE & returnToken);
  1007. int doElse(YYSTYPE & returnToken, bool lookup, const short * activeState, bool isElseIf);
  1008. int doEnd(YYSTYPE & returnToken, bool lookup, const short * activeState);
  1009. void doExpand(YYSTYPE & returnToken);
  1010. void doTrace(YYSTYPE & returnToken);
  1011. void doError(YYSTYPE & returnToken, bool isError);
  1012. void doExport(YYSTYPE & returnToken, bool toXml);
  1013. void doFor(YYSTYPE & returnToken, bool doAll);
  1014. int doHashText(YYSTYPE & returnToken);
  1015. void doLoop(YYSTYPE & returnToken);
  1016. void doIf(YYSTYPE & returnToken, bool isElseIf);
  1017. void doSet(YYSTYPE & returnToken, bool _append);
  1018. void doLine(YYSTYPE & returnToken);
  1019. void doDeclare(YYSTYPE & returnToken);
  1020. void doDefined(YYSTYPE & returnToken);
  1021. void doGetDataType(YYSTYPE & returnToken);
  1022. bool doIsDefined(YYSTYPE & returnToken);
  1023. void doIsValid(YYSTYPE & returnToken);
  1024. void doInModule(YYSTYPE & returnToken);
  1025. void doMangle(YYSTYPE & returnToken, bool de);
  1026. void doUniqueName(YYSTYPE & returnToken);
  1027. void doSkipUntilEnd(YYSTYPE & returnToken, const char * forwhat);
  1028. void processEncrypted();
  1029. void declareUniqueName(const char* name, const char * pattern);
  1030. void checkNextLoop(const YYSTYPE & errpos, bool first,int startLine,int startCol);
  1031. bool getDefinedParameter(StringBuffer &curParam, YYSTYPE & returnToken, const char* for_what, SharedHqlExpr & resolved);
  1032. bool checkUnicodeLiteral(char const * str, unsigned length, unsigned & ep, StringBuffer & msg);
  1033. private:
  1034. HqlGram *yyParser;
  1035. Owned<IFileContents> text;
  1036. Linked<ISourcePath> sourcePath;
  1037. HqlLex *inmacro;
  1038. /* to handle recursive macro */
  1039. HqlLex *parentLex;
  1040. Owned<IProperties> macroParms;
  1041. IIterator *forLoop;
  1042. IHqlExpression *macroExpr;
  1043. Owned<IFileContents> forBody;
  1044. Owned<IFileContents> forFilter;
  1045. IXmlScope *xmlScope;
  1046. enum { HashStmtNone, HashStmtFor, HashStmtForAll, HashStmtLoop, HashStmtIf };
  1047. int lastToken;
  1048. int macroGathering;
  1049. int skipNesting;
  1050. UnsignedArray hashendFlags;
  1051. UnsignedArray hashendKinds;
  1052. bool hasHashbreak;
  1053. int loopTimes;
  1054. bool inComment;
  1055. bool inCpp;
  1056. bool encrypted;
  1057. StringBuffer javaDocComment;
  1058. yyscan_t scanner;
  1059. int yyLineNo;
  1060. int yyColumn;
  1061. int yyPosition;
  1062. int yyStartPos;
  1063. char *yyBuffer;
  1064. static unsigned hex2digit(char c);
  1065. static __int64 str2int64(unsigned len, const char * digits, unsigned base);
  1066. static void hex2str(char * target, const char * digits, unsigned len);
  1067. };
  1068. IHqlExpression *reparseTemplateFunction(IHqlExpression * funcdef, IHqlScope *scope, HqlLookupContext & ctx, bool hasFieldMap);
  1069. extern HQL_API void resetLexerUniqueNames(); // to make regression suite consistent
  1070. extern HQL_API void testHqlInternals();
  1071. #endif