00001
00013 #ifndef NEWTPARSE_H
00014 #define NEWTPARSE_H
00015
00016
00017 #include <stdio.h>
00018
00019 #include "NewtType.h"
00020 #include "NewtConf.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #define kNPSSyntaxNodeMask 0x0000000e
00034
00035 #define NPSRefIsSyntaxNode(r) ((r & 0x0000000f) == kNPSSyntaxNodeMask)
00036 #define NPSRefToSyntaxNode(r) ((uint32_t)r >> 4)
00037 #define NPSMakeSyntaxNode(v) ((v << 4) | kNPSSyntaxNodeMask)
00038
00039
00040
00041
00043 enum {
00044 kNPS_NOT = 256,
00045 kNPS_DIV,
00046 kNPS_MOD,
00047 kNPS_SHIFT_LEFT,
00048 kNPS_SHIFT_RIGHT,
00049 kNPS_NOT_EQUAL,
00050 kNPS_GREATER_EQUAL,
00051 kNPS_LESS_EQUAL,
00052 kNPS_OBJECT_EQUAL,
00053 kNPS_CONCAT2,
00054 };
00055
00057 enum {
00058 kNPSPop = 000,
00059 kNPSDup = 001,
00060 kNPSReturn = 002,
00061 kNPSPushSelf = 003,
00062 kNPSSetLexScope = 004,
00063 kNPSIterNext = 005,
00064 kNPSIterDone = 006,
00065 kNPSPopHandlers = 007,
00066
00067 kNPSPush = 0030,
00068 kNPSPushConstant = 0040,
00069 kNPSCall = 0050,
00070 kNPSInvoke = 0060,
00071 kNPSSend = 0070,
00072 kNPSSendIfDefined = 0100,
00073 kNPSResend = 0110,
00074 kNPSResendIfDefined = 0120,
00075 kNPSBranch = 0130,
00076 kNPSBranchIfTrue = 0140,
00077 kNPSBranchIfFalse = 0150,
00078 kNPSFindVar = 0160,
00079 kNPSGetVar = 0170,
00080 kNPSMakeFrame = 0200,
00081 kNPSMakeArray = 0210,
00082 kNPSGetPath = 0220,
00083 kNPSSetPath = 0230,
00084 kNPSSetVar = 0240,
00085 kNPSFindAndSetVar = 0250,
00086 kNPSIncrVar = 0260,
00087 kNPSBranchIfLoopNotDone = 0270,
00088 kNPSFreqFunc = 0300,
00089 kNPSNewHandlers = 0310,
00090
00091
00092 kNPSAdd = 03000,
00093 kNPSSubtract,
00094 kNPSAref,
00095 kNPSSetAref,
00096 kNPSEquals,
00097 kNPSNot,
00098 kNPSNotEqual,
00099 kNPSMultiply,
00100 kNPSDivide,
00101 kNPSDiv,
00102 kNPSLessThan,
00103 kNPSGreaterThan,
00104 kNPSGreaterOrEqual,
00105 kNPSLessOrEqual,
00106 kNPSBitAnd,
00107 kNPSBitOr,
00108 kNPSBitNot,
00109 kNPSNewIterator,
00110 kNPSLength,
00111 kNPSClone,
00112 kNPSSetClass,
00113 kNPSAddArraySlot,
00114 kNPSStringer,
00115 kNPSHasPath,
00116 kNPSClassOf,
00117
00118
00119 kNPSConstituentList = 04000,
00120 kNPSCommaList,
00121 kNPSConstant,
00122 kNPSGlobal,
00123 kNPSLocal,
00124 kNPSGlobalFn,
00125 kNPSFunc,
00126 kNPSArg,
00127 kNPSIndefinite,
00128 kNPSMessage,
00129 kNPSLvalue,
00130 kNPSAsign,
00131 kNPSExists,
00132 kNPSMethodExists,
00133 kNPSTry,
00134 kNPSOnexception,
00135 kNPSOnexceptionList,
00136 kNPSIf,
00137 kNPSLoop,
00138 kNPSFor,
00139 kNPSForeach,
00140 kNPSWhile,
00141 kNPSRepeat,
00142 kNPSBreak,
00143 kNPSSlot,
00144 kNPSConcat,
00145 kNPSConcat2,
00146 kNPSAnd,
00147 kNPSOr,
00148
00149
00150 kNPSMod,
00151 kNPSShiftLeft,
00152 kNPSShiftRight,
00153
00154
00155 kNPSObjectEqual,
00156 kNPSMakeRegex,
00157
00158
00159 KNPSUnknownCode = 0xffffffff
00160 };
00161
00162
00164 enum {
00165 kNPSKindNone,
00166 kNPSKindLink,
00167 kNPSKindObject
00168 };
00169
00170
00171
00172
00174 typedef newtRef nps_node_t;
00175
00176
00178 typedef struct {
00179 uint32_t code;
00180 nps_node_t op1;
00181 nps_node_t op2;
00182 } nps_syntax_node_t;
00183
00184
00186 typedef struct {
00187 bool first_time;
00188
00189 uint16_t numwarns;
00190 uint16_t numerrs;
00191
00192 const char * fname;
00193 uint32_t lineno;
00194 uint32_t tokenpos;
00195 uint16_t yyleng;
00196 char linebuf[NEWT_LEX_LINEBUFFSIZE];
00197 } nps_env_t;
00198
00199
00200
00201 extern nps_env_t nps_env;
00202
00203
00204
00205
00206 #ifdef __cplusplus
00207 extern "C" {
00208 #endif
00209
00210
00211 int nps_yyinput(FILE * yyin, char * buff, int max_size);
00212 void nps_yyinit(void);
00213 int nps_yycleanup(void);
00214
00215
00216 newtErr NPSParse(const char * path, nps_syntax_node_t ** streeP, uint32_t * sizeP, bool is_file);
00217
00218 newtErr NPSParseFile(const char * path,
00219 nps_syntax_node_t ** streeP, uint32_t * sizeP);
00220
00221 newtErr NPSParseStr(const char * s,
00222 nps_syntax_node_t ** streeP, uint32_t * sizeP);
00223
00224 void NPSCleanup(void);
00225 void NPSDumpSyntaxTree(FILE * f, nps_syntax_node_t * stree, uint32_t size);
00226
00227
00228
00229 nps_node_t NPSGenNode0(uint32_t code);
00230 nps_node_t NPSGenNode1(uint32_t code, nps_node_t op1);
00231 nps_node_t NPSGenNode2(uint32_t code, nps_node_t op1, nps_node_t op2);
00232
00233 nps_node_t NPSGenOP1(uint32_t op, nps_node_t op1);
00234 nps_node_t NPSGenOP2(uint32_t op, nps_node_t op1, nps_node_t op2);
00235
00236 nps_node_t NPSGenSend(nps_node_t receiver,
00237 uint32_t op, nps_node_t msg, nps_node_t args);
00238 nps_node_t NPSGenResend(uint32_t op, nps_node_t msg, nps_node_t args);
00239
00240 nps_node_t NPSGenIfThenElse(nps_node_t cond, nps_node_t ifthen, nps_node_t ifelse);
00241 nps_node_t NPSGenForLoop(nps_node_t index, nps_node_t v,
00242 nps_node_t to, nps_node_t by, nps_node_t expr);
00243 nps_node_t NPSGenForeach(nps_node_t index, nps_node_t val, nps_node_t obj,
00244 nps_node_t deeply, nps_node_t op, nps_node_t expr);
00245 nps_node_t NPSGenGlobalFn(nps_node_t name, nps_node_t args, nps_node_t expr);
00246
00247 newtRef NPSMakePathExpr(newtRefArg sym1, newtRefArg sym2);
00248 newtRef NPSMakeArray(newtRefArg v);
00249 newtRef NPSAddArraySlot(newtRefArg r, newtRefArg v);
00250 newtRef NPSInsertArraySlot(newtRefArg r, uint32_t p, newtRefArg v);
00251
00252 newtRef NPSMakeMap(newtRefArg v);
00253 newtRef NPSMakeFrame(newtRefArg slot, newtRefArg v);
00254 newtRef NPSSetSlot(newtRefArg r, newtRefArg slot, newtRefArg v);
00255
00256 newtRef NPSMakeBinary(newtRefArg v);
00257 newtRef NPSAddARef(newtRefArg r, newtRefArg v);
00258
00259 void NPSErrorStr(char c, char * s);
00260 void NPSError(int32_t err);
00261
00262
00263 #ifdef __cplusplus
00264 }
00265 #endif
00266
00267
00268 #endif
00269