mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-15 05:19:41 -07:00
checkpoint on eval2 parse
This commit is contained in:
1 parent
eb87cb053e
commit
bcdc6acd0e
9 files changed
+688
-88
No files matched your search
@@ -113,13 +113,410 @@ e2_expr_from_name(E2_ExprMap *map, String8 name)
|
||||
return expr;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Messages
|
||||
|
||||
internal E2_Msg *
|
||||
e2_msg(Arena *arena, E2_MsgList *msgs, U64 src_off, String8 string)
|
||||
{
|
||||
E2_Msg *msg = push_array(arena, E2_Msg, 1);
|
||||
SLLQueuePush(msgs->first, msgs->last, msg);
|
||||
msgs->count += 1;
|
||||
msg->src_off = src_off;
|
||||
msg->string = str8_copy(arena, string);
|
||||
return msg;
|
||||
}
|
||||
|
||||
internal E2_Msg *
|
||||
e2_msgf(Arena *arena, E2_MsgList *msgs, U64 src_off, char *fmt, ...)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
String8 string = str8fv(scratch.arena, fmt, args);
|
||||
E2_Msg *msg = e2_msg(arena, msgs, src_off, string);
|
||||
va_end(args);
|
||||
scratch_end(scratch);
|
||||
return msg;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Types
|
||||
|
||||
internal E2_TypeKey
|
||||
e2_type_key_basic(E2_TypeKind kind)
|
||||
{
|
||||
E2_TypeKey key = {E2_TypeKeyKind_Basic};
|
||||
key.u32[0] = (U32)kind;
|
||||
return key;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: String -> Expression
|
||||
|
||||
internal E2_Token
|
||||
e2_token_from_string(String8 string)
|
||||
{
|
||||
E2_Token token = {E2_TokenKind_Null};
|
||||
B32 identifier_tick_mode = 0;
|
||||
B32 comment_is_explicit_ender = 0;
|
||||
B32 numeric_exponent = 0;
|
||||
B32 escaped = 0;
|
||||
B32 done = 0;
|
||||
for(U64 off = 0; !done && off <= string.size; off += 1)
|
||||
{
|
||||
U8 next_byte = (off < string.size ? string.str[off] : 0);
|
||||
U8 next2_byte = (off+1 < string.size ? string.str[off+1] : 0);
|
||||
U8 next3_byte = (off+2 < string.size ? string.str[off+2] : 0);
|
||||
switch(token.kind)
|
||||
{
|
||||
//- rjf: no set token kind => look for starters
|
||||
default:
|
||||
{
|
||||
if(next_byte <= 32)
|
||||
{
|
||||
token.kind = E2_TokenKind_Whitespace;
|
||||
token.range.min = token.range.max = off;
|
||||
}
|
||||
else if(next_byte == '$' || next_byte == '_' || next_byte == '`' ||
|
||||
('A' <= next_byte && next_byte <= 'Z') ||
|
||||
('a' <= next_byte && next_byte <= 'z'))
|
||||
{
|
||||
token.kind = E2_TokenKind_Identifier;
|
||||
token.range.min = token.range.max = off;
|
||||
identifier_tick_mode = (next_byte == '`');
|
||||
}
|
||||
else if(('0' <= next_byte && next_byte <= '9') ||
|
||||
(next_byte == '.' && '0' <= next2_byte && next2_byte <= '9'))
|
||||
{
|
||||
token.kind = E2_TokenKind_Numeric;
|
||||
token.range.min = token.range.max = off;
|
||||
}
|
||||
else if(next_byte == '\'')
|
||||
{
|
||||
token.kind = E2_TokenKind_CharLiteral;
|
||||
token.range.min = token.range.max = off;
|
||||
}
|
||||
else if(next_byte == '"')
|
||||
{
|
||||
token.kind = E2_TokenKind_StringLiteral;
|
||||
token.range.min = token.range.max = off;
|
||||
}
|
||||
else if(next_byte == '/' && next2_byte == '/')
|
||||
{
|
||||
token.kind = E2_TokenKind_Comment;
|
||||
token.range.min = token.range.max = off;
|
||||
}
|
||||
else if(next_byte == '/' && next2_byte == '*')
|
||||
{
|
||||
token.kind = E2_TokenKind_Comment;
|
||||
token.range.min = token.range.max = off;
|
||||
comment_is_explicit_ender = 1;
|
||||
}
|
||||
else if(next_byte == '~' || next_byte == '!' || next_byte == '%' ||
|
||||
next_byte == '^' || next_byte == '&' || next_byte == '*' ||
|
||||
next_byte == '(' || next_byte == ')' || next_byte == '[' ||
|
||||
next_byte == ']' || next_byte == '{' || next_byte == '}' ||
|
||||
next_byte == '-' || next_byte == '=' || next_byte == '+' ||
|
||||
next_byte == ':' || next_byte == ';' || next_byte == ',' ||
|
||||
next_byte == '.' || next_byte == '<' || next_byte == '>' ||
|
||||
next_byte == '/' || next_byte == '?' || next_byte == '#' ||
|
||||
next_byte == '@' || next_byte == '|')
|
||||
{
|
||||
token.kind = E2_TokenKind_Symbol;
|
||||
token.range.min = token.range.max = off;
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: active tokens -> seek enders
|
||||
case E2_TokenKind_Whitespace:
|
||||
if(next_byte > 32)
|
||||
{
|
||||
done = 1;
|
||||
}break;
|
||||
case E2_TokenKind_Comment:
|
||||
if(comment_is_explicit_ender && next_byte == '*' && next2_byte == '/')
|
||||
{
|
||||
done = 1;
|
||||
token.range.max = off+2;
|
||||
}break;
|
||||
case E2_TokenKind_Identifier:
|
||||
{
|
||||
if(identifier_tick_mode && (next_byte == '`' || next_byte == '\''))
|
||||
{
|
||||
identifier_tick_mode = 0;
|
||||
}
|
||||
else if(!identifier_tick_mode &&
|
||||
(next_byte < 'a' || 'z' < next_byte) &&
|
||||
(next_byte < 'A' || 'Z' < next_byte) &&
|
||||
(next_byte < '0' || '9' < next_byte) &&
|
||||
next_byte != '$' &&
|
||||
next_byte != '_' &&
|
||||
next_byte != '@')
|
||||
{
|
||||
done = 1;
|
||||
token.range.max = off;
|
||||
}
|
||||
}break;
|
||||
case E2_TokenKind_Numeric:
|
||||
{
|
||||
if(numeric_exponent && (next_byte == '+' || next_byte == '-')){}
|
||||
else if((next_byte < 'a' || 'z' < next_byte) &&
|
||||
(next_byte < 'A' || 'Z' < next_byte) &&
|
||||
next_byte != '.' &&
|
||||
next_byte != ':')
|
||||
{
|
||||
done = 1;
|
||||
token.range.max = off;
|
||||
}
|
||||
else
|
||||
{
|
||||
numeric_exponent = (next_byte == 'e');
|
||||
}
|
||||
}break;
|
||||
case E2_TokenKind_Symbol:
|
||||
if(next_byte != '~' && next_byte != '!' && next_byte != '%' &&
|
||||
next_byte != '^' && next_byte != '&' && next_byte != '*' &&
|
||||
next_byte != '(' && next_byte != ')' && next_byte != '[' &&
|
||||
next_byte != ']' && next_byte != '{' && next_byte != '}' &&
|
||||
next_byte != '-' && next_byte != '=' && next_byte != '+' &&
|
||||
next_byte != ':' && next_byte != ';' && next_byte != ',' &&
|
||||
next_byte != '.' && next_byte != '<' && next_byte != '>' &&
|
||||
next_byte != '/' && next_byte != '?' && next_byte != '#' &&
|
||||
next_byte != '@' && next_byte != '|')
|
||||
{
|
||||
done = 1;
|
||||
token.range.max = off;
|
||||
}break;
|
||||
case E2_TokenKind_CharLiteral:
|
||||
case E2_TokenKind_StringLiteral:
|
||||
{
|
||||
if(!escaped && next_byte == '\\')
|
||||
{
|
||||
escaped = 1;
|
||||
}
|
||||
else if(escaped)
|
||||
{
|
||||
escaped = 0;
|
||||
}
|
||||
else if(!escaped && ((next_byte == '"' && token.kind == E2_TokenKind_StringLiteral) ||
|
||||
(next_byte == '\'' && token.kind == E2_TokenKind_CharLiteral)))
|
||||
{
|
||||
done = 1;
|
||||
token.range.max = off+1;
|
||||
}
|
||||
}break;
|
||||
}
|
||||
if(token.range.max > off+1)
|
||||
{
|
||||
off += (token.range.max - (off+1));
|
||||
}
|
||||
if(!done && off == string.size)
|
||||
{
|
||||
done = 1;
|
||||
token.range.max = off;
|
||||
}
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
internal U64
|
||||
e2_read_token(String8 string, U64 off, E2_Token *token_out)
|
||||
{
|
||||
E2_Token token = e2_token_from_string(str8_skip(string, off));
|
||||
if(token_out != 0)
|
||||
{
|
||||
token_out[0] = token;
|
||||
}
|
||||
U64 result = dim_1u64(token.range);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal B32
|
||||
e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out)
|
||||
{
|
||||
B32 result = 0;
|
||||
U64 off = off_out[0];
|
||||
for(;;)
|
||||
{
|
||||
E2_Token next_token = {E2_TokenKind_Null};
|
||||
off += e2_read_token(string, off, &next_token);
|
||||
if(next_token.kind == kind && (expected_string.size == 0 || str8_match(str8_substr(string, next_token.range), expected_string, 0)))
|
||||
{
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
else if(next_token.kind != E2_TokenKind_Comment && next_token.kind != E2_TokenKind_Whitespace)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(result)
|
||||
{
|
||||
off_out[0] = off;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal E2_Parse
|
||||
e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string)
|
||||
{
|
||||
U64 off = state->string_off;
|
||||
E2_Parse parse = {E2_Status_Error, .expr = &e2_expr_nil, .access_expr = &e2_expr_nil};
|
||||
|
||||
//- rjf: parse & attach to top parsing task - if we don't have a top task
|
||||
// then it is just the result
|
||||
for(B32 done = 0; !done;)
|
||||
{
|
||||
E2_Expr *expr = &e2_expr_nil;
|
||||
E2_Token token = {0};
|
||||
|
||||
//- rjf: nested sub-expressions
|
||||
if(e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, 0))
|
||||
{
|
||||
E2_ParseTask *task = state->free_task;
|
||||
if(task != 0)
|
||||
{
|
||||
SLLStackPop(state->free_task);
|
||||
}
|
||||
else
|
||||
{
|
||||
task = push_array(arena, E2_ParseTask, 1);
|
||||
}
|
||||
task->parent = push_array(arena, E2_Expr, 1);
|
||||
MemoryCopyStruct(task->parent, &e2_expr_nil);
|
||||
task->expected_closer = s(")");
|
||||
task->child_count_target = 1;
|
||||
SLLStackPush(state->top_task, task);
|
||||
}
|
||||
|
||||
//- rjf: prefix unaries
|
||||
else if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token))
|
||||
{
|
||||
E2_ParseTask *task = state->free_task;
|
||||
if(task != 0)
|
||||
{
|
||||
SLLStackPop(state->free_task);
|
||||
}
|
||||
else
|
||||
{
|
||||
task = push_array(arena, E2_ParseTask, 1);
|
||||
}
|
||||
task->parent = push_array(arena, E2_Expr, 1);
|
||||
MemoryCopyStruct(task->parent, &e2_expr_nil);
|
||||
task->child_count_target = 1;
|
||||
SLLStackPush(state->top_task, task);
|
||||
}
|
||||
|
||||
//- rjf: leaf identifiers
|
||||
else if(e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token))
|
||||
{
|
||||
String8 identifier = str8_substr(string, token.range);
|
||||
expr = e2_expr_from_name(expr_map, identifier);
|
||||
if(expr == &e2_expr_nil)
|
||||
{
|
||||
done = 1;
|
||||
parse.status = E2_Status_MissedIdentifierResolution;
|
||||
parse.missed_identifier = identifier;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: leaf numerics
|
||||
else if(e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token))
|
||||
{
|
||||
String8 numeric_string = str8_substr(string, token.range);
|
||||
expr = push_array(arena, E2_Expr, 1);
|
||||
MemoryCopyStruct(expr, &e2_expr_nil);
|
||||
U64 dot_pos = str8_find_needle(numeric_string, 0, s("."), 0);
|
||||
B32 f_suffix = str8_match(str8_postfix(numeric_string, 1), s("f"), 0);
|
||||
U64 colon_pos = str8_find_needle(numeric_string, 0, s(":"), 0);
|
||||
if(dot_pos < numeric_string.size && f_suffix)
|
||||
{
|
||||
expr->val.f32 = (F32)f64_from_str8(numeric_string);
|
||||
expr->type_key = e2_type_key_basic(E2_TypeKind_F32);
|
||||
}
|
||||
else if(dot_pos < numeric_string.size && !f_suffix)
|
||||
{
|
||||
expr->val.f64 = f64_from_str8(numeric_string);
|
||||
expr->type_key = e2_type_key_basic(E2_TypeKind_F64);
|
||||
}
|
||||
else if(colon_pos < numeric_string.size)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8List parts = str8_split(scratch.arena, numeric_string, (U8 *)":", 1, 0);
|
||||
U64 u64_idx = 0;
|
||||
for EachNode(n, String8Node, parts.first)
|
||||
{
|
||||
if(u64_idx >= ArrayCount(expr->val.u512.u64))
|
||||
{
|
||||
break;
|
||||
}
|
||||
try_u64_from_str8_c_rules(n->string, &expr->val.u512.u64[u64_idx]);
|
||||
u64_idx += 1;
|
||||
}
|
||||
switch(u64_idx)
|
||||
{
|
||||
case 1:{expr->op = RDI_EvalOp_ConstU64; expr->type_key = e2_type_key_basic(E2_TypeKind_U64);}break;
|
||||
case 2:{expr->op = RDI_EvalOp_ConstU128; expr->type_key = e2_type_key_basic(E2_TypeKind_U128);}break;
|
||||
case 4:{expr->op = RDI_EvalOp_ConstU256; expr->type_key = e2_type_key_basic(E2_TypeKind_U256);}break;
|
||||
case 8:{expr->op = RDI_EvalOp_ConstU512; expr->type_key = e2_type_key_basic(E2_TypeKind_U512);}break;
|
||||
default:
|
||||
{
|
||||
e2_msgf(arena, &parse.msgs, token.range.min, "Invalid number of numeric portions specified (%I64u; must be 2, 4, or 8).", u64_idx);
|
||||
}break;
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
else if(try_u64_from_str8_c_rules(numeric_string, &expr->val.u64))
|
||||
{
|
||||
if(expr->val.u64 <= 0xff)
|
||||
{
|
||||
expr->op = RDI_EvalOp_ConstU8;
|
||||
expr->type_key = e2_type_key_basic(E2_TypeKind_U8);
|
||||
}
|
||||
else if(expr->val.u64 <= 0xffff)
|
||||
{
|
||||
expr->op = RDI_EvalOp_ConstU16;
|
||||
expr->type_key = e2_type_key_basic(E2_TypeKind_U16);
|
||||
}
|
||||
else if(expr->val.u64 <= 0xffffffff)
|
||||
{
|
||||
expr->op = RDI_EvalOp_ConstU32;
|
||||
expr->type_key = e2_type_key_basic(E2_TypeKind_U32);
|
||||
}
|
||||
else
|
||||
{
|
||||
expr->op = RDI_EvalOp_ConstU64;
|
||||
expr->type_key = e2_type_key_basic(E2_TypeKind_U64);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: attach formed expressions to task
|
||||
if(expr != &e2_expr_nil && state->top_task != 0)
|
||||
{
|
||||
SLLQueuePush(state->top_task->parent->first, state->top_task->parent->last, expr);
|
||||
state->top_task->child_count += 1;
|
||||
if(state->top_task->child_count == state->top_task->child_count_target)
|
||||
{
|
||||
// TODO(rjf): pop task, insert to parent, or decay to result - should naturally express below block too
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: no task -> formed expr is result
|
||||
if(expr != &e2_expr_nil && state->top_task == 0)
|
||||
{
|
||||
parse.expr = expr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: advance offset if successful
|
||||
if(parse.status == E2_Status_Good)
|
||||
{
|
||||
state->string_off += off;
|
||||
}
|
||||
return parse;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
@@ -4,6 +4,28 @@
|
||||
#ifndef EVAL2_H
|
||||
#define EVAL2_H
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Operator Info Tables
|
||||
|
||||
typedef enum E2_OpParseKind
|
||||
{
|
||||
E2_OpParseKind_Null,
|
||||
E2_OpParseKind_UnaryPrefix,
|
||||
E2_OpParseKind_Binary,
|
||||
}
|
||||
E2_OpParseKind;
|
||||
|
||||
typedef struct E2_OpInfo E2_OpInfo;
|
||||
struct E2_OpInfo
|
||||
{
|
||||
E2_OpParseKind parse_kind;
|
||||
S64 precedence;
|
||||
String8 pre;
|
||||
String8 sep;
|
||||
String8 post;
|
||||
String8 chain;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Generated Code
|
||||
|
||||
@@ -242,6 +264,31 @@ struct E2_Ctx
|
||||
U64 tls_base_addr;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Tokens
|
||||
|
||||
typedef enum E2_TokenKind
|
||||
{
|
||||
E2_TokenKind_Null,
|
||||
E2_TokenKind_Whitespace,
|
||||
E2_TokenKind_Comment,
|
||||
E2_TokenKind_Identifier,
|
||||
E2_TokenKind_Numeric,
|
||||
E2_TokenKind_Symbol,
|
||||
E2_TokenKind_CharLiteral,
|
||||
E2_TokenKind_StringLiteral,
|
||||
E2_TokenKind_COUNT
|
||||
}
|
||||
E2_TokenKind;
|
||||
|
||||
typedef struct E2_Token E2_Token;
|
||||
struct E2_Token
|
||||
{
|
||||
E2_TokenKind kind;
|
||||
U32 unused;
|
||||
Rng1U64 range;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression Tree Building
|
||||
|
||||
@@ -273,10 +320,38 @@ struct E2_ExprMap
|
||||
U64 slots_count;
|
||||
};
|
||||
|
||||
typedef struct E2_ParseTask E2_ParseTask;
|
||||
struct E2_ParseTask
|
||||
{
|
||||
E2_ParseTask *next;
|
||||
E2_Expr *parent;
|
||||
U64 child_count;
|
||||
U64 child_count_target;
|
||||
String8 expected_closer;
|
||||
};
|
||||
|
||||
typedef struct E2_ParseState E2_ParseState;
|
||||
struct E2_ParseState
|
||||
{
|
||||
U64 string_off;
|
||||
E2_ParseTask *top_task;
|
||||
E2_ParseTask *free_task;
|
||||
};
|
||||
|
||||
typedef struct E2_Msg E2_Msg;
|
||||
struct E2_Msg
|
||||
{
|
||||
E2_Msg *next;
|
||||
U64 src_off;
|
||||
String8 string;
|
||||
};
|
||||
|
||||
typedef struct E2_MsgList E2_MsgList;
|
||||
struct E2_MsgList
|
||||
{
|
||||
E2_Msg *first;
|
||||
E2_Msg *last;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
typedef struct E2_Parse E2_Parse;
|
||||
@@ -287,8 +362,10 @@ struct E2_Parse
|
||||
Rng1U64 missed_read_space_addr_range;
|
||||
E2_CtxID ctx_id;
|
||||
E2_CtxFlags missing_ctx_flags;
|
||||
String8 missed_identifier;
|
||||
E2_Expr *expr;
|
||||
E2_Expr *access_expr;
|
||||
E2_MsgList msgs;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -353,9 +430,23 @@ internal U64 e2_space_map_read(E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 ad
|
||||
internal void e2_expr_map_push(Arena *arena, E2_ExprMap *map, String8 name, E2_Expr *expr);
|
||||
internal E2_Expr *e2_expr_from_name(E2_ExprMap *map, String8 name);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Messages
|
||||
|
||||
internal E2_Msg *e2_msg(Arena *arena, E2_MsgList *msgs, U64 src_off, String8 string);
|
||||
internal E2_Msg *e2_msgf(Arena *arena, E2_MsgList *msgs, U64 src_off, char *fmt, ...);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Types
|
||||
|
||||
internal E2_TypeKey e2_type_key_basic(E2_TypeKind kind);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: String -> Expression
|
||||
|
||||
internal E2_Token e2_token_from_string(String8 string);
|
||||
internal U64 e2_read_token(String8 string, U64 off, E2_Token *token_out);
|
||||
internal B32 e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out);
|
||||
internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
@@ -1,6 +1,49 @@
|
||||
// Copyright (c) Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
@table(name parse_kind precedence pre sep pos chain)
|
||||
E2_OpTable:
|
||||
{
|
||||
{Deref UnaryPrefix 2 "*" "" "" ""}
|
||||
{Address UnaryPrefix 2 "&" "" "" ""}
|
||||
{Pos UnaryPrefix 2 "+" "" "" ""}
|
||||
{Neg UnaryPrefix 2 "-" "" "" ""}
|
||||
{LogNot UnaryPrefix 2 "!" "" "" ""}
|
||||
{BitNot UnaryPrefix 2 "~" "" "" ""}
|
||||
{Mul Binary 3 "" "*" "" ""}
|
||||
{Div Binary 3 "" "/" "" ""}
|
||||
{Mod Binary 3 "" "%" "" ""}
|
||||
{Add Binary 4 "" "+" "" ""}
|
||||
{Sub Binary 4 "" "-" "" ""}
|
||||
{LShift Binary 5 "" "<<" "" ""}
|
||||
{RShift Binary 5 "" ">>" "" ""}
|
||||
{Less Binary 6 "" "<" "" ""}
|
||||
{LtEq Binary 6 "" "<=" "" ""}
|
||||
{Grtr Binary 6 "" ">" "" ""}
|
||||
{GrEq Binary 6 "" ">=" "" ""}
|
||||
{EqEq Binary 7 "" "==" "" ""}
|
||||
{NtEq Binary 7 "" "!=" "" ""}
|
||||
{BitAnd Binary 8 "" "&" "" ""}
|
||||
{BitXor Binary 9 "" "^" "" ""}
|
||||
{BitOr Binary 10 "" "|" "" ""}
|
||||
{LogAnd Binary 11 "" "&&" "" ""}
|
||||
{LogOr Binary 12 "" "||" "" ""}
|
||||
{Define Binary 13 "" "=" "" ""}
|
||||
}
|
||||
|
||||
@enum E2_OpKind:
|
||||
{
|
||||
Null,
|
||||
@expand(E2_OpTable a) `$(a.name)`,
|
||||
COUNT,
|
||||
}
|
||||
|
||||
@data(E2_OpInfo) e2_op_kind_info_table:
|
||||
{
|
||||
`{0}`,
|
||||
@expand(E2_OpTable a) `{E2_OpParseKind_$(a.parse_kind), $(a.precedence), str8_lit_comp("$(a.pre)"), str8_lit_comp("$(a.sep)"), str8_lit_comp("$(a.pos)"), str8_lit_comp("$(a.chain)")}`
|
||||
}
|
||||
|
||||
@table(name basic_string basic_byte_size)
|
||||
// NOTE(rjf): basic_byte_size == 0xFF? => address sized
|
||||
E2_TypeKindTable:
|
||||
|
||||
@@ -3,3 +3,36 @@
|
||||
|
||||
//- GENERATED CODE
|
||||
|
||||
C_LINKAGE_BEGIN
|
||||
E2_OpInfo e2_op_kind_info_table[26] =
|
||||
{
|
||||
{0},
|
||||
{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("~"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("/"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("%"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 5, str8_lit_comp(""), str8_lit_comp("<<"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(">>"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<="), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">="), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("=="), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("!="), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 8, str8_lit_comp(""), str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 9, str8_lit_comp(""), str8_lit_comp("^"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 10, str8_lit_comp(""), str8_lit_comp("|"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 11, str8_lit_comp(""), str8_lit_comp("&&"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 12, str8_lit_comp(""), str8_lit_comp("||"), str8_lit_comp(""), str8_lit_comp("")},
|
||||
{E2_OpParseKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp(""), str8_lit_comp("")},
|
||||
};
|
||||
|
||||
C_LINKAGE_END
|
||||
|
||||
@@ -6,6 +6,37 @@
|
||||
#ifndef EVAL2_META_H
|
||||
#define EVAL2_META_H
|
||||
|
||||
typedef enum E2_OpKind
|
||||
{
|
||||
E2_OpKind_Null,
|
||||
E2_OpKind_Deref,
|
||||
E2_OpKind_Address,
|
||||
E2_OpKind_Pos,
|
||||
E2_OpKind_Neg,
|
||||
E2_OpKind_LogNot,
|
||||
E2_OpKind_BitNot,
|
||||
E2_OpKind_Mul,
|
||||
E2_OpKind_Div,
|
||||
E2_OpKind_Mod,
|
||||
E2_OpKind_Add,
|
||||
E2_OpKind_Sub,
|
||||
E2_OpKind_LShift,
|
||||
E2_OpKind_RShift,
|
||||
E2_OpKind_Less,
|
||||
E2_OpKind_LtEq,
|
||||
E2_OpKind_Grtr,
|
||||
E2_OpKind_GrEq,
|
||||
E2_OpKind_EqEq,
|
||||
E2_OpKind_NtEq,
|
||||
E2_OpKind_BitAnd,
|
||||
E2_OpKind_BitXor,
|
||||
E2_OpKind_BitOr,
|
||||
E2_OpKind_LogAnd,
|
||||
E2_OpKind_LogOr,
|
||||
E2_OpKind_Define,
|
||||
E2_OpKind_COUNT,
|
||||
} E2_OpKind;
|
||||
|
||||
typedef enum E2_TypeKind
|
||||
{
|
||||
E2_TypeKind_Null,
|
||||
@@ -84,4 +115,9 @@ E2_TypeKind_FirstMeta = E2_TypeKind_MetaExpr,
|
||||
E2_TypeKind_LastMeta = E2_TypeKind_MetaDescription,
|
||||
} E2_TypeKind;
|
||||
|
||||
C_LINKAGE_BEGIN
|
||||
extern E2_OpInfo e2_op_kind_info_table[26];
|
||||
|
||||
C_LINKAGE_END
|
||||
|
||||
#endif // EVAL2_META_H
|
||||
Reference in new issue
Block a user