00001 #ifndef _PARSE_H
00002 #define _PARSE_H
00003
00004 #include <setjmp.h>
00005
00006 #include "nasal.h"
00007 #include "data.h"
00008 #include "code.h"
00009
00010 enum tok {
00011 TOK_TOP=1, TOK_AND, TOK_OR, TOK_NOT, TOK_LPAR, TOK_RPAR, TOK_LBRA,
00012 TOK_RBRA, TOK_LCURL, TOK_RCURL, TOK_MUL, TOK_PLUS, TOK_MINUS, TOK_NEG,
00013 TOK_DIV, TOK_CAT, TOK_COLON, TOK_DOT, TOK_COMMA, TOK_SEMI,
00014 TOK_ASSIGN, TOK_LT, TOK_LTE, TOK_EQ, TOK_NEQ, TOK_GT, TOK_GTE,
00015 TOK_IF, TOK_ELSIF, TOK_ELSE, TOK_FOR, TOK_FOREACH, TOK_WHILE,
00016 TOK_RETURN, TOK_BREAK, TOK_CONTINUE, TOK_FUNC, TOK_SYMBOL,
00017 TOK_LITERAL, TOK_EMPTY, TOK_NIL, TOK_ELLIPSIS, TOK_QUESTION, TOK_VAR,
00018 TOK_PLUSEQ, TOK_MINUSEQ, TOK_MULEQ, TOK_DIVEQ, TOK_CATEQ,
00019 TOK_FORINDEX
00020 };
00021
00022
00023 enum { PREC_BINARY=1, PREC_REVERSE, PREC_PREFIX, PREC_SUFFIX };
00024
00025 struct Token {
00026 enum tok type;
00027 int line;
00028 char* str;
00029 int strlen;
00030 int rule;
00031 double num;
00032 struct Token* next;
00033 struct Token* prev;
00034 struct Token* children;
00035 struct Token* lastChild;
00036 };
00037
00038 struct Parser {
00039
00040 struct Context* context;
00041
00042 char* err;
00043 int errLine;
00044 jmp_buf jumpHandle;
00045
00046
00047 struct Token tree;
00048
00049
00050 char* buf;
00051 int len;
00052
00053
00054 naRef srcFile;
00055 int firstLine;
00056
00057
00058 void** chunks;
00059 int* chunkSizes;
00060 int nChunks;
00061 int leftInChunk;
00062
00063
00064 int* lines;
00065 int nLines;
00066
00067 struct CodeGenerator* cg;
00068 };
00069
00070 struct CodeGenerator {
00071 int lastLine;
00072
00073
00074 unsigned short* byteCode;
00075 int codesz;
00076 int codeAlloced;
00077
00078
00079 unsigned short* lineIps;
00080 int nLineIps;
00081 int nextLineIp;
00082
00083 int* argSyms;
00084 int* optArgSyms;
00085 int* optArgVals;
00086 naRef restArgSym;
00087
00088
00089 struct {
00090 int breakIP;
00091 int contIP;
00092 struct Token* label;
00093 } loops[MAX_MARK_DEPTH];
00094 int loopTop;
00095
00096
00097 naRef consts;
00098 };
00099
00100 void naParseError(struct Parser* p, char* msg, int line);
00101 void naParseInit(struct Parser* p);
00102 void* naParseAlloc(struct Parser* p, int bytes);
00103 void naParseDestroy(struct Parser* p);
00104 void naLex(struct Parser* p);
00105 int naLexUtf8C(char* s, int len, int* used);
00106 naRef naCodeGen(struct Parser* p, struct Token* block, struct Token* arglist);
00107
00108 void naParse(struct Parser* p);
00109
00110
00111
00112 #endif // _PARSE_H