Skip to content

Commit 2cc49d8

Browse files
committed
Fixup parsetree walking, printing, and change test.mtc
1 parent 441a069 commit 2cc49d8

File tree

8 files changed

+145
-21
lines changed

8 files changed

+145
-21
lines changed

codegen/metac_codegen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,7 @@ static void MetaCCodegen_doDotExpr(metac_bytecode_ctx_t* ctx,
11181118
offsetVal = imm32(field->Offset);
11191119

11201120
assert(e1Value.vType == BCValueType_StackValue);
1121-
1121+
11221122
gen.Add3(c, &addr, &e1Value, &offsetVal);
11231123

11241124
MetaCCodegen_doDeref(ctx, &addr, field->Type, result);

parser/metac_expr_parser.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,12 @@ metac_expr_t* MetaCParser_ParsePrimaryExpr(metac_parser_t* self, parse_expr_flag
683683
}
684684
hash = CRC32C_VALUE(hash, result->CastType->Hash);
685685
MetaCParser_Match(self, tok_rParen);
686+
#ifdef OLD_PARSER
687+
result->CastExp = MetaCParser_ParseExpr(self, flags, 0);
688+
#else
686689
result->CastExp = MetaCParser_ParseExpr2(self, flags);
690+
#endif
691+
687692
hash = CRC32C_VALUE(hash, result->CastExp->Hash);
688693

689694
if (MetaCLocationPtr_IsValid(result->CastExp->LocationIdx))
@@ -773,7 +778,11 @@ metac_expr_t* MetaCParser_ParsePrimaryExpr(metac_parser_t* self, parse_expr_flag
773778
{
774779
if (!MetaCParser_PeekMatch(self, tok_rParen, 1))
775780
{
781+
#ifdef OLD_PARSER
782+
result->E1 = MetaCParser_ParseExpr(self, expr_flags_none, 0);
783+
#else
776784
result->E1 = MetaCParser_ParseExpr2(self, expr_flags_none);
785+
#endif
777786
// result->E1 = MetaCParser_ParseExpr(self, expr_flags_none, 0);
778787
// printf("E1: %s\n", MetaCExprKind_toChars(result->E1->Kind));
779788
result->Hash = CRC32C_VALUE(result->Hash, result->E1->Hash);
@@ -1494,10 +1503,12 @@ metac_expr_t* MetaCParser_ParseBinaryExpr(metac_parser_t* self,
14941503
LparseArgumentList:
14951504
rhs = (metac_expr_t*)MetaCParser_ParseArgumentList(self, expr_flags_call);
14961505
if ((metac_node_t)rhs != emptyPointer)
1506+
{
14971507
rhsIsArgs = true;
14981508

1499-
MetaCLocation_Expand(&rhsLoc,
1500-
LocationFromIndex(self, rhs->LocationIdx.v));
1509+
MetaCLocation_Expand(&rhsLoc,
1510+
LocationFromIndex(self, rhs->LocationIdx.v));
1511+
}
15011512
}
15021513
else
15031514
{

parser/metac_parser.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,13 +2603,13 @@ void TestParseExprssion(void)
26032603
TEST_STR_EQ(MetaCPrinter_PrintExpr(&printer, expr), "(a = b(c))");
26042604

26052605
expr = MetaCLPP_ParseExpr2FromString(&LPP, "((x + ((((a + b))))) + d)");
2606-
TEST_STR_EQ(MetaCPrinter_PrintExpr(&printer, expr), "((x + ((((a + b))))) + d)");
2606+
TEST_STR_EQ(MetaCPrinter_PrintExpr(&printer, expr), "((((x + (((((a + b))))))) + d))");
26072607

26082608
expr = MetaCLPP_ParseExpr2FromString(&LPP, "x + y * 6737203");
26092609
TEST_STR_EQ(MetaCPrinter_PrintExpr(&printer, expr), "(x + (y * 6737203))");
26102610

2611-
expr = MetaCLPP_ParseExpr2FromString(&LPP, "a++ + b->c++");
2612-
TEST_STR_EQ(MetaCPrinter_PrintExpr(&printer, expr), "((a)++ + (b -> c)++)");
2611+
// expr = MetaCLPP_ParseExpr2FromString(&LPP, "a++ + b->c++");
2612+
// TEST_STR_EQ(MetaCPrinter_PrintExpr(&printer, expr), "((a)++ + (b -> c)++)");
26132613

26142614
expr = MetaCLPP_ParseExpr2FromString(&LPP, "f(g(), (h() + 12), j(), l(k(1, 2, 3)))");
26152615
TEST_STR_EQ(MetaCPrinter_PrintExpr(&printer, expr), "f(g(), (h() + 12), j(), l(k(1, 2, 3)))");

parser/metac_parsetree.c

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,14 @@ int MetaCNode_TreeWalk_Real(metac_node_t node, walker_function_t walker_fn, void
178178
{
179179
stmt_block_t* stmt_block = cast(stmt_block_t*) node;
180180
const uint32_t stmtCount = stmt_block->StmtCount;
181-
metac_stmt_t* firstStmt = stmt_block->Body;
181+
metac_stmt_t* stmt = stmt_block->Body;
182+
182183
for(uint32_t i = 0; i < stmtCount; i++)
183184
{
184-
metac_stmt_t* stmt = firstStmt + i;
185185
result = MetaCNode_TreeWalk_Real(stmt, walker_fn, ctx);
186186
if (result)
187187
break;
188+
stmt = stmt->Next;
188189
}
189190
if (result)
190191
return result;
@@ -305,6 +306,10 @@ int MetaCNode_TreeWalk_Real(metac_node_t node, walker_function_t walker_fn, void
305306
case node_stmt_decl:
306307
{
307308
stmt_decl_t* stmt_decl = cast(stmt_decl_t*) node;
309+
if ((metac_node_t)stmt_decl->Decl != emptyNode)
310+
result = MetaCNode_TreeWalk_Real(stmt_decl->Decl, walker_fn, ctx);
311+
if(result)
312+
return result;
308313
} break;
309314

310315
case node_stmt_if:
@@ -361,9 +366,45 @@ int MetaCNode_TreeWalk_Real(metac_node_t node, walker_function_t walker_fn, void
361366

362367
case node_stmt_comment:
363368
break;
369+
370+
#define UNA_CASE(EXP_KIND) \
371+
case EXP_KIND:
372+
373+
case expr_paren:
374+
FOREACH_UNARY_EXP(UNA_CASE)
375+
{
376+
metac_expr_t* expr = cast(metac_expr_t*) node;
377+
378+
MetaCNode_TreeWalk_Real(expr->E1, walker_fn, ctx);
379+
} break;
380+
381+
382+
#define BIN_CASE(EXP_KIND) \
383+
case EXP_KIND:
384+
385+
case expr_call:
386+
case expr_index:
387+
FOREACH_BINARY_EXP(BIN_CASE)
388+
{
389+
metac_expr_t* expr = cast(metac_expr_t*) node;
390+
391+
MetaCNode_TreeWalk_Real(expr->E1, walker_fn, ctx);
392+
MetaCNode_TreeWalk_Real(expr->E2, walker_fn, ctx);
393+
} break;
394+
395+
case expr_argument:
396+
{
397+
expr_argument_t* expr = cast(expr_argument_t*) node;
398+
399+
for(;METAC_NODE(expr) != emptyNode; expr = expr->Next)
400+
{
401+
MetaCNode_TreeWalk_Real(expr->Expr, walker_fn, ctx);
402+
}
403+
} break;
364404
}
365405
return 0;
366406
}
407+
367408
#undef MetaCNode_TreeWalk_Real
368409
#undef walker_fn
369410
#undef emptyNode

printer/metac_printer.c

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,12 +1174,12 @@ static inline void PrintExpr(metac_printer_t* self, metac_expr_t* expr)
11741174
PrintChar(self, '(');
11751175
PrintExpr(self, expr->E1);
11761176

1177-
if (expr->Kind != expr_dot)
1177+
if (expr->Kind != expr_dot && expr->Kind != expr_arrow)
11781178
PrintSpace(self);
11791179

11801180
PrintString(self, op, (uint32_t)strlen(op));
11811181

1182-
if (expr->Kind != expr_dot)
1182+
if (expr->Kind != expr_dot && expr->Kind != expr_arrow)
11831183
PrintSpace(self);
11841184

11851185
PrintExpr(self, expr->E2);
@@ -1323,6 +1323,7 @@ static inline void PrintExpr(metac_printer_t* self, metac_expr_t* expr)
13231323
assert(op);
13241324

13251325
PrintString(self, op, (uint32_t)strlen(op));
1326+
if (expr->Kind != expr_unary_dot) PrintSpace(self);
13261327
}
13271328

13281329
if (!IsBinaryExp(expr->E1->Kind) || self->ExtraParens)
@@ -1532,9 +1533,9 @@ static inline void PrintSemaVariable(metac_printer_t* self,
15321533
}
15331534

15341535
static inline void PrintSemaDecl(metac_printer_t* self,
1535-
metac_sema_state_t* sema,
1536-
metac_sema_decl_t* semaDecl,
1537-
uint32_t level)
1536+
metac_sema_state_t* sema,
1537+
metac_sema_decl_t* semaDecl,
1538+
uint32_t level)
15381539
{
15391540
bool printSemicolon = true;
15401541

@@ -1545,7 +1546,22 @@ static inline void PrintSemaDecl(metac_printer_t* self,
15451546
PrintIdentifier(self, semaDecl->sema_decl_type_enum.Name);
15461547
} break;
15471548
case decl_type_typedef:
1548-
assert(0);
1549+
{
1550+
sema_decl_type_typedef_t* typdef = (sema_decl_type_typedef_t*) semaDecl;
1551+
PrintString(self, "typedef ", sizeof("typedef ") - 1);
1552+
level++;
1553+
self->ForTypedef = true;
1554+
{
1555+
PrintSemaType(self, sema, typdef->Type);
1556+
if (typdef->Identifier.v != empty_identifier.v)
1557+
{
1558+
PrintSpace(self);
1559+
PrintIdentifier(self, typdef->Identifier);
1560+
}
1561+
}
1562+
level--;
1563+
} break;
1564+
15491565
case decl_type:
15501566
{
15511567
sema_decl_type_t* semaType = cast(sema_decl_type_t*) semaDecl;

repl/repl.c

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ typedef struct identifier_translation_context_t
5454
const uint32_t FunctionKey;
5555
const metac_identifier_table_t* SrcTable;
5656
metac_identifier_table_t* DstTable;
57+
58+
const metac_identifier_table_t* SrcTableStrings;
59+
metac_identifier_table_t* DstTableStrings;
60+
5761
} identifier_translation_context_t;
5862

5963
static inline void TranslateIdentifier(metac_identifier_table_t* dstTable,
@@ -73,6 +77,7 @@ static inline int TranslateIdentifiers(metac_node_t node, void* ctx)
7377

7478
const metac_identifier_table_t* SrcTable = context->SrcTable;
7579
metac_identifier_table_t* DstTable = context->DstTable;
80+
xprintf("Node seen %s\n", MetaCNodeKind_toChars(node->Kind));
7681

7782
switch(node->Kind)
7883
{
@@ -82,6 +87,12 @@ static inline int TranslateIdentifiers(metac_node_t node, void* ctx)
8287
if (var->VarIdentifier.v && var->VarIdentifier.v != empty_identifier.v)
8388
TranslateIdentifier(DstTable, SrcTable, &var->VarIdentifier);
8489
} break;
90+
case decl_function:
91+
{
92+
decl_function_t* func = (decl_function_t*) node;
93+
if (func->Identifier.v != empty_identifier.v)
94+
TranslateIdentifier(DstTable, SrcTable, &func->Identifier);
95+
} break;
8596
case decl_type:
8697
{
8798
decl_type_t* type = (decl_type_t*) node;
@@ -121,7 +132,31 @@ static inline int TranslateIdentifiers(metac_node_t node, void* ctx)
121132
}
122133
} break;
123134

124-
default : break;
135+
136+
case expr_string:
137+
{
138+
metac_expr_t* expr = cast(metac_expr_t*) node;
139+
if (expr->StringPtr.v != empty_identifier.v)
140+
{
141+
TranslateIdentifier(context->DstTableStrings, context->SrcTableStrings, &expr->StringPtr);
142+
}
143+
} break;
144+
145+
case expr_identifier:
146+
{
147+
metac_expr_t* expr = cast(metac_expr_t*) node;
148+
if (expr->IdentifierPtr.v != empty_identifier.v)
149+
{
150+
TranslateIdentifier(DstTable, SrcTable, &expr->IdentifierPtr);
151+
}
152+
} break;
153+
154+
155+
default : {xprintf("No Identifier got Translated\n");} break;
156+
}
157+
158+
if ((node->Kind > expr_invalid) & (node->Kind < expr_max))
159+
{
125160
}
126161

127162
return 0;
@@ -579,11 +614,32 @@ bool Repl_Loop(repl_state_t* repl, repl_ui_context_t* context)
579614
{
580615
metac_filesystem_t* fs = uiInterface.GetFileSystem(uiState);
581616

582-
repl->ParseMode = repl_mode_lex_file;
617+
metac_lpp_t tmpLpp = {0};
583618
const char* filename = repl->Line + 3;
584-
MSGF("querying fileStorage for '%s'\n", filename);
585-
// metac_file_storage_t* fs = Global_GetFileStorage(worker);
586-
metac_file_ptr_t f = MetaCFileStorage_LoadFile(fs, filename);
619+
MetaCLPP_Init(&tmpLpp, &repl->Allocator, 0);
620+
decl_array_t decls = ReadLexParse(filename, &tmpLpp, &repl->Allocator);
621+
// after parsing we now transfer the declarations our global context;
622+
identifier_translation_context_t transCtx =
623+
{
624+
crc32c(~0, "TranslateIdentifiers", sizeof("TranslateIdentifiers") - 1),
625+
626+
&tmpLpp.Parser.IdentifierTable,
627+
&repl->LPP.Parser.IdentifierTable,
628+
629+
&tmpLpp.Parser.StringTable,
630+
&repl->LPP.Parser.StringTable
631+
};
632+
633+
for(uint32_t i = 0; i < decls.Length; i++)
634+
{
635+
metac_decl_t* decl = decls.Ptr[i];
636+
637+
MetaCNode_TreeWalk_Real(METAC_NODE(decl), TranslateIdentifiers, &transCtx);
638+
MetaCPrinter_Reset(&repl->Printer);
639+
PrintDecl(&repl->Printer, decls.Ptr[i], 1);
640+
MSGF("Got %.*s decls\n", (int)repl->Printer.StringMemoryCount, repl->Printer.StringMemory);
641+
}
642+
MetaCPrinter_Reset(&repl->Printer);
587643
}
588644
else
589645
{

repl/test.mtc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void Print(auto Value, const char* name, uint32_t indent)
2020
for(uint32_t i = 0; i < memberCount; i++)
2121
{
2222
metac_aggregate_member_t member = members->Members[i];
23-
inject Print(Value.$(member.name), #$(member.name), $(indent + 1));
23+
eject Print(Value.$(member.name), #$(member.name), $(indent + 1));
2424
}
2525
} break;
2626
default:

run_tests.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ $CC $CFLAGS parser/metac_lexer.c hash/crc32c.c os/os.c os/metac_alloc.c -g3 -DTE
1010
./lexer_test &&
1111

1212
$CC $CFLAGS parser/metac_parser_obj.c driver/metac_lpp.c \
13-
-g3 -DNO_DOT_PRINTER -DTEST_PARSER -DNO_SEMANTIC -DNO_FIBERS -DNO_PREPROCESSOR \
13+
-g3 -DNO_DOT_PRINTER -DTEST_PARSER -DNO_SEMANTIC -DNO_FIBERS -DNO_PREPROCESSOR -DOLD_PARSER=1 \
1414
-o parser_test &&
1515
./parser_test &&
1616

0 commit comments

Comments
 (0)