]> git.mxchange.org Git - simgear.git/blob - simgear/nasal/parse.h
Fix memory leak discovered by Mathias Froehlich
[simgear.git] / simgear / nasal / parse.h
1 #ifndef _PARSE_H
2 #define _PARSE_H
3
4 #include <setjmp.h>
5
6 #include "nasal.h"
7 #include "data.h"
8 #include "code.h"
9
10 enum {
11     TOK_TOP=1, TOK_AND, TOK_OR, TOK_NOT, TOK_LPAR, TOK_RPAR, TOK_LBRA,
12     TOK_RBRA, TOK_LCURL, TOK_RCURL, TOK_MUL, TOK_PLUS, TOK_MINUS, TOK_NEG,
13     TOK_DIV, TOK_CAT, TOK_COLON, TOK_DOT, TOK_COMMA, TOK_SEMI,
14     TOK_ASSIGN, TOK_LT, TOK_LTE, TOK_EQ, TOK_NEQ, TOK_GT, TOK_GTE,
15     TOK_IF, TOK_ELSIF, TOK_ELSE, TOK_FOR, TOK_FOREACH, TOK_WHILE,
16     TOK_RETURN, TOK_BREAK, TOK_CONTINUE, TOK_FUNC, TOK_SYMBOL,
17     TOK_LITERAL, TOK_EMPTY, TOK_NIL, TOK_ELLIPSIS, TOK_QUESTION, TOK_VAR,
18     TOK_PLUSEQ, TOK_MINUSEQ, TOK_MULEQ, TOK_DIVEQ, TOK_CATEQ,
19     TOK_FORINDEX
20 };
21
22 struct Token {
23     int type;
24     int line;
25     char* str;
26     int strlen;
27     double num;
28     struct Token* parent;
29     struct Token* next;
30     struct Token* prev;
31     struct Token* children;
32     struct Token* lastChild;
33 };
34
35 struct Parser {
36     // Handle to the Nasal interpreter
37     struct Context* context;
38
39     char* err;
40     int errLine;
41     jmp_buf jumpHandle;
42
43     // The parse tree ubernode
44     struct Token tree;
45
46     // The input buffer
47     char* buf;
48     int   len;
49
50     // Input file parameters (for generating pretty stack dumps)
51     naRef srcFile;
52     int firstLine;
53
54     // Chunk allocator.  Throw away after parsing.
55     void** chunks;
56     int* chunkSizes;
57     int nChunks;
58     int leftInChunk;
59
60     // Computed line number table for the lexer
61     int* lines;
62     int  nLines;
63     
64     struct CodeGenerator* cg;
65 };
66
67 struct CodeGenerator {
68     int lastLine;
69
70     // Accumulated byte code array
71     unsigned short* byteCode;
72     int codesz;
73     int codeAlloced;
74
75     // Inst. -> line table, stores pairs of {ip, line}
76     unsigned short* lineIps;
77     int nLineIps; // number of pairs
78     int nextLineIp;
79
80     // Stack of "loop" frames for break/continue statements
81     struct {
82         int breakIP;
83         int contIP;
84         struct Token* label;
85     } loops[MAX_MARK_DEPTH];
86     int loopTop;
87
88     // Dynamic storage for constants, to be compiled into a static table
89     naRef consts;
90 };
91
92 void naParseError(struct Parser* p, char* msg, int line);
93 void naParseInit(struct Parser* p);
94 void* naParseAlloc(struct Parser* p, int bytes);
95 void naParseDestroy(struct Parser* p);
96 void naLex(struct Parser* p);
97 naRef naCodeGen(struct Parser* p, struct Token* block, struct Token* arglist);
98
99 void naParse(struct Parser* p);
100
101
102
103 #endif // _PARSE_H