(sizeof(_tokennames)/sizeof(_tokennames[0])))
? 1 : -1];
+typedef struct {
+ char *name;
+ int value;
+} frame_macro;
+
typedef struct {
FILE *file;
char *name;
char peek[256];
size_t peekpos;
+ bool eof;
+
token *tok;
struct {
bool noops;
} flags;
+
+ int framevalue;
+ MEM_VECTOR_MAKE(frame_macro, frames);
+ char *modelname;
} lex_file;
MEM_VECTOR_PROTO(lex_file, char, token);
lex_file* lex_open (const char *file);
void lex_close(lex_file *lex);
int lex_do (lex_file *lex);
+void lex_cleanup(void);
/* Parser
*
#define opid3(a,b,c) ((a<<16)|(b<<8)|c)
static const oper_info operators[] = {
+ { "(", 0, opid1('('), ASSOC_LEFT, 99, OP_PREFIX}, /* paren expression - non function call */
+
{ "++", 1, opid3('S','+','+'), ASSOC_LEFT, 16, OP_SUFFIX},
{ "--", 1, opid3('S','-','-'), ASSOC_LEFT, 16, OP_SUFFIX},
{ ".", 2, opid1('.'), ASSOC_LEFT, 15, 0 },
+ { "(", 0, opid1('('), ASSOC_LEFT, 15, 0 }, /* function call */
- { "!", 1, opid2('!', 'P'), ASSOC_RIGHT, 14, 0 },
- { "~", 1, opid2('~', 'P'), ASSOC_RIGHT, 14, 0 },
+ { "!", 1, opid2('!', 'P'), ASSOC_RIGHT, 14, OP_PREFIX },
+ { "~", 1, opid2('~', 'P'), ASSOC_RIGHT, 14, OP_PREFIX },
{ "+", 1, opid2('+','P'), ASSOC_RIGHT, 14, OP_PREFIX },
{ "-", 1, opid2('-','P'), ASSOC_RIGHT, 14, OP_PREFIX },
{ "++", 1, opid3('+','+','P'), ASSOC_RIGHT, 14, OP_PREFIX },
{ "&=", 2, opid2('&','='), ASSOC_RIGHT, 2, 0 },
{ "^=", 2, opid2('^','='), ASSOC_RIGHT, 2, 0 },
{ "|=", 2, opid2('|','='), ASSOC_RIGHT, 2, 0 },
+
+ { ",", 2, opid1(','), ASSOC_LEFT, 1, 0 }
};
-const size_t operator_count = (sizeof(operators) / sizeof(operators[0]));
+static const size_t operator_count = (sizeof(operators) / sizeof(operators[0]));
typedef struct
{