clipsruby 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/clipsruby/agenda.c +1373 -0
- data/ext/clipsruby/agenda.h +169 -0
- data/ext/clipsruby/analysis.c +1142 -0
- data/ext/clipsruby/analysis.h +61 -0
- data/ext/clipsruby/argacces.c +526 -0
- data/ext/clipsruby/argacces.h +77 -0
- data/ext/clipsruby/bload.c +884 -0
- data/ext/clipsruby/bload.h +94 -0
- data/ext/clipsruby/bmathfun.c +557 -0
- data/ext/clipsruby/bmathfun.h +66 -0
- data/ext/clipsruby/bsave.c +634 -0
- data/ext/clipsruby/bsave.h +130 -0
- data/ext/clipsruby/classcom.c +976 -0
- data/ext/clipsruby/classcom.h +115 -0
- data/ext/clipsruby/classexm.c +1376 -0
- data/ext/clipsruby/classexm.h +97 -0
- data/ext/clipsruby/classfun.c +1392 -0
- data/ext/clipsruby/classfun.h +164 -0
- data/ext/clipsruby/classinf.c +1245 -0
- data/ext/clipsruby/classinf.h +94 -0
- data/ext/clipsruby/classini.c +843 -0
- data/ext/clipsruby/classini.h +75 -0
- data/ext/clipsruby/classpsr.c +957 -0
- data/ext/clipsruby/classpsr.h +73 -0
- data/ext/clipsruby/clips.h +133 -0
- data/ext/clipsruby/clipsruby.c +619 -0
- data/ext/clipsruby/clsltpsr.c +931 -0
- data/ext/clipsruby/clsltpsr.h +72 -0
- data/ext/clipsruby/commline.c +1217 -0
- data/ext/clipsruby/commline.h +131 -0
- data/ext/clipsruby/conscomp.c +1593 -0
- data/ext/clipsruby/conscomp.h +150 -0
- data/ext/clipsruby/constant.h +264 -0
- data/ext/clipsruby/constrct.c +1090 -0
- data/ext/clipsruby/constrct.h +216 -0
- data/ext/clipsruby/constrnt.c +554 -0
- data/ext/clipsruby/constrnt.h +132 -0
- data/ext/clipsruby/crstrtgy.c +1088 -0
- data/ext/clipsruby/crstrtgy.h +85 -0
- data/ext/clipsruby/cstrcbin.c +185 -0
- data/ext/clipsruby/cstrcbin.h +61 -0
- data/ext/clipsruby/cstrccmp.h +43 -0
- data/ext/clipsruby/cstrccom.c +1791 -0
- data/ext/clipsruby/cstrccom.h +115 -0
- data/ext/clipsruby/cstrcpsr.c +835 -0
- data/ext/clipsruby/cstrcpsr.h +97 -0
- data/ext/clipsruby/cstrnbin.c +282 -0
- data/ext/clipsruby/cstrnbin.h +55 -0
- data/ext/clipsruby/cstrnchk.c +826 -0
- data/ext/clipsruby/cstrnchk.h +91 -0
- data/ext/clipsruby/cstrncmp.c +238 -0
- data/ext/clipsruby/cstrncmp.h +57 -0
- data/ext/clipsruby/cstrnops.c +1176 -0
- data/ext/clipsruby/cstrnops.h +47 -0
- data/ext/clipsruby/cstrnpsr.c +1394 -0
- data/ext/clipsruby/cstrnpsr.h +88 -0
- data/ext/clipsruby/cstrnutl.c +564 -0
- data/ext/clipsruby/cstrnutl.h +54 -0
- data/ext/clipsruby/default.c +454 -0
- data/ext/clipsruby/default.h +57 -0
- data/ext/clipsruby/defins.c +971 -0
- data/ext/clipsruby/defins.h +127 -0
- data/ext/clipsruby/developr.c +677 -0
- data/ext/clipsruby/developr.h +69 -0
- data/ext/clipsruby/dffctbin.c +477 -0
- data/ext/clipsruby/dffctbin.h +76 -0
- data/ext/clipsruby/dffctbsc.c +308 -0
- data/ext/clipsruby/dffctbsc.h +72 -0
- data/ext/clipsruby/dffctcmp.c +297 -0
- data/ext/clipsruby/dffctcmp.h +44 -0
- data/ext/clipsruby/dffctdef.c +364 -0
- data/ext/clipsruby/dffctdef.h +104 -0
- data/ext/clipsruby/dffctpsr.c +179 -0
- data/ext/clipsruby/dffctpsr.h +49 -0
- data/ext/clipsruby/dffnxbin.c +520 -0
- data/ext/clipsruby/dffnxbin.h +67 -0
- data/ext/clipsruby/dffnxcmp.c +378 -0
- data/ext/clipsruby/dffnxcmp.h +54 -0
- data/ext/clipsruby/dffnxexe.c +241 -0
- data/ext/clipsruby/dffnxexe.h +58 -0
- data/ext/clipsruby/dffnxfun.c +1192 -0
- data/ext/clipsruby/dffnxfun.h +155 -0
- data/ext/clipsruby/dffnxpsr.c +514 -0
- data/ext/clipsruby/dffnxpsr.h +57 -0
- data/ext/clipsruby/dfinsbin.c +509 -0
- data/ext/clipsruby/dfinsbin.h +66 -0
- data/ext/clipsruby/dfinscmp.c +345 -0
- data/ext/clipsruby/dfinscmp.h +48 -0
- data/ext/clipsruby/drive.c +1191 -0
- data/ext/clipsruby/drive.h +65 -0
- data/ext/clipsruby/emathfun.c +1213 -0
- data/ext/clipsruby/emathfun.h +99 -0
- data/ext/clipsruby/engine.c +1568 -0
- data/ext/clipsruby/engine.h +203 -0
- data/ext/clipsruby/entities.h +276 -0
- data/ext/clipsruby/envrnbld.c +514 -0
- data/ext/clipsruby/envrnbld.h +40 -0
- data/ext/clipsruby/envrnmnt.c +257 -0
- data/ext/clipsruby/envrnmnt.h +112 -0
- data/ext/clipsruby/evaluatn.c +1736 -0
- data/ext/clipsruby/evaluatn.h +211 -0
- data/ext/clipsruby/expressn.c +494 -0
- data/ext/clipsruby/expressn.h +154 -0
- data/ext/clipsruby/exprnbin.c +538 -0
- data/ext/clipsruby/exprnbin.h +60 -0
- data/ext/clipsruby/exprnops.c +564 -0
- data/ext/clipsruby/exprnops.h +67 -0
- data/ext/clipsruby/exprnpsr.c +1112 -0
- data/ext/clipsruby/exprnpsr.h +98 -0
- data/ext/clipsruby/extconf.rb +2 -0
- data/ext/clipsruby/extnfunc.c +1015 -0
- data/ext/clipsruby/extnfunc.h +157 -0
- data/ext/clipsruby/factbin.c +447 -0
- data/ext/clipsruby/factbin.h +56 -0
- data/ext/clipsruby/factbld.c +1035 -0
- data/ext/clipsruby/factbld.h +63 -0
- data/ext/clipsruby/factcmp.c +386 -0
- data/ext/clipsruby/factcmp.h +46 -0
- data/ext/clipsruby/factcom.c +759 -0
- data/ext/clipsruby/factcom.h +80 -0
- data/ext/clipsruby/factfile.c +1761 -0
- data/ext/clipsruby/factfile.h +54 -0
- data/ext/clipsruby/factfun.c +682 -0
- data/ext/clipsruby/factfun.h +77 -0
- data/ext/clipsruby/factgen.c +1305 -0
- data/ext/clipsruby/factgen.h +229 -0
- data/ext/clipsruby/facthsh.c +438 -0
- data/ext/clipsruby/facthsh.h +81 -0
- data/ext/clipsruby/factlhs.c +250 -0
- data/ext/clipsruby/factlhs.h +54 -0
- data/ext/clipsruby/factmch.c +905 -0
- data/ext/clipsruby/factmch.h +68 -0
- data/ext/clipsruby/factmngr.c +3373 -0
- data/ext/clipsruby/factmngr.h +325 -0
- data/ext/clipsruby/factprt.c +498 -0
- data/ext/clipsruby/factprt.h +60 -0
- data/ext/clipsruby/factqpsr.c +796 -0
- data/ext/clipsruby/factqpsr.h +61 -0
- data/ext/clipsruby/factqury.c +1267 -0
- data/ext/clipsruby/factqury.h +112 -0
- data/ext/clipsruby/factrete.c +978 -0
- data/ext/clipsruby/factrete.h +70 -0
- data/ext/clipsruby/factrhs.c +667 -0
- data/ext/clipsruby/factrhs.h +55 -0
- data/ext/clipsruby/filecom.c +353 -0
- data/ext/clipsruby/filecom.h +137 -0
- data/ext/clipsruby/filertr.c +481 -0
- data/ext/clipsruby/filertr.h +94 -0
- data/ext/clipsruby/fileutil.c +1020 -0
- data/ext/clipsruby/fileutil.h +50 -0
- data/ext/clipsruby/generate.c +1079 -0
- data/ext/clipsruby/generate.h +57 -0
- data/ext/clipsruby/genrcbin.c +902 -0
- data/ext/clipsruby/genrcbin.h +69 -0
- data/ext/clipsruby/genrccmp.c +640 -0
- data/ext/clipsruby/genrccmp.h +59 -0
- data/ext/clipsruby/genrccom.c +2017 -0
- data/ext/clipsruby/genrccom.h +119 -0
- data/ext/clipsruby/genrcexe.c +737 -0
- data/ext/clipsruby/genrcexe.h +73 -0
- data/ext/clipsruby/genrcfun.c +890 -0
- data/ext/clipsruby/genrcfun.h +185 -0
- data/ext/clipsruby/genrcpsr.c +1618 -0
- data/ext/clipsruby/genrcpsr.h +80 -0
- data/ext/clipsruby/globlbin.c +458 -0
- data/ext/clipsruby/globlbin.h +71 -0
- data/ext/clipsruby/globlbsc.c +361 -0
- data/ext/clipsruby/globlbsc.h +83 -0
- data/ext/clipsruby/globlcmp.c +330 -0
- data/ext/clipsruby/globlcmp.h +52 -0
- data/ext/clipsruby/globlcom.c +289 -0
- data/ext/clipsruby/globlcom.h +63 -0
- data/ext/clipsruby/globldef.c +1087 -0
- data/ext/clipsruby/globldef.h +151 -0
- data/ext/clipsruby/globlpsr.c +530 -0
- data/ext/clipsruby/globlpsr.h +59 -0
- data/ext/clipsruby/immthpsr.c +431 -0
- data/ext/clipsruby/immthpsr.h +55 -0
- data/ext/clipsruby/incrrset.c +530 -0
- data/ext/clipsruby/incrrset.h +73 -0
- data/ext/clipsruby/inherpsr.c +850 -0
- data/ext/clipsruby/inherpsr.h +52 -0
- data/ext/clipsruby/inscom.c +2076 -0
- data/ext/clipsruby/inscom.h +182 -0
- data/ext/clipsruby/insfile.c +1764 -0
- data/ext/clipsruby/insfile.h +96 -0
- data/ext/clipsruby/insfun.c +1451 -0
- data/ext/clipsruby/insfun.h +134 -0
- data/ext/clipsruby/insmngr.c +2550 -0
- data/ext/clipsruby/insmngr.h +125 -0
- data/ext/clipsruby/insmoddp.c +1041 -0
- data/ext/clipsruby/insmoddp.h +91 -0
- data/ext/clipsruby/insmult.c +804 -0
- data/ext/clipsruby/insmult.h +62 -0
- data/ext/clipsruby/inspsr.c +602 -0
- data/ext/clipsruby/inspsr.h +60 -0
- data/ext/clipsruby/insquery.c +1278 -0
- data/ext/clipsruby/insquery.h +115 -0
- data/ext/clipsruby/insqypsr.c +729 -0
- data/ext/clipsruby/insqypsr.h +63 -0
- data/ext/clipsruby/iofun.c +2045 -0
- data/ext/clipsruby/iofun.h +116 -0
- data/ext/clipsruby/lgcldpnd.c +644 -0
- data/ext/clipsruby/lgcldpnd.h +75 -0
- data/ext/clipsruby/main.c +112 -0
- data/ext/clipsruby/match.h +142 -0
- data/ext/clipsruby/memalloc.c +481 -0
- data/ext/clipsruby/memalloc.h +197 -0
- data/ext/clipsruby/miscfun.c +1801 -0
- data/ext/clipsruby/miscfun.h +132 -0
- data/ext/clipsruby/modulbin.c +607 -0
- data/ext/clipsruby/modulbin.h +84 -0
- data/ext/clipsruby/modulbsc.c +347 -0
- data/ext/clipsruby/modulbsc.h +67 -0
- data/ext/clipsruby/modulcmp.c +499 -0
- data/ext/clipsruby/modulcmp.h +54 -0
- data/ext/clipsruby/moduldef.c +817 -0
- data/ext/clipsruby/moduldef.h +271 -0
- data/ext/clipsruby/modulpsr.c +1150 -0
- data/ext/clipsruby/modulpsr.h +69 -0
- data/ext/clipsruby/modulutl.c +1036 -0
- data/ext/clipsruby/modulutl.h +84 -0
- data/ext/clipsruby/msgcom.c +1221 -0
- data/ext/clipsruby/msgcom.h +125 -0
- data/ext/clipsruby/msgfun.c +1076 -0
- data/ext/clipsruby/msgfun.h +118 -0
- data/ext/clipsruby/msgpass.c +1441 -0
- data/ext/clipsruby/msgpass.h +103 -0
- data/ext/clipsruby/msgpsr.c +698 -0
- data/ext/clipsruby/msgpsr.h +73 -0
- data/ext/clipsruby/multifld.c +1404 -0
- data/ext/clipsruby/multifld.h +130 -0
- data/ext/clipsruby/multifun.c +2182 -0
- data/ext/clipsruby/multifun.h +102 -0
- data/ext/clipsruby/network.h +142 -0
- data/ext/clipsruby/objbin.c +1522 -0
- data/ext/clipsruby/objbin.h +79 -0
- data/ext/clipsruby/objcmp.c +1507 -0
- data/ext/clipsruby/objcmp.h +71 -0
- data/ext/clipsruby/object.h +260 -0
- data/ext/clipsruby/objrtbin.c +701 -0
- data/ext/clipsruby/objrtbin.h +79 -0
- data/ext/clipsruby/objrtbld.c +2393 -0
- data/ext/clipsruby/objrtbld.h +66 -0
- data/ext/clipsruby/objrtcmp.c +734 -0
- data/ext/clipsruby/objrtcmp.h +66 -0
- data/ext/clipsruby/objrtfnx.c +1330 -0
- data/ext/clipsruby/objrtfnx.h +222 -0
- data/ext/clipsruby/objrtgen.c +736 -0
- data/ext/clipsruby/objrtgen.h +63 -0
- data/ext/clipsruby/objrtmch.c +1524 -0
- data/ext/clipsruby/objrtmch.h +160 -0
- data/ext/clipsruby/parsefun.c +415 -0
- data/ext/clipsruby/parsefun.h +67 -0
- data/ext/clipsruby/pattern.c +1265 -0
- data/ext/clipsruby/pattern.h +163 -0
- data/ext/clipsruby/pprint.c +328 -0
- data/ext/clipsruby/pprint.h +79 -0
- data/ext/clipsruby/prccode.c +1478 -0
- data/ext/clipsruby/prccode.h +145 -0
- data/ext/clipsruby/prcdrfun.c +640 -0
- data/ext/clipsruby/prcdrfun.h +95 -0
- data/ext/clipsruby/prcdrpsr.c +1068 -0
- data/ext/clipsruby/prcdrpsr.h +79 -0
- data/ext/clipsruby/prdctfun.c +869 -0
- data/ext/clipsruby/prdctfun.h +77 -0
- data/ext/clipsruby/prntutil.c +878 -0
- data/ext/clipsruby/prntutil.h +125 -0
- data/ext/clipsruby/proflfun.c +827 -0
- data/ext/clipsruby/proflfun.h +118 -0
- data/ext/clipsruby/reorder.c +2082 -0
- data/ext/clipsruby/reorder.h +172 -0
- data/ext/clipsruby/reteutil.c +1732 -0
- data/ext/clipsruby/reteutil.h +111 -0
- data/ext/clipsruby/retract.c +710 -0
- data/ext/clipsruby/retract.h +74 -0
- data/ext/clipsruby/router.c +737 -0
- data/ext/clipsruby/router.h +147 -0
- data/ext/clipsruby/rulebin.c +1136 -0
- data/ext/clipsruby/rulebin.h +153 -0
- data/ext/clipsruby/rulebld.c +1328 -0
- data/ext/clipsruby/rulebld.h +62 -0
- data/ext/clipsruby/rulebsc.c +517 -0
- data/ext/clipsruby/rulebsc.h +91 -0
- data/ext/clipsruby/rulecmp.c +733 -0
- data/ext/clipsruby/rulecmp.h +63 -0
- data/ext/clipsruby/rulecom.c +1583 -0
- data/ext/clipsruby/rulecom.h +116 -0
- data/ext/clipsruby/rulecstr.c +892 -0
- data/ext/clipsruby/rulecstr.h +53 -0
- data/ext/clipsruby/ruledef.c +559 -0
- data/ext/clipsruby/ruledef.h +179 -0
- data/ext/clipsruby/ruledlt.c +599 -0
- data/ext/clipsruby/ruledlt.h +58 -0
- data/ext/clipsruby/rulelhs.c +1216 -0
- data/ext/clipsruby/rulelhs.h +52 -0
- data/ext/clipsruby/rulepsr.c +1073 -0
- data/ext/clipsruby/rulepsr.h +61 -0
- data/ext/clipsruby/scanner.c +856 -0
- data/ext/clipsruby/scanner.h +112 -0
- data/ext/clipsruby/setup.h +488 -0
- data/ext/clipsruby/sortfun.c +433 -0
- data/ext/clipsruby/sortfun.h +55 -0
- data/ext/clipsruby/strngfun.c +1173 -0
- data/ext/clipsruby/strngfun.h +96 -0
- data/ext/clipsruby/strngrtr.c +523 -0
- data/ext/clipsruby/strngrtr.h +97 -0
- data/ext/clipsruby/symblbin.c +648 -0
- data/ext/clipsruby/symblbin.h +64 -0
- data/ext/clipsruby/symblcmp.c +893 -0
- data/ext/clipsruby/symblcmp.h +61 -0
- data/ext/clipsruby/symbol.c +1961 -0
- data/ext/clipsruby/symbol.h +243 -0
- data/ext/clipsruby/sysdep.c +894 -0
- data/ext/clipsruby/sysdep.h +164 -0
- data/ext/clipsruby/textpro.c +1388 -0
- data/ext/clipsruby/textpro.h +77 -0
- data/ext/clipsruby/tmpltbin.c +609 -0
- data/ext/clipsruby/tmpltbin.h +108 -0
- data/ext/clipsruby/tmpltbsc.c +327 -0
- data/ext/clipsruby/tmpltbsc.h +87 -0
- data/ext/clipsruby/tmpltcmp.c +450 -0
- data/ext/clipsruby/tmpltcmp.h +57 -0
- data/ext/clipsruby/tmpltdef.c +584 -0
- data/ext/clipsruby/tmpltdef.h +155 -0
- data/ext/clipsruby/tmpltfun.c +2477 -0
- data/ext/clipsruby/tmpltfun.h +122 -0
- data/ext/clipsruby/tmpltlhs.c +379 -0
- data/ext/clipsruby/tmpltlhs.h +50 -0
- data/ext/clipsruby/tmpltpsr.c +819 -0
- data/ext/clipsruby/tmpltpsr.h +59 -0
- data/ext/clipsruby/tmpltrhs.c +595 -0
- data/ext/clipsruby/tmpltrhs.h +55 -0
- data/ext/clipsruby/tmpltutl.c +637 -0
- data/ext/clipsruby/tmpltutl.h +82 -0
- data/ext/clipsruby/userdata.c +156 -0
- data/ext/clipsruby/userdata.h +72 -0
- data/ext/clipsruby/userfunctions.c +70 -0
- data/ext/clipsruby/usrsetup.h +7 -0
- data/ext/clipsruby/utility.c +1594 -0
- data/ext/clipsruby/utility.h +250 -0
- data/ext/clipsruby/watch.c +865 -0
- data/ext/clipsruby/watch.h +124 -0
- data/lib/clipsruby.rb +1 -0
- metadata +388 -0
@@ -0,0 +1,729 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 09/22/17 */
|
5
|
+
/* */
|
6
|
+
/* INSTANCE-SET QUERIES PARSER MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Instance_set Queries Parsing Routines */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Brian L. Dantes */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* */
|
17
|
+
/* */
|
18
|
+
/* Revision History: */
|
19
|
+
/* */
|
20
|
+
/* 6.23: Changed name of variable exp to theExp */
|
21
|
+
/* because of Unix compiler warnings of shadowed */
|
22
|
+
/* definitions. */
|
23
|
+
/* */
|
24
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
25
|
+
/* */
|
26
|
+
/* 6.30: Fixed memory leaks when error occurred. */
|
27
|
+
/* */
|
28
|
+
/* Changed integer type/precision. */
|
29
|
+
/* */
|
30
|
+
/* Support for long long integers. */
|
31
|
+
/* */
|
32
|
+
/* Added const qualifiers to remove C++ */
|
33
|
+
/* deprecation warnings. */
|
34
|
+
/* */
|
35
|
+
/* Added code to keep track of pointers to */
|
36
|
+
/* constructs that are contained externally to */
|
37
|
+
/* to constructs, DanglingConstructs. */
|
38
|
+
/* */
|
39
|
+
/* 6.31: Error check for non-symbolic slot names. */
|
40
|
+
/* */
|
41
|
+
/* 6.40: Pragma once and other inclusion changes. */
|
42
|
+
/* */
|
43
|
+
/* Added support for booleans with <stdbool.h>. */
|
44
|
+
/* */
|
45
|
+
/* Removed use of void pointers for specific */
|
46
|
+
/* data structures. */
|
47
|
+
/* */
|
48
|
+
/* Eval support for run time and bload only. */
|
49
|
+
/* */
|
50
|
+
/*************************************************************/
|
51
|
+
|
52
|
+
/* =========================================
|
53
|
+
*****************************************
|
54
|
+
EXTERNAL DEFINITIONS
|
55
|
+
=========================================
|
56
|
+
***************************************** */
|
57
|
+
#include "setup.h"
|
58
|
+
|
59
|
+
#if INSTANCE_SET_QUERIES
|
60
|
+
|
61
|
+
#include <string.h>
|
62
|
+
|
63
|
+
#include "classcom.h"
|
64
|
+
#include "envrnmnt.h"
|
65
|
+
#include "exprnpsr.h"
|
66
|
+
#include "insquery.h"
|
67
|
+
#include "prcdrpsr.h"
|
68
|
+
#include "pprint.h"
|
69
|
+
#include "prntutil.h"
|
70
|
+
#include "router.h"
|
71
|
+
#include "scanner.h"
|
72
|
+
#include "strngrtr.h"
|
73
|
+
|
74
|
+
#include "insqypsr.h"
|
75
|
+
|
76
|
+
/* =========================================
|
77
|
+
*****************************************
|
78
|
+
CONSTANTS
|
79
|
+
=========================================
|
80
|
+
***************************************** */
|
81
|
+
#define INSTANCE_SLOT_REF ':'
|
82
|
+
|
83
|
+
/***************************************/
|
84
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
85
|
+
/***************************************/
|
86
|
+
|
87
|
+
static Expression *ParseQueryRestrictions(Environment *,Expression *,const char *,struct token *);
|
88
|
+
static bool ReplaceClassNameWithReference(Environment *,Expression *);
|
89
|
+
static bool ParseQueryTestExpression(Environment *,Expression *,const char *);
|
90
|
+
static bool ParseQueryActionExpression(Environment *,Expression *,const char *,Expression *,struct token *);
|
91
|
+
static bool ReplaceInstanceVariables(Environment *,Expression *,Expression *,bool,int);
|
92
|
+
static bool ReplaceSlotReference(Environment *,Expression *,Expression *,
|
93
|
+
struct functionDefinition *,int);
|
94
|
+
static bool IsQueryFunction(Expression *);
|
95
|
+
|
96
|
+
/* =========================================
|
97
|
+
*****************************************
|
98
|
+
EXTERNALLY VISIBLE FUNCTIONS
|
99
|
+
=========================================
|
100
|
+
***************************************** */
|
101
|
+
|
102
|
+
/***********************************************************************
|
103
|
+
NAME : ParseQueryNoAction
|
104
|
+
DESCRIPTION : Parses the following functions :
|
105
|
+
(any-instancep)
|
106
|
+
(find-first-instance)
|
107
|
+
(find-all-instances)
|
108
|
+
INPUTS : 1) The address of the top node of the query function
|
109
|
+
2) The logical name of the input
|
110
|
+
RETURNS : The completed expression chain, or NULL on errors
|
111
|
+
SIDE EFFECTS : The expression chain is extended, or the "top" node
|
112
|
+
is deleted on errors
|
113
|
+
NOTES : H/L Syntax :
|
114
|
+
|
115
|
+
(<function> <query-block>)
|
116
|
+
|
117
|
+
<query-block> :== (<instance-var>+) <query-expression>
|
118
|
+
<instance-var> :== (<var-name> <class-name>+)
|
119
|
+
|
120
|
+
Parses into following form :
|
121
|
+
|
122
|
+
<query-function>
|
123
|
+
|
|
124
|
+
V
|
125
|
+
<query-expression> ->
|
126
|
+
|
127
|
+
<class-1a> -> <class-1b> -> (QDS) ->
|
128
|
+
|
129
|
+
<class-2a> -> <class-2b> -> (QDS) -> ...
|
130
|
+
***********************************************************************/
|
131
|
+
Expression *ParseQueryNoAction(
|
132
|
+
Environment *theEnv,
|
133
|
+
Expression *top,
|
134
|
+
const char *readSource)
|
135
|
+
{
|
136
|
+
Expression *insQuerySetVars;
|
137
|
+
struct token queryInputToken;
|
138
|
+
|
139
|
+
insQuerySetVars = ParseQueryRestrictions(theEnv,top,readSource,&queryInputToken);
|
140
|
+
if (insQuerySetVars == NULL)
|
141
|
+
return NULL;
|
142
|
+
IncrementIndentDepth(theEnv,3);
|
143
|
+
PPCRAndIndent(theEnv);
|
144
|
+
if (ParseQueryTestExpression(theEnv,top,readSource) == false)
|
145
|
+
{
|
146
|
+
DecrementIndentDepth(theEnv,3);
|
147
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
148
|
+
return NULL;
|
149
|
+
}
|
150
|
+
DecrementIndentDepth(theEnv,3);
|
151
|
+
GetToken(theEnv,readSource,&queryInputToken);
|
152
|
+
if (queryInputToken.tknType != RIGHT_PARENTHESIS_TOKEN)
|
153
|
+
{
|
154
|
+
SyntaxErrorMessage(theEnv,"instance-set query function");
|
155
|
+
ReturnExpression(theEnv,top);
|
156
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
157
|
+
return NULL;
|
158
|
+
}
|
159
|
+
|
160
|
+
if (ReplaceInstanceVariables(theEnv,insQuerySetVars,top->argList,true,0))
|
161
|
+
{
|
162
|
+
ReturnExpression(theEnv,top);
|
163
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
164
|
+
return NULL;
|
165
|
+
}
|
166
|
+
|
167
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
168
|
+
return top;
|
169
|
+
}
|
170
|
+
|
171
|
+
/***********************************************************************
|
172
|
+
NAME : ParseQueryAction
|
173
|
+
DESCRIPTION : Parses the following functions :
|
174
|
+
(do-for-instance)
|
175
|
+
(do-for-all-instances)
|
176
|
+
(delayed-do-for-all-instances)
|
177
|
+
INPUTS : 1) The address of the top node of the query function
|
178
|
+
2) The logical name of the input
|
179
|
+
RETURNS : The completed expression chain, or NULL on errors
|
180
|
+
SIDE EFFECTS : The expression chain is extended, or the "top" node
|
181
|
+
is deleted on errors
|
182
|
+
NOTES : H/L Syntax :
|
183
|
+
|
184
|
+
(<function> <query-block> <query-action>)
|
185
|
+
|
186
|
+
<query-block> :== (<instance-var>+) <query-expression>
|
187
|
+
<instance-var> :== (<var-name> <class-name>+)
|
188
|
+
|
189
|
+
Parses into following form :
|
190
|
+
|
191
|
+
<query-function>
|
192
|
+
|
|
193
|
+
V
|
194
|
+
<query-expression> -> <query-action> ->
|
195
|
+
|
196
|
+
<class-1a> -> <class-1b> -> (QDS) ->
|
197
|
+
|
198
|
+
<class-2a> -> <class-2b> -> (QDS) -> ...
|
199
|
+
***********************************************************************/
|
200
|
+
Expression *ParseQueryAction(
|
201
|
+
Environment *theEnv,
|
202
|
+
Expression *top,
|
203
|
+
const char *readSource)
|
204
|
+
{
|
205
|
+
Expression *insQuerySetVars;
|
206
|
+
struct token queryInputToken;
|
207
|
+
|
208
|
+
insQuerySetVars = ParseQueryRestrictions(theEnv,top,readSource,&queryInputToken);
|
209
|
+
if (insQuerySetVars == NULL)
|
210
|
+
return NULL;
|
211
|
+
IncrementIndentDepth(theEnv,3);
|
212
|
+
PPCRAndIndent(theEnv);
|
213
|
+
if (ParseQueryTestExpression(theEnv,top,readSource) == false)
|
214
|
+
{
|
215
|
+
DecrementIndentDepth(theEnv,3);
|
216
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
217
|
+
return NULL;
|
218
|
+
}
|
219
|
+
PPCRAndIndent(theEnv);
|
220
|
+
if (ParseQueryActionExpression(theEnv,top,readSource,insQuerySetVars,&queryInputToken) == false)
|
221
|
+
{
|
222
|
+
DecrementIndentDepth(theEnv,3);
|
223
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
224
|
+
return NULL;
|
225
|
+
}
|
226
|
+
DecrementIndentDepth(theEnv,3);
|
227
|
+
|
228
|
+
if (queryInputToken.tknType != RIGHT_PARENTHESIS_TOKEN)
|
229
|
+
{
|
230
|
+
SyntaxErrorMessage(theEnv,"instance-set query function");
|
231
|
+
ReturnExpression(theEnv,top);
|
232
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
233
|
+
return NULL;
|
234
|
+
}
|
235
|
+
|
236
|
+
if (ReplaceInstanceVariables(theEnv,insQuerySetVars,top->argList,true,0))
|
237
|
+
{
|
238
|
+
ReturnExpression(theEnv,top);
|
239
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
240
|
+
return NULL;
|
241
|
+
}
|
242
|
+
|
243
|
+
if (ReplaceInstanceVariables(theEnv,insQuerySetVars,top->argList->nextArg,false,0))
|
244
|
+
{
|
245
|
+
ReturnExpression(theEnv,top);
|
246
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
247
|
+
return NULL;
|
248
|
+
}
|
249
|
+
|
250
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
251
|
+
|
252
|
+
return top;
|
253
|
+
}
|
254
|
+
|
255
|
+
/* =========================================
|
256
|
+
*****************************************
|
257
|
+
INTERNALLY VISIBLE FUNCTIONS
|
258
|
+
=========================================
|
259
|
+
***************************************** */
|
260
|
+
|
261
|
+
/***************************************************************
|
262
|
+
NAME : ParseQueryRestrictions
|
263
|
+
DESCRIPTION : Parses the class restrictions for a query
|
264
|
+
INPUTS : 1) The top node of the query expression
|
265
|
+
2) The logical name of the input
|
266
|
+
3) Caller's token buffer
|
267
|
+
RETURNS : The instance-variable expressions
|
268
|
+
SIDE EFFECTS : Entire query expression deleted on errors
|
269
|
+
Nodes allocated for restrictions and instance
|
270
|
+
variable expressions
|
271
|
+
Class restrictions attached to query-expression
|
272
|
+
as arguments
|
273
|
+
NOTES : Expects top != NULL
|
274
|
+
***************************************************************/
|
275
|
+
static Expression *ParseQueryRestrictions(
|
276
|
+
Environment *theEnv,
|
277
|
+
Expression *top,
|
278
|
+
const char *readSource,
|
279
|
+
struct token *queryInputToken)
|
280
|
+
{
|
281
|
+
Expression *insQuerySetVars = NULL,*lastInsQuerySetVars = NULL,
|
282
|
+
*classExp = NULL,*lastClassExp,
|
283
|
+
*tmp,*lastOne = NULL;
|
284
|
+
bool error = false;
|
285
|
+
|
286
|
+
SavePPBuffer(theEnv," ");
|
287
|
+
GetToken(theEnv,readSource,queryInputToken);
|
288
|
+
if (queryInputToken->tknType != LEFT_PARENTHESIS_TOKEN)
|
289
|
+
goto ParseQueryRestrictionsError1;
|
290
|
+
GetToken(theEnv,readSource,queryInputToken);
|
291
|
+
if (queryInputToken->tknType != LEFT_PARENTHESIS_TOKEN)
|
292
|
+
goto ParseQueryRestrictionsError1;
|
293
|
+
while (queryInputToken->tknType == LEFT_PARENTHESIS_TOKEN)
|
294
|
+
{
|
295
|
+
GetToken(theEnv,readSource,queryInputToken);
|
296
|
+
if (queryInputToken->tknType != SF_VARIABLE_TOKEN)
|
297
|
+
goto ParseQueryRestrictionsError1;
|
298
|
+
tmp = insQuerySetVars;
|
299
|
+
while (tmp != NULL)
|
300
|
+
{
|
301
|
+
if (tmp->value == queryInputToken->value)
|
302
|
+
{
|
303
|
+
PrintErrorID(theEnv,"INSQYPSR",1,false);
|
304
|
+
WriteString(theEnv,STDERR,"Duplicate instance member variable name in function '");
|
305
|
+
WriteString(theEnv,STDERR,ExpressionFunctionCallName(top)->contents);
|
306
|
+
WriteString(theEnv,STDERR,"'.\n");
|
307
|
+
goto ParseQueryRestrictionsError2;
|
308
|
+
}
|
309
|
+
tmp = tmp->nextArg;
|
310
|
+
}
|
311
|
+
tmp = GenConstant(theEnv,SF_VARIABLE,queryInputToken->value);
|
312
|
+
if (insQuerySetVars == NULL)
|
313
|
+
insQuerySetVars = tmp;
|
314
|
+
else
|
315
|
+
lastInsQuerySetVars->nextArg = tmp;
|
316
|
+
lastInsQuerySetVars = tmp;
|
317
|
+
SavePPBuffer(theEnv," ");
|
318
|
+
classExp = ArgumentParse(theEnv,readSource,&error);
|
319
|
+
if (error)
|
320
|
+
goto ParseQueryRestrictionsError2;
|
321
|
+
if (classExp == NULL)
|
322
|
+
goto ParseQueryRestrictionsError1;
|
323
|
+
if (ReplaceClassNameWithReference(theEnv,classExp) == false)
|
324
|
+
goto ParseQueryRestrictionsError2;
|
325
|
+
lastClassExp = classExp;
|
326
|
+
SavePPBuffer(theEnv," ");
|
327
|
+
while ((tmp = ArgumentParse(theEnv,readSource,&error)) != NULL)
|
328
|
+
{
|
329
|
+
if (ReplaceClassNameWithReference(theEnv,tmp) == false)
|
330
|
+
goto ParseQueryRestrictionsError2;
|
331
|
+
lastClassExp->nextArg = tmp;
|
332
|
+
lastClassExp = tmp;
|
333
|
+
SavePPBuffer(theEnv," ");
|
334
|
+
}
|
335
|
+
if (error)
|
336
|
+
goto ParseQueryRestrictionsError2;
|
337
|
+
PPBackup(theEnv);
|
338
|
+
PPBackup(theEnv);
|
339
|
+
SavePPBuffer(theEnv,")");
|
340
|
+
tmp = GenConstant(theEnv,SYMBOL_TYPE,InstanceQueryData(theEnv)->QUERY_DELIMITER_SYMBOL);
|
341
|
+
lastClassExp->nextArg = tmp;
|
342
|
+
lastClassExp = tmp;
|
343
|
+
if (top->argList == NULL)
|
344
|
+
top->argList = classExp;
|
345
|
+
else
|
346
|
+
lastOne->nextArg = classExp;
|
347
|
+
lastOne = lastClassExp;
|
348
|
+
classExp = NULL;
|
349
|
+
SavePPBuffer(theEnv," ");
|
350
|
+
GetToken(theEnv,readSource,queryInputToken);
|
351
|
+
}
|
352
|
+
if (queryInputToken->tknType != RIGHT_PARENTHESIS_TOKEN)
|
353
|
+
goto ParseQueryRestrictionsError1;
|
354
|
+
PPBackup(theEnv);
|
355
|
+
PPBackup(theEnv);
|
356
|
+
SavePPBuffer(theEnv,")");
|
357
|
+
return(insQuerySetVars);
|
358
|
+
|
359
|
+
ParseQueryRestrictionsError1:
|
360
|
+
SyntaxErrorMessage(theEnv,"instance-set query function");
|
361
|
+
|
362
|
+
ParseQueryRestrictionsError2:
|
363
|
+
ReturnExpression(theEnv,classExp);
|
364
|
+
ReturnExpression(theEnv,top);
|
365
|
+
ReturnExpression(theEnv,insQuerySetVars);
|
366
|
+
return NULL;
|
367
|
+
}
|
368
|
+
|
369
|
+
/***************************************************
|
370
|
+
NAME : ReplaceClassNameWithReference
|
371
|
+
DESCRIPTION : In parsing an instance-set query,
|
372
|
+
this function replaces a constant
|
373
|
+
class name with an actual pointer
|
374
|
+
to the class
|
375
|
+
INPUTS : The expression
|
376
|
+
RETURNS : True if all OK, false
|
377
|
+
if class cannot be found
|
378
|
+
SIDE EFFECTS : The expression type and value are
|
379
|
+
modified if class is found
|
380
|
+
NOTES : Searches current and imported
|
381
|
+
modules for reference
|
382
|
+
***************************************************/
|
383
|
+
static bool ReplaceClassNameWithReference(
|
384
|
+
Environment *theEnv,
|
385
|
+
Expression *theExp)
|
386
|
+
{
|
387
|
+
const char *theClassName;
|
388
|
+
Defclass *theDefclass;
|
389
|
+
|
390
|
+
if (theExp->type == SYMBOL_TYPE)
|
391
|
+
{
|
392
|
+
theClassName = theExp->lexemeValue->contents;
|
393
|
+
theDefclass = LookupDefclassByMdlOrScope(theEnv,theClassName);
|
394
|
+
if (theDefclass == NULL)
|
395
|
+
{
|
396
|
+
CantFindItemErrorMessage(theEnv,"class",theClassName,true);
|
397
|
+
return false;
|
398
|
+
}
|
399
|
+
theExp->type = DEFCLASS_PTR;
|
400
|
+
theExp->value = theDefclass;
|
401
|
+
|
402
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
403
|
+
if (! ConstructData(theEnv)->ParsingConstruct)
|
404
|
+
{ ConstructData(theEnv)->DanglingConstructs++; }
|
405
|
+
#endif
|
406
|
+
}
|
407
|
+
return true;
|
408
|
+
}
|
409
|
+
|
410
|
+
/*************************************************************
|
411
|
+
NAME : ParseQueryTestExpression
|
412
|
+
DESCRIPTION : Parses the test-expression for a query
|
413
|
+
INPUTS : 1) The top node of the query expression
|
414
|
+
2) The logical name of the input
|
415
|
+
RETURNS : True if all OK, false otherwise
|
416
|
+
SIDE EFFECTS : Entire query-expression deleted on errors
|
417
|
+
Nodes allocated for new expression
|
418
|
+
Test shoved in front of class-restrictions on
|
419
|
+
query argument list
|
420
|
+
NOTES : Expects top != NULL
|
421
|
+
*************************************************************/
|
422
|
+
static bool ParseQueryTestExpression(
|
423
|
+
Environment *theEnv,
|
424
|
+
Expression *top,
|
425
|
+
const char *readSource)
|
426
|
+
{
|
427
|
+
Expression *qtest;
|
428
|
+
bool error;
|
429
|
+
struct BindInfo *oldBindList;
|
430
|
+
|
431
|
+
error = false;
|
432
|
+
oldBindList = GetParsedBindNames(theEnv);
|
433
|
+
SetParsedBindNames(theEnv,NULL);
|
434
|
+
qtest = ArgumentParse(theEnv,readSource,&error);
|
435
|
+
if (error == true)
|
436
|
+
{
|
437
|
+
ClearParsedBindNames(theEnv);
|
438
|
+
SetParsedBindNames(theEnv,oldBindList);
|
439
|
+
ReturnExpression(theEnv,top);
|
440
|
+
return false;
|
441
|
+
}
|
442
|
+
if (qtest == NULL)
|
443
|
+
{
|
444
|
+
ClearParsedBindNames(theEnv);
|
445
|
+
SetParsedBindNames(theEnv,oldBindList);
|
446
|
+
SyntaxErrorMessage(theEnv,"instance-set query function");
|
447
|
+
ReturnExpression(theEnv,top);
|
448
|
+
return false;
|
449
|
+
}
|
450
|
+
qtest->nextArg = top->argList;
|
451
|
+
top->argList = qtest;
|
452
|
+
if (ParsedBindNamesEmpty(theEnv) == false)
|
453
|
+
{
|
454
|
+
ClearParsedBindNames(theEnv);
|
455
|
+
SetParsedBindNames(theEnv,oldBindList);
|
456
|
+
PrintErrorID(theEnv,"INSQYPSR",2,false);
|
457
|
+
WriteString(theEnv,STDERR,"Binds are not allowed in instance-set query in function '");
|
458
|
+
WriteString(theEnv,STDERR,ExpressionFunctionCallName(top)->contents);
|
459
|
+
WriteString(theEnv,STDERR,"'.\n");
|
460
|
+
ReturnExpression(theEnv,top);
|
461
|
+
return false;
|
462
|
+
}
|
463
|
+
SetParsedBindNames(theEnv,oldBindList);
|
464
|
+
return true;
|
465
|
+
}
|
466
|
+
|
467
|
+
/*************************************************************
|
468
|
+
NAME : ParseQueryActionExpression
|
469
|
+
DESCRIPTION : Parses the action-expression for a query
|
470
|
+
INPUTS : 1) The top node of the query expression
|
471
|
+
2) The logical name of the input
|
472
|
+
3) List of query parameters
|
473
|
+
RETURNS : True if all OK, false otherwise
|
474
|
+
SIDE EFFECTS : Entire query-expression deleted on errors
|
475
|
+
Nodes allocated for new expression
|
476
|
+
Action shoved in front of class-restrictions
|
477
|
+
and in back of test-expression on query
|
478
|
+
argument list
|
479
|
+
NOTES : Expects top != NULL && top->argList != NULL
|
480
|
+
*************************************************************/
|
481
|
+
static bool ParseQueryActionExpression(
|
482
|
+
Environment *theEnv,
|
483
|
+
Expression *top,
|
484
|
+
const char *readSource,
|
485
|
+
Expression *insQuerySetVars,
|
486
|
+
struct token *queryInputToken)
|
487
|
+
{
|
488
|
+
Expression *qaction, *tmpInsSetVars;
|
489
|
+
struct BindInfo *oldBindList,*newBindList,*prev;
|
490
|
+
|
491
|
+
oldBindList = GetParsedBindNames(theEnv);
|
492
|
+
SetParsedBindNames(theEnv,NULL);
|
493
|
+
ExpressionData(theEnv)->BreakContext = true;
|
494
|
+
ExpressionData(theEnv)->ReturnContext = ExpressionData(theEnv)->svContexts->rtn;
|
495
|
+
|
496
|
+
qaction = GroupActions(theEnv,readSource,queryInputToken,true,NULL,false);
|
497
|
+
PPBackup(theEnv);
|
498
|
+
PPBackup(theEnv);
|
499
|
+
SavePPBuffer(theEnv,queryInputToken->printForm);
|
500
|
+
|
501
|
+
ExpressionData(theEnv)->BreakContext = false;
|
502
|
+
if (qaction == NULL)
|
503
|
+
{
|
504
|
+
ClearParsedBindNames(theEnv);
|
505
|
+
SetParsedBindNames(theEnv,oldBindList);
|
506
|
+
SyntaxErrorMessage(theEnv,"instance-set query function");
|
507
|
+
ReturnExpression(theEnv,top);
|
508
|
+
return false;
|
509
|
+
}
|
510
|
+
qaction->nextArg = top->argList->nextArg;
|
511
|
+
top->argList->nextArg = qaction;
|
512
|
+
newBindList = GetParsedBindNames(theEnv);
|
513
|
+
prev = NULL;
|
514
|
+
while (newBindList != NULL)
|
515
|
+
{
|
516
|
+
tmpInsSetVars = insQuerySetVars;
|
517
|
+
while (tmpInsSetVars != NULL)
|
518
|
+
{
|
519
|
+
if (tmpInsSetVars->value == (void *) newBindList->name)
|
520
|
+
{
|
521
|
+
ClearParsedBindNames(theEnv);
|
522
|
+
SetParsedBindNames(theEnv,oldBindList);
|
523
|
+
PrintErrorID(theEnv,"INSQYPSR",3,false);
|
524
|
+
WriteString(theEnv,STDERR,"Cannot rebind instance-set member variable ?");
|
525
|
+
WriteString(theEnv,STDERR,tmpInsSetVars->lexemeValue->contents);
|
526
|
+
WriteString(theEnv,STDERR," in function '");
|
527
|
+
WriteString(theEnv,STDERR,ExpressionFunctionCallName(top)->contents);
|
528
|
+
WriteString(theEnv,STDERR,"'.\n");
|
529
|
+
ReturnExpression(theEnv,top);
|
530
|
+
return false;
|
531
|
+
}
|
532
|
+
tmpInsSetVars = tmpInsSetVars->nextArg;
|
533
|
+
}
|
534
|
+
prev = newBindList;
|
535
|
+
newBindList = newBindList->next;
|
536
|
+
}
|
537
|
+
if (prev == NULL)
|
538
|
+
SetParsedBindNames(theEnv,oldBindList);
|
539
|
+
else
|
540
|
+
prev->next = oldBindList;
|
541
|
+
return true;
|
542
|
+
}
|
543
|
+
|
544
|
+
/***********************************************************************************
|
545
|
+
NAME : ReplaceInstanceVariables
|
546
|
+
DESCRIPTION : Replaces all references to instance-variables within an
|
547
|
+
instance query-function with function calls to query-instance
|
548
|
+
(which references the instance array at run-time)
|
549
|
+
INPUTS : 1) The instance-variable list
|
550
|
+
2) A boolean expression containing variable references
|
551
|
+
3) A flag indicating whether to allow slot references of the type
|
552
|
+
<instance-query-variable>:<slot-name> for direct slot access
|
553
|
+
or not
|
554
|
+
4) Nesting depth of query functions
|
555
|
+
RETURNS : Nothing useful
|
556
|
+
SIDE EFFECTS : If a SF_VARIABLE node is found and is on the list of instance
|
557
|
+
variables, it is replaced with a query-instance function call.
|
558
|
+
NOTES : Other SF_VARIABLE(S) are left alone for replacement by other
|
559
|
+
parsers. This implies that a user may use defgeneric,
|
560
|
+
defrule, and defmessage-handler variables within a query-function
|
561
|
+
where they do not conflict with instance-variable names.
|
562
|
+
***********************************************************************************/
|
563
|
+
static bool ReplaceInstanceVariables(
|
564
|
+
Environment *theEnv,
|
565
|
+
Expression *vlist,
|
566
|
+
Expression *bexp,
|
567
|
+
bool sdirect,
|
568
|
+
int ndepth)
|
569
|
+
{
|
570
|
+
Expression *eptr;
|
571
|
+
struct functionDefinition *rindx_func,*rslot_func;
|
572
|
+
int posn;
|
573
|
+
|
574
|
+
rindx_func = FindFunction(theEnv,"(query-instance)");
|
575
|
+
rslot_func = FindFunction(theEnv,"(query-instance-slot)");
|
576
|
+
while (bexp != NULL)
|
577
|
+
{
|
578
|
+
if (bexp->type == SF_VARIABLE)
|
579
|
+
{
|
580
|
+
eptr = vlist;
|
581
|
+
posn = 0;
|
582
|
+
while ((eptr != NULL) ? (eptr->value != bexp->value) : false)
|
583
|
+
{
|
584
|
+
eptr = eptr->nextArg;
|
585
|
+
posn++;
|
586
|
+
}
|
587
|
+
if (eptr != NULL)
|
588
|
+
{
|
589
|
+
bexp->type = FCALL;
|
590
|
+
bexp->value = rindx_func;
|
591
|
+
eptr = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,ndepth));
|
592
|
+
eptr->nextArg = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,posn));
|
593
|
+
bexp->argList = eptr;
|
594
|
+
}
|
595
|
+
else if (sdirect == true)
|
596
|
+
{
|
597
|
+
if (ReplaceSlotReference(theEnv,vlist,bexp,rslot_func,ndepth))
|
598
|
+
{ return true; }
|
599
|
+
}
|
600
|
+
}
|
601
|
+
if (bexp->argList != NULL)
|
602
|
+
{
|
603
|
+
if (IsQueryFunction(bexp))
|
604
|
+
{
|
605
|
+
if (ReplaceInstanceVariables(theEnv,vlist,bexp->argList,sdirect,ndepth+1))
|
606
|
+
{ return true; }
|
607
|
+
}
|
608
|
+
else
|
609
|
+
{
|
610
|
+
if (ReplaceInstanceVariables(theEnv,vlist,bexp->argList,sdirect,ndepth))
|
611
|
+
{ return true; }
|
612
|
+
}
|
613
|
+
}
|
614
|
+
bexp = bexp->nextArg;
|
615
|
+
}
|
616
|
+
|
617
|
+
return false;
|
618
|
+
}
|
619
|
+
|
620
|
+
/*************************************************************************
|
621
|
+
NAME : ReplaceSlotReference
|
622
|
+
DESCRIPTION : Replaces instance-set query function variable
|
623
|
+
references of the form: <instance-variable>:<slot-name>
|
624
|
+
with function calls to get these instance-slots at run
|
625
|
+
time
|
626
|
+
INPUTS : 1) The instance-set variable list
|
627
|
+
2) The expression containing the variable
|
628
|
+
3) The address of the instance slot access function
|
629
|
+
4) Nesting depth of query functions
|
630
|
+
RETURNS : Nothing useful
|
631
|
+
SIDE EFFECTS : If the variable is a slot reference, then it is replaced
|
632
|
+
with the appropriate function-call.
|
633
|
+
NOTES : None
|
634
|
+
*************************************************************************/
|
635
|
+
static bool ReplaceSlotReference(
|
636
|
+
Environment *theEnv,
|
637
|
+
Expression *vlist,
|
638
|
+
Expression *theExp,
|
639
|
+
struct functionDefinition *func,
|
640
|
+
int ndepth)
|
641
|
+
{
|
642
|
+
size_t len;
|
643
|
+
int posn;
|
644
|
+
bool oldpp;
|
645
|
+
size_t i;
|
646
|
+
const char *str;
|
647
|
+
Expression *eptr;
|
648
|
+
struct token itkn;
|
649
|
+
|
650
|
+
str = theExp->lexemeValue->contents;
|
651
|
+
len = strlen(str);
|
652
|
+
if (len < 3)
|
653
|
+
{ return false; }
|
654
|
+
|
655
|
+
for (i = len-2 ; i >= 1 ; i--)
|
656
|
+
{
|
657
|
+
if ((str[i] == INSTANCE_SLOT_REF) ? (i >= 1) : false)
|
658
|
+
{
|
659
|
+
eptr = vlist;
|
660
|
+
posn = 0;
|
661
|
+
while (eptr && ((i != strlen(eptr->lexemeValue->contents)) ||
|
662
|
+
strncmp(eptr->lexemeValue->contents,str,
|
663
|
+
(STD_SIZE) i)))
|
664
|
+
{
|
665
|
+
eptr = eptr->nextArg;
|
666
|
+
posn++;
|
667
|
+
}
|
668
|
+
if (eptr != NULL)
|
669
|
+
{
|
670
|
+
OpenStringSource(theEnv,"query-var",str+i+1,0);
|
671
|
+
oldpp = GetPPBufferStatus(theEnv);
|
672
|
+
SetPPBufferStatus(theEnv,false);
|
673
|
+
GetToken(theEnv,"query-var",&itkn);
|
674
|
+
SetPPBufferStatus(theEnv,oldpp);
|
675
|
+
CloseStringSource(theEnv,"query-var");
|
676
|
+
|
677
|
+
if (itkn.tknType != SYMBOL_TOKEN)
|
678
|
+
{
|
679
|
+
InvalidVarSlotErrorMessage(theEnv,str);
|
680
|
+
SetEvaluationError(theEnv,true);
|
681
|
+
return true;
|
682
|
+
}
|
683
|
+
|
684
|
+
theExp->type = FCALL;
|
685
|
+
theExp->value = func;
|
686
|
+
theExp->argList = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,ndepth));
|
687
|
+
theExp->argList->nextArg = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,posn));
|
688
|
+
theExp->argList->nextArg->nextArg = GenConstant(theEnv,TokenTypeToType(itkn.tknType),itkn.value);
|
689
|
+
theExp->argList->nextArg->nextArg->nextArg = GenConstant(theEnv,SYMBOL_TYPE,CreateSymbol(theEnv,str));
|
690
|
+
return false;
|
691
|
+
}
|
692
|
+
}
|
693
|
+
}
|
694
|
+
|
695
|
+
return false;
|
696
|
+
}
|
697
|
+
|
698
|
+
/********************************************************************
|
699
|
+
NAME : IsQueryFunction
|
700
|
+
DESCRIPTION : Determines if an expression is a query function call
|
701
|
+
INPUTS : The expression
|
702
|
+
RETURNS : True if query function call, false otherwise
|
703
|
+
SIDE EFFECTS : None
|
704
|
+
NOTES : None
|
705
|
+
********************************************************************/
|
706
|
+
static bool IsQueryFunction(
|
707
|
+
Expression *theExp)
|
708
|
+
{
|
709
|
+
int (*fptr)(void);
|
710
|
+
|
711
|
+
if (theExp->type != FCALL)
|
712
|
+
return false;
|
713
|
+
fptr = (int (*)(void)) ExpressionFunctionPointer(theExp);
|
714
|
+
if (fptr == (int (*)(void)) AnyInstances)
|
715
|
+
return true;
|
716
|
+
if (fptr == (int (*)(void)) QueryFindInstance)
|
717
|
+
return true;
|
718
|
+
if (fptr == (int (*)(void)) QueryFindAllInstances)
|
719
|
+
return true;
|
720
|
+
if (fptr == (int (*)(void)) QueryDoForInstance)
|
721
|
+
return true;
|
722
|
+
if (fptr == (int (*)(void)) QueryDoForAllInstances)
|
723
|
+
return true;
|
724
|
+
if (fptr == (int (*)(void)) DelayedQueryDoForAllInstances)
|
725
|
+
return true;
|
726
|
+
return false;
|
727
|
+
}
|
728
|
+
|
729
|
+
#endif
|