From 7d42e7cfc9ec2e61d2c20297ce3988b9cbce357a Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Wed, 20 Sep 2023 13:42:20 +0200 Subject: [PATCH] extend the LR(0) visualization --- src/runtime/c/pgf/pgf.cxx | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/runtime/c/pgf/pgf.cxx b/src/runtime/c/pgf/pgf.cxx index 18664bbaf..3f94789c4 100644 --- a/src/runtime/c/pgf/pgf.cxx +++ b/src/runtime/c/pgf/pgf.cxx @@ -3149,12 +3149,40 @@ pgf_graphviz_lr_automaton(PgfDB *db, PgfConcrRevision revision, PgfPrinter printer(NULL,0,NULL); - printer.puts("digraph {"); + printer.puts("digraph {\n"); for (size_t i = 0; i < concr->lrtable->len; i++) { ref state = vector_elem(concr->lrtable, i); + + printer.nprintf(16, " s%zu [label=\"", i); + for (size_t j = 0; j < state->reductions->len; j++) { + ref reduce = vector_elem(state->reductions, j); + + switch (ref::get_tag(reduce->lin_obj)) { + case PgfConcrLin::tag: { + auto lin = + ref::untagged(reduce->lin_obj); + printer.efun(&lin->name); + break; + } + case PgfConcrLincat::tag: { + auto lincat = + ref::untagged(reduce->lin_obj); + printer.puts("linref "); + printer.efun(&lincat->name); + break; + } + } + printer.puts("\n"); + } + printer.puts("\""); + if (i == 0) printer.puts(",penwidth=3"); + printer.nprintf(16, "]\n"); + for (size_t j = 0; j < state->shifts->len; j++) { ref shift = vector_elem(state->shifts, j); - printer.nprintf(16, " s%zu -> s%zu;\n", i, shift->next_state); + printer.nprintf(16, " s%zu -> s%zu [label=\"", i, shift->next_state); + printer.efun(&shift->lincat->name); + printer.nprintf(16, ".%zu\"];\n", shift->r); } } printer.puts("}");