X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fnasal%2Fparse.h;h=1574ea305f3999f869355d4c066d58adf203e572;hb=f75d1cbcb1e8ae60729b9f49b38447c229c47497;hp=d4210ff4c20092bba0d9d19b91aec57eaf52f21b;hpb=1786692406214447db12b9d5af5364582af23d3b;p=simgear.git diff --git a/simgear/nasal/parse.h b/simgear/nasal/parse.h index d4210ff4..1574ea30 100644 --- a/simgear/nasal/parse.h +++ b/simgear/nasal/parse.h @@ -7,23 +7,28 @@ #include "data.h" #include "code.h" -enum { +enum tok { TOK_TOP=1, TOK_AND, TOK_OR, TOK_NOT, TOK_LPAR, TOK_RPAR, TOK_LBRA, TOK_RBRA, TOK_LCURL, TOK_RCURL, TOK_MUL, TOK_PLUS, TOK_MINUS, TOK_NEG, TOK_DIV, TOK_CAT, TOK_COLON, TOK_DOT, TOK_COMMA, TOK_SEMI, 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; + enum tok type; int line; char* str; int strlen; + int rule; double num; - struct Token* parent; struct Token* next; struct Token* prev; struct Token* children; @@ -66,10 +71,20 @@ struct CodeGenerator { 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; + + int* argSyms; + int* optArgSyms; + int* optArgVals; + naRef restArgSym; + // Stack of "loop" frames for break/continue statements struct { int breakIP; @@ -79,9 +94,7 @@ struct CodeGenerator { 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); @@ -89,7 +102,8 @@ void naParseInit(struct Parser* p); 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);