TOK_ASSIGN, TOK_LT, TOK_LTE, TOK_EQ, TOK_NEQ, TOK_GT, TOK_GTE,
TOK_IF, TOK_ELSIF, TOK_ELSE, TOK_FOR, TOK_FOREACH, TOK_WHILE,
TOK_RETURN, TOK_BREAK, TOK_CONTINUE, TOK_FUNC, TOK_SYMBOL,
- TOK_LITERAL, TOK_EMPTY, TOK_NIL
+ TOK_LITERAL, TOK_EMPTY, TOK_NIL, TOK_ELLIPSIS, TOK_QUESTION, TOK_VAR,
+ TOK_PLUSEQ, TOK_MINUSEQ, TOK_MULEQ, TOK_DIVEQ, TOK_CATEQ,
+ TOK_FORINDEX
};
+// Precedence rules
+enum { PREC_BINARY=1, PREC_REVERSE, PREC_PREFIX, PREC_SUFFIX };
+
struct Token {
int type;
int line;
char* str;
int strlen;
+ int rule;
double num;
struct Token* parent;
struct Token* next;
// Computed line number table for the lexer
int* lines;
int nLines;
-
+
struct CodeGenerator* cg;
};
int lastLine;
// Accumulated byte code array
- unsigned char* byteCode;
- int nBytes;
+ unsigned short* byteCode;
+ int codesz;
int codeAlloced;
+ // Inst. -> line table, stores pairs of {ip, line}
+ unsigned short* lineIps;
+ int nLineIps; // number of pairs
+ int nextLineIp;
+
// Stack of "loop" frames for break/continue statements
struct {
int breakIP;
int loopTop;
// Dynamic storage for constants, to be compiled into a static table
- naRef consts; // index -> naRef
- naRef interned; // naRef -> index (scalars only!)
- int nConsts;
+ naRef consts;
};
void naParseError(struct Parser* p, char* msg, int line);
void* naParseAlloc(struct Parser* p, int bytes);
void naParseDestroy(struct Parser* p);
void naLex(struct Parser* p);
-naRef naCodeGen(struct Parser* p, struct Token* tok);
+int naLexUtf8C(char* s, int len, int* used); /* in utf8lib.c */
+naRef naCodeGen(struct Parser* p, struct Token* block, struct Token* arglist);
void naParse(struct Parser* p);