From e6a62cbd0369066747f391804412daa6baa19280 Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Thu, 25 Jun 2026 14:16:07 -0300 Subject: [PATCH 1/8] add slr-parser package --- packages/preview/slr-parser/0.0.1/LICENSE | 21 + packages/preview/slr-parser/0.0.1/README.md | 85 ++++ .../preview/slr-parser/0.0.1/docs/example.pdf | Bin 0 -> 224399 bytes .../preview/slr-parser/0.0.1/docs/example.typ | 103 +++++ packages/preview/slr-parser/0.0.1/src/lib.typ | 397 ++++++++++++++++++ packages/preview/slr-parser/0.0.1/src/vis.typ | 376 +++++++++++++++++ packages/preview/slr-parser/0.0.1/typst.toml | 14 + 7 files changed, 996 insertions(+) create mode 100644 packages/preview/slr-parser/0.0.1/LICENSE create mode 100644 packages/preview/slr-parser/0.0.1/README.md create mode 100644 packages/preview/slr-parser/0.0.1/docs/example.pdf create mode 100644 packages/preview/slr-parser/0.0.1/docs/example.typ create mode 100644 packages/preview/slr-parser/0.0.1/src/lib.typ create mode 100644 packages/preview/slr-parser/0.0.1/src/vis.typ create mode 100644 packages/preview/slr-parser/0.0.1/typst.toml diff --git a/packages/preview/slr-parser/0.0.1/LICENSE b/packages/preview/slr-parser/0.0.1/LICENSE new file mode 100644 index 0000000000..624cc3aa8f --- /dev/null +++ b/packages/preview/slr-parser/0.0.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 sjfhsjfh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/preview/slr-parser/0.0.1/README.md b/packages/preview/slr-parser/0.0.1/README.md new file mode 100644 index 0000000000..56657e7fd0 --- /dev/null +++ b/packages/preview/slr-parser/0.0.1/README.md @@ -0,0 +1,85 @@ +# slr-parser + +Takes a grammar and a sentence and walks through SLR(1) parsing: augmented +grammar, FIRST/FOLLOW, canonical LR(0) items, the DFA, the ACTION/GOTO +table, a shift-reduce trace, the parse tree. All computed in Typst, no +external script generating a table beforehand. + +It's SLR(1) — LR(0) item sets, but reduce actions only go in when the +symbol's in FOLLOW(LHS). That's the whole difference from plain LR(0). + +See `example.pdf` for what it looks like end to end on: + +``` +C → id ( A ) +A → A , E | ε | E +E → E + T | T +T → id | num | C +``` +parsing `id ( num + id , id ( num + id ) )`. + +## Using it + +```typst +#import "@preview/slr-visualizer:0.1.0": * + +#let my-grammar = ( + ("C", ("id", "(", "A", ")")), + ("A", ("A", ",", "E")), + ("A", ("\\epsilon",)), + ("A", ("E",)), + ("E", ("E", "+", "T")), + ("E", ("T",)), + ("T", ("id",)), + ("T", ("num",)), + ("T", ("C",)), +) + +#let my-sentence = ("id", "(", "num", "+", "id", ",", "id", "(", "num", "+", "id", ")", ")") + +#show-grammar(my-grammar) +#show-parse-table(my-grammar) +#show-parse-trace(my-grammar, my-sentence) +#show-parse-tree(my-grammar, my-sentence) +``` + +A grammar is just a list of `(LHS, RHS)` pairs, RHS being a tuple of +symbols. First production's LHS = start symbol. Anything that's not a LHS +anywhere is a terminal. `"\\epsilon"` for empty productions. Don't use `"."` +as a symbol — it's the LR item dot internally and things will break in +confusing ways if it collides. + +A sentence is just the terminals, no `$` at the end, that gets added for +you. + +## What each function gives you + +`show-grammar` / `show-aug-grammar` — the production list, plain or with the +`S' → S` row added. + +`show-first-follow` — FIRST/FOLLOW per non-terminal. + +`show-canonical-items` — every I_n state, with where it came from. + +`show-automaton(grammar, width: 100%)` — the LR(0) DFA, rendered via +diagraph/Graphviz. + +`show-parse-table` — ACTION/GOTO, conflicts called out in red if there are +any. + +`show-parse-trace` / `show-parse-tree` — take `(grammar, sentence)`, give +you the stack-by-stack trace and the resulting tree. + +All of them take the grammar *before* augmentation — that part's handled +for you. + +## Known gaps + +- SLR(1) conflict resolution, not LALR/LR(1) — if your grammar genuinely + needs per-state lookahead to be unambiguous, you'll see conflicts here + even though a stronger parser wouldn't have any. +- FIRST-set computation only skips direct left recursion (`A → A α`). + Indirect left recursion through another non-terminal isn't handled. +- When there's a real shift/reduce or reduce/reduce conflict, whichever + action got inserted first wins — there's no precedence/associativity + table backing this, it's reported and left at that. diff --git a/packages/preview/slr-parser/0.0.1/docs/example.pdf b/packages/preview/slr-parser/0.0.1/docs/example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56968917b13a6447efaf8001750a9ae97263b872 GIT binary patch literal 224399 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

o9%g^Ao=m~wIN6T)n1beOwxr?xx`^SreSdy zi#^~!78UV03}PLoV+@VL<1n@u0NrBWF@SaS4X4CwOCDQbHmjQo!X9 z2zZy=L^6+|I%Lxmv~LL@lMtYRM%%0q-f7+fA_%_SDSfcG4kpShPi~1acDrMEkR~v< zPVdCGs+`K!6?QxzH=CU~Dr>MW8v=Q8z*c-G-;lHvme^yK2=*%D;OrMz$eCIkfMJ2^ zZaG<_2Il~v6ViIwkl+)qfa8pY*08SRpM%gxxbBGh

f43N}g-G@1l19U)u@_tB9g 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 { + if i == target { + append-dot(item) + } else { + item + } + }) +} + +#let advance-dot(item) = { + let (lhs, rhs) = item + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let next-symbol = rhs.at(dot-index + 1) + let new-rhs = rhs.slice(0, dot-index) + (next-symbol, ".") + rhs.slice(dot-index + 2) + return (lhs, new-rhs) + } + return item +} + + + +#let closure(state, grammar) = { + let J = state + let changed = true + + while changed { + changed = false + + for item in J { + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let target = rhs.at(dot-index + 1) + let target-prods = grammar.filter(x => x.at(0) == target) + + for prod in target-prods { + let new-item = append-dot(prod) + + if new-item not in J { + J.push(new-item) + changed = true + } + } + } + } + } + + return J +} + +#let goto(state, symbol, grammar) = { + let moved-items = () + + for item in state { + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let next-symbol = rhs.at(dot-index + 1) + + if next-symbol == symbol { + moved-items.push(advance-dot(item)) + } + } + } + + return closure(moved-items, grammar) +} + + + +#let canonical-items(augmented-grammar) = { + let I0 = closure((append-dot(augmented-grammar.at(0)),), augmented-grammar) + let C = (I0,) + let changed = true + let symbols = get-all-symbols(augmented-grammar).filter(x => x != "\\epsilon") + + while changed { + changed = false + + for state in C { + for symbol in symbols { + let next-state = goto(state, symbol, augmented-grammar) + + if (next-state.len() != 0) and (next-state not in C) { + C.push(next-state) + changed = true + } + } + } + } + + return C +} + + + +#let get-first-of-sequence(seq, first-sets) = { + if seq.len() == 0 or seq == ("\\epsilon",) { return ("\\epsilon",) } + let result = () + let all-epsilon = true + for sym in seq { + let sym-first = first-sets.at(sym, default: ()) + for f in sym-first { + if f != "\\epsilon" and f not in result { result.push(f) } + } + if "\\epsilon" not in sym-first { + all-epsilon = false + break + } + } + if all-epsilon and "\\epsilon" not in result { result.push("\\epsilon") } + return result +} + +#let compute-first(grammar) = { + let first-sets = (:) + for sym in get-terminals(grammar) { first-sets.insert(sym, (sym,)) } + for sym in get-variables(grammar) { first-sets.insert(sym, ()) } + + let changed = true + while changed { + changed = false + for prod in grammar { + let lhs = prod.at(0) + let rhs = prod.at(1) + + // skip left-recursive productions entirely + if rhs.at(0) == lhs { continue } + + let rhs-first = get-first-of-sequence(rhs, first-sets) + for f in rhs-first { + let current-first = first-sets.at(lhs) + if f not in current-first { + current-first.push(f) + first-sets.insert(lhs, current-first) + changed = true + } + } + } + } + return first-sets +} + +#let compute-follow(grammar, first-sets) = { + let follow-sets = (:) + let non-terminals = get-variables(grammar) + for nt in non-terminals { follow-sets.insert(nt, ()) } + + let original-start = grammar.at(0).at(1).at(0) + follow-sets.insert(original-start, ("$",)) + + let changed = true + while changed { + changed = false + for prod in grammar { + let lhs = prod.at(0) + let rhs = prod.at(1) + if rhs == ("\\epsilon",) { continue } + + for i in range(rhs.len()) { + let symbol = rhs.at(i) + if symbol in non-terminals { + let beta = rhs.slice(i + 1) + let first-beta = get-first-of-sequence(beta, first-sets) + + for f in first-beta { + if f != "\\epsilon" and f not in follow-sets.at(symbol) { + let sym-follow = follow-sets.at(symbol) + sym-follow.push(f) + follow-sets.insert(symbol, sym-follow) + changed = true + } + } + if "\\epsilon" in first-beta or beta.len() == 0 { + for f in follow-sets.at(lhs) { + if f not in follow-sets.at(symbol) { + let sym-follow = follow-sets.at(symbol) + sym-follow.push(f) + follow-sets.insert(symbol, sym-follow) + changed = true + } + } + } + } + } + } + } + return follow-sets +} + + +// SLR(1) table construction + +// Returns (ACTION: array of dicts, GOTO: array of dicts, conflicts: array) +// Each conflict is a dict: (state: int, symbol: str, existing: action, incoming: action) +// Conflicts are reported but the first entry written wins (shift preferred on shift/reduce so the caller can decide what to do with the conflict list) + +#let build-tables(C, augmented-grammar) = { + let ACTION = () + let GOTO = () + let conflicts = () + + let terminals = get-terminals(augmented-grammar).filter(x => x != "\\epsilon") + let variables = get-variables(augmented-grammar) + + let first-sets = compute-first(augmented-grammar) + let follow-sets = compute-follow(augmented-grammar, first-sets) + + // S' → S . + let start-item = append-dot(augmented-grammar.at(0)) // S' → . S + let accept-item = advance-dot(start-item) // S' → S . + + for (state-idx, state) in C.enumerate() { + let current-action = (:) + let current-goto = (:) + + for symbol in terminals { + let next-state = goto(state, symbol, augmented-grammar) + + if next-state.len() > 0 { + let j = C.position(x => x == next-state) + current-action.insert(symbol, (action-type.SHIFT, j)) + } + } + + for symbol in variables { + let next-state = goto(state, symbol, augmented-grammar) + + if next-state.len() > 0 { + let j = C.position(x => x == next-state) + current-goto.insert(symbol, j) + } + } + + if accept-item in state { + current-action.insert("$", (action-type.ACCEPT, none)) + } + + for item in state { + let lhs = item.at(0) + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + // item is complete (dot at end) and is not the accept item + if dot-index == (rhs.len() - 1) and item != accept-item { + let pure-rhs = rhs.slice(0, dot-index) + if pure-rhs.len() == 0 { pure-rhs = ("\\epsilon",) } + + let rule-index = augmented-grammar.position( + x => x.at(0) == lhs and x.at(1) == pure-rhs + ) + + let follow-A = follow-sets.at(lhs) + for f in follow-A { + let reduce-action = (action-type.REDUCE, rule-index) + + if f in current-action { + // conflict detected and existing entry wins + // TODO: precedence/associativity rules + conflicts.push(( + state: state-idx, + symbol: f, + existing: current-action.at(f), + incoming: reduce-action, + )) + } else { + current-action.insert(f, reduce-action) + } + } + } + } + + ACTION.push(current-action) + GOTO.push(current-goto) + } + + return (ACTION: ACTION, GOTO: GOTO, conflicts: conflicts) +} + + + + + + +#let parse-input(input, ACTION, GOTO, augmented-grammar) = { + let stack = (0,) + let tree-stack = () + let current-input = input + let step = 0 + let history = () + + while current-input.len() > 0 { + step += 1 + // TODO: proper infinite loop detection + if step > 1000 { break } + + let state = stack.last() + let token = current-input.at(0) + let action-dict = ACTION.at(state) + + let act = action-dict.at(token, default: (action-type.ERROR, none)) + + history.push((step: step, stack: stack, input: current-input, action: act)) + + if act.at(0) == action-type.SHIFT { + let next-state = act.at(1) + stack.push(token) + stack.push(next-state) + current-input.remove(0) + tree-stack.push((label: token, children: ())) + + } else if act.at(0) == action-type.REDUCE { + let rule-index = act.at(1) + let rule = augmented-grammar.at(rule-index) + let lhs = rule.at(0) + let rhs = rule.at(1) + + let rhs-len = if rhs == ("\\epsilon",) { 0 } else { rhs.len() } + let children = () + + if rhs-len > 0 { + let pop-count = rhs-len * 2 + stack = stack.slice(0, stack.len() - pop-count) + children = tree-stack.slice(tree-stack.len() - rhs-len) + tree-stack = tree-stack.slice(0, tree-stack.len() - rhs-len) + } else { + children = ((label: "\\epsilon", children: ()),) + } + + let top-state = stack.last() + let next-state = GOTO.at(top-state).at(lhs) + + stack.push(lhs) + stack.push(next-state) + tree-stack.push((label: lhs, children: children)) + + } else if act.at(0) == action-type.ACCEPT { + return (success: true, log: history, ast: tree-stack.last()) + + } else { + return (success: false, log: history, ast: none) + } + } + + return (success: false, log: history, ast: none) +} diff --git a/packages/preview/slr-parser/0.0.1/src/vis.typ b/packages/preview/slr-parser/0.0.1/src/vis.typ new file mode 100644 index 0000000000..707695bf63 --- /dev/null +++ b/packages/preview/slr-parser/0.0.1/src/vis.typ @@ -0,0 +1,376 @@ +#import "lib.typ": * +#import "@preview/diagraph:0.3.6": raw-render + + + +#let render-item(item) = { + let (lhs, rhs) = item + let rhs-str = rhs.map(s => if s == "." { text(fill: red.darken(20%))[$bullet.op$] } else if s == "\\epsilon" { $epsilon$ } else { $#s$ }) + box[#$#lhs arrow.r$ #rhs-str.join(h(2pt))] +} + +#let fmt-sym(s, variables) = { + if s == "\\epsilon" { $epsilon$ } + else if s == "$" { text(font: "DejaVu Sans Mono", size: 8pt)[\$] } + else if s in variables { $#s$ } + else { text(font: "DejaVu Sans Mono", size: 8pt)[#s] } +} + +#let dot-escape(s) = { + s.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("'", "\\'") +} + +#let item-to-str(item) = { + let (lhs, rhs) = item + let rhs-s = rhs.map(s => if s == "." { "•" } else if s == "\\epsilon" { "ε" } else { s }).join(" ") + lhs + " → " + rhs-s +} + + + + +#let show-grammar(grammar) = { + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + stroke: none, + align: (center, center, center, left), + inset: (x: 6pt, y: 3pt), + [*\#*], [*Var*], [], [*Production*], + ..grammar.enumerate().map(((i, prod)) => { + let (lhs, rhs) = prod + ( + text(fill: purple.darken(20%))[$#i$], + $#lhs$, + $arrow.r$, + rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), + ) + }).flatten() + ) + ] +} + + +#let show-aug-grammar(grammar) = { + let aug = augment-grammar(grammar) + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + stroke: none, + align: (center, center, center, left), + inset: (x: 6pt, y: 3pt), + [*\#*], [*Var*], [], [*Production*], + ..aug.enumerate().map(((i, prod)) => { + let (lhs, rhs) = prod + ( + text(fill: purple.darken(20%))[$#i$], + $#lhs$, + $arrow.r$, + rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), + ) + }).flatten() + ) + ] +} + + + +#let show-first-follow(grammar) = { + let aug = augment-grammar(grammar) + let vars = get-variables(aug).filter(v => v != aug.at(0).at(0)) + let first = compute-first(aug) + let follow = compute-follow(aug, first) + + block(width: 100%)[ + #table( + columns: (auto, 1fr, 1fr), + inset: (x: 8pt, y: 5pt), + fill: (col, row) => { + if row == 0 { luma(220) } + else if calc.odd(row) { luma(248) } + else { white } + }, [*Variable*], [*FIRST*], [*FOLLOW*], + ..vars.map(v => { + let fi = first.at(v, default: ()).map(s => + if s == "\\epsilon" { strong($epsilon$) } else if s == "$" { strong([\$]) } else { strong($#s$) } + ).join([, ]) + let fo = follow.at(v, default: ()).map(s => + if s == "$" { strong([\$]) } else { strong($#s$) } + ).join([, ]) + ($#v$, fi, fo) + }).flatten() + ) + ] +} + + + +#let show-canonical-items(grammar) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") + + // Build origin map: state-index -> (parent-index, symbol) + let origins = (:) + for (i, state) in C.enumerate() { + for sym in symbols { + let next = goto(state, sym, aug) + if next.len() > 0 { + let j = C.position(x => x == next) + if j != none and str(j) not in origins { + origins.insert(str(j), (i, sym)) + } + } + } + } + + block(width: 100%)[ + #grid( + columns: (1fr, 1fr, 1fr, 1fr, 1fr), + gutter: 10pt, + ..C.enumerate().map(((i, state)) => { + let origin-label = if str(i) in origins { + let (par, sym) = origins.at(str(i)) + text(size: 10pt, fill: purple.darken(20%))[(I#sub[#par], #sym)] + } else { + text(size: 10pt, fill: purple.darken(20%))[#emph[inicial]] + } + block( + stroke: 1pt + luma(100), + inset: 8pt, + width: 100%, + )[ + #text(size: 14pt, weight: "bold", fill: purple.darken(20%))[I#sub[#i]] + #h(4pt) + #origin-label + #stack( + dir: ttb, + spacing: 2pt, + ..state.map(item => render-item(item)) + ) + ] + }) + ) + ] +} + + + +#let show-automaton(grammar, width: 100%) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") + + let edges = () + for (i, state) in C.enumerate() { + for sym in symbols { + let next = goto(state, sym, aug) + if next.len() > 0 { + let j = C.position(x => x == next) + if j != none { + edges.push((i, j, sym)) + } + } + } + } + + + let edge-lines = edges.map(e => { + let (a, b, sym) = e + let lbl = dot-escape(if sym == "\\epsilon" { "ε" } else { sym }) + " I" + str(a) + " -> I" + str(b) + " [label=\"" + lbl + "\"];" + }) + + let dot-src = ( + "digraph LR0 {\n" + + " rankdir=LR;\n" + + " node [margin=\"0.05,0.17\", fontsize=18, fontcolor=darkviolet];\n" + + " edge [fontsize=15];\n" + + edge-lines.join("\n") + "\n" + + "}" + ) + + block(width: 100%)[ + #raw-render(raw(dot-src, lang: "dot"), width: width) + ] +} + + + +#let show-parse-table(grammar) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let result = build-tables(C, aug) + let ACTION = result.ACTION + let GOTO = result.GOTO + let conflicts = result.conflicts + + let terminals = get-terminals(aug).filter(x => x != "\\epsilon") + ("$",) + let variables = get-variables(aug).filter(x => x != aug.at(0).at(0)) // drop S' + + let n-cols = 1 + terminals.len() + variables.len() + + let render-cell(entry) = { + if entry == none { return [] } + let (kind, val) = entry + if kind == action-type.SHIFT { text(weight: "bold", fill: blue.darken(20%))[s#val] } + else if kind == action-type.REDUCE { text(weight: "bold", fill: green.darken(20%))[r#val] } + else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[acc] } + else { [] } + } + + block(width: 100%)[ + #if conflicts.len() > 0 { + block( + fill: red.lighten(80%), + stroke: 0.5pt + red, + inset: 6pt, + radius: 3pt, + )[ + #text(fill: red.darken(20%), weight: "bold")[⚠ Conflicts (#conflicts.len())] + #for c in conflicts [ + - State #c.state, symbol `#c.symbol`: existing #repr(c.existing) vs incoming #repr(c.incoming) + ] + ] + v(6pt) + } + + #table( + columns: range(n-cols).map(_ => auto), + inset: (x: 10pt, y: 6pt), + fill: (col, row) => { + if row == 0 or row == 1 { luma(220) } + else if calc.odd(row) { luma(248) } + else { white } + }, + align: center, + + table.cell(colspan: 1)[], + table.cell(colspan: terminals.len(), stroke: (bottom: 0.5pt + black))[*ACTION*], + table.cell(colspan: variables.len(), stroke: (bottom: 0.5pt + black))[*GOTO*], + + [*STATE*], + ..terminals.map(t => + text(font: "DejaVu Sans Mono", size: 8pt)[*#t*] + ), + ..variables.map(v => $bold(#v)$), + + // Data rows + ..C.enumerate().map(((i, _)) => { + let act-row = ACTION.at(i) + let got-row = GOTO.at(i) + ( + [*#i*], + ..terminals.map(t => render-cell(act-row.at(t, default: none))), + ..variables.map(v => { + let g = got-row.at(v, default: none) + if g != none { [#g] } else { [] } + }), + ) + }).flatten() + ) + ] +} + + + +#let show-parse-trace(grammar, sentence) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let tables = build-tables(C, aug) + let input = sentence + ("$",) + let result = parse-input(input, tables.ACTION, tables.GOTO, aug) + + let action-label(act) = { + let (kind, val) = act + if kind == action-type.SHIFT { [shift #val] } + else if kind == action-type.REDUCE { + let rule = aug.at(val) + let rhs-s = rule.at(1).map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$) + [$"reduce" #rule.at(0) arrow.r #rhs-s$] + } + else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[accept] } + else { text(fill: red)[error] } + } + + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + inset: (x: 7pt, y: 6pt), + fill: (_, row) => if row == 0 { luma(220) } else if calc.odd(row) { luma(248) } else { white }, + [*Step*], [*Stack*], [*Entry*], [*Action*], + ..result.log.map(entry => { + let stk = entry.stack.map(s => str(s)).join(" ") + let inp = entry.input.map(s => if s == "$" { [\$] } else { text(font: "DejaVu Sans Mono")[#s] }).join(h(3pt)) + ( + [#entry.step], + text(font: "DejaVu Sans Mono", size: 8pt)[#stk], + inp, + action-label(entry.action), + ) + }).flatten() + ) + ] +} + + + +#let _ast-to-dot(root) = { + let nodes = () // (id, label, is-leaf) + let edges = () // (parent-id, child-id) + let queue = ((0, root),) + let next-id = 1 + + while queue.len() > 0 { + let (my-id, node) = queue.remove(0) + let is-leaf = node.children.len() == 0 + nodes.push((my-id, node.label, is-leaf)) + + for child in node.children { + edges.push((my-id, next-id)) + queue.push((next-id, child)) + next-id = next-id + 1 + } + } + + let node-lines = nodes.map(n => { + let (id, lbl-raw, leaf) = n + let lbl = dot-escape(if lbl-raw == "\\epsilon" { "ε" } else { lbl-raw }) + let shape = if leaf { "ellipse" } else { "rectangle" } + let fill = if leaf { "#d6eaf8" } else { "#d5f5e3" } + let line = " n" + str(id) + " [label=\"" + lbl + "\", shape=" + shape + ", style=filled, fillcolor=\"" + fill + "\", fontname=\"Courier\", fontsize=10];" + line + }) + + let edge-lines = edges.map(e => { + " n" + str(e.at(0)) + " -> n" + str(e.at(1)) + ";" + }) + + ( + "digraph ParseTree {\n" + + " rankdir=TB;\n" + + node-lines.join("\n") + "\n" + + edge-lines.join("\n") + "\n" + + "}" + ) +} + +#let show-parse-tree(grammar, sentence) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let tables = build-tables(C, aug) + let input = sentence + ("$",) + let result = parse-input(input, tables.ACTION, tables.GOTO, aug) + + block(width: 100%)[ + #if result.ast == none { + text(fill: red)[No parse tree — input was rejected.] + } else { + let dot-src = _ast-to-dot(result.ast) + raw-render(raw(dot-src, lang: "dot")) + } + ] +} diff --git a/packages/preview/slr-parser/0.0.1/typst.toml b/packages/preview/slr-parser/0.0.1/typst.toml new file mode 100644 index 0000000000..5c4909e5bd --- /dev/null +++ b/packages/preview/slr-parser/0.0.1/typst.toml @@ -0,0 +1,14 @@ +[package] +name = "slr-parser" +version = "0.0.1" +entrypoint = "src/vis.typ" +authors = ["Lucas Ramos"] +license = "MIT" +description = "A typst template to visualize SLR parser steps." +homepage = "https://github.com/lukinhasram/slr-visualizer" +repository = "https://github.com/lukinhasram/slr-visualizer" +compiler = "0.15.0" +categories = ["components", "visualization"] +disciplines = ["computer-science", "mathematics", "education", "linguistics"] +keywords = ["parser", "slr", "grammar", "compiler", "AST"] +exclude = ["README.md", "docs", "example.typ", "example.pdf"] \ No newline at end of file From fa6d4dfbbc5af0bbaef87d4d08dbc17766e9becc Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Thu, 25 Jun 2026 14:04:15 -0300 Subject: [PATCH 2/8] add slr-parser-visualizer package --- .../slr-parser-visualizer/0.0.1/LICENSE | 21 + .../slr-parser-visualizer/0.0.1/README.md | 85 ++++ .../0.0.1/docs/example.pdf | Bin 0 -> 224399 bytes .../0.0.1/docs/example.typ | 103 +++++ .../slr-parser-visualizer/0.0.1/src/lib.typ | 397 ++++++++++++++++++ .../slr-parser-visualizer/0.0.1/src/vis.typ | 376 +++++++++++++++++ .../slr-parser-visualizer/0.0.1/typst.toml | 14 + 7 files changed, 996 insertions(+) create mode 100644 packages/preview/slr-parser-visualizer/0.0.1/LICENSE create mode 100644 packages/preview/slr-parser-visualizer/0.0.1/README.md create mode 100644 packages/preview/slr-parser-visualizer/0.0.1/docs/example.pdf create mode 100644 packages/preview/slr-parser-visualizer/0.0.1/docs/example.typ create mode 100644 packages/preview/slr-parser-visualizer/0.0.1/src/lib.typ create mode 100644 packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ create mode 100644 packages/preview/slr-parser-visualizer/0.0.1/typst.toml diff --git a/packages/preview/slr-parser-visualizer/0.0.1/LICENSE b/packages/preview/slr-parser-visualizer/0.0.1/LICENSE new file mode 100644 index 0000000000..624cc3aa8f --- /dev/null +++ b/packages/preview/slr-parser-visualizer/0.0.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 sjfhsjfh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/preview/slr-parser-visualizer/0.0.1/README.md b/packages/preview/slr-parser-visualizer/0.0.1/README.md new file mode 100644 index 0000000000..03180ba542 --- /dev/null +++ b/packages/preview/slr-parser-visualizer/0.0.1/README.md @@ -0,0 +1,85 @@ +# slr-visualizer + +Takes a grammar and a sentence and walks through SLR(1) parsing: augmented +grammar, FIRST/FOLLOW, canonical LR(0) items, the DFA, the ACTION/GOTO +table, a shift-reduce trace, the parse tree. All computed in Typst, no +external script generating a table beforehand. + +It's SLR(1) — LR(0) item sets, but reduce actions only go in when the +symbol's in FOLLOW(LHS). That's the whole difference from plain LR(0). + +See `example.pdf` for what it looks like end to end on: + +``` +C → id ( A ) +A → A , E | ε | E +E → E + T | T +T → id | num | C +``` +parsing `id ( num + id , id ( num + id ) )`. + +## Using it + +```typst +#import "@preview/slr-visualizer:0.1.0": * + +#let my-grammar = ( + ("C", ("id", "(", "A", ")")), + ("A", ("A", ",", "E")), + ("A", ("\\epsilon",)), + ("A", ("E",)), + ("E", ("E", "+", "T")), + ("E", ("T",)), + ("T", ("id",)), + ("T", ("num",)), + ("T", ("C",)), +) + +#let my-sentence = ("id", "(", "num", "+", "id", ",", "id", "(", "num", "+", "id", ")", ")") + +#show-grammar(my-grammar) +#show-parse-table(my-grammar) +#show-parse-trace(my-grammar, my-sentence) +#show-parse-tree(my-grammar, my-sentence) +``` + +A grammar is just a list of `(LHS, RHS)` pairs, RHS being a tuple of +symbols. First production's LHS = start symbol. Anything that's not a LHS +anywhere is a terminal. `"\\epsilon"` for empty productions. Don't use `"."` +as a symbol — it's the LR item dot internally and things will break in +confusing ways if it collides. + +A sentence is just the terminals, no `$` at the end, that gets added for +you. + +## What each function gives you + +`show-grammar` / `show-aug-grammar` — the production list, plain or with the +`S' → S` row added. + +`show-first-follow` — FIRST/FOLLOW per non-terminal. + +`show-canonical-items` — every I_n state, with where it came from. + +`show-automaton(grammar, width: 100%)` — the LR(0) DFA, rendered via +diagraph/Graphviz. + +`show-parse-table` — ACTION/GOTO, conflicts called out in red if there are +any. + +`show-parse-trace` / `show-parse-tree` — take `(grammar, sentence)`, give +you the stack-by-stack trace and the resulting tree. + +All of them take the grammar *before* augmentation — that part's handled +for you. + +## Known gaps + +- SLR(1) conflict resolution, not LALR/LR(1) — if your grammar genuinely + needs per-state lookahead to be unambiguous, you'll see conflicts here + even though a stronger parser wouldn't have any. +- FIRST-set computation only skips direct left recursion (`A → A α`). + Indirect left recursion through another non-terminal isn't handled. +- When there's a real shift/reduce or reduce/reduce conflict, whichever + action got inserted first wins — there's no precedence/associativity + table backing this, it's reported and left at that. diff --git a/packages/preview/slr-parser-visualizer/0.0.1/docs/example.pdf b/packages/preview/slr-parser-visualizer/0.0.1/docs/example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56968917b13a6447efaf8001750a9ae97263b872 GIT binary patch literal 224399 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

o9%g^Ao=m~wIN6T)n1beOwxr?xx`^SreSdy zi#^~!78UV03}PLoV+@VL<1n@u0NrBWF@SaS4X4CwOCDQbHmjQo!X9 z2zZy=L^6+|I%Lxmv~LL@lMtYRM%%0q-f7+fA_%_SDSfcG4kpShPi~1acDrMEkR~v< zPVdCGs+`K!6?QxzH=CU~Dr>MW8v=Q8z*c-G-;lHvme^yK2=*%D;OrMz$eCIkfMJ2^ zZaG<_2Il~v6ViIwkl+)qfa8pY*08SRpM%gxxbBGh

f43N}g-G@1l19U)u@_tB9g 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 { + if i == target { + append-dot(item) + } else { + item + } + }) +} + +#let advance-dot(item) = { + let (lhs, rhs) = item + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let next-symbol = rhs.at(dot-index + 1) + let new-rhs = rhs.slice(0, dot-index) + (next-symbol, ".") + rhs.slice(dot-index + 2) + return (lhs, new-rhs) + } + return item +} + + + +#let closure(state, grammar) = { + let J = state + let changed = true + + while changed { + changed = false + + for item in J { + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let target = rhs.at(dot-index + 1) + let target-prods = grammar.filter(x => x.at(0) == target) + + for prod in target-prods { + let new-item = append-dot(prod) + + if new-item not in J { + J.push(new-item) + changed = true + } + } + } + } + } + + return J +} + +#let goto(state, symbol, grammar) = { + let moved-items = () + + for item in state { + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let next-symbol = rhs.at(dot-index + 1) + + if next-symbol == symbol { + moved-items.push(advance-dot(item)) + } + } + } + + return closure(moved-items, grammar) +} + + + +#let canonical-items(augmented-grammar) = { + let I0 = closure((append-dot(augmented-grammar.at(0)),), augmented-grammar) + let C = (I0,) + let changed = true + let symbols = get-all-symbols(augmented-grammar).filter(x => x != "\\epsilon") + + while changed { + changed = false + + for state in C { + for symbol in symbols { + let next-state = goto(state, symbol, augmented-grammar) + + if (next-state.len() != 0) and (next-state not in C) { + C.push(next-state) + changed = true + } + } + } + } + + return C +} + + + +#let get-first-of-sequence(seq, first-sets) = { + if seq.len() == 0 or seq == ("\\epsilon",) { return ("\\epsilon",) } + let result = () + let all-epsilon = true + for sym in seq { + let sym-first = first-sets.at(sym, default: ()) + for f in sym-first { + if f != "\\epsilon" and f not in result { result.push(f) } + } + if "\\epsilon" not in sym-first { + all-epsilon = false + break + } + } + if all-epsilon and "\\epsilon" not in result { result.push("\\epsilon") } + return result +} + +#let compute-first(grammar) = { + let first-sets = (:) + for sym in get-terminals(grammar) { first-sets.insert(sym, (sym,)) } + for sym in get-variables(grammar) { first-sets.insert(sym, ()) } + + let changed = true + while changed { + changed = false + for prod in grammar { + let lhs = prod.at(0) + let rhs = prod.at(1) + + // skip left-recursive productions entirely + if rhs.at(0) == lhs { continue } + + let rhs-first = get-first-of-sequence(rhs, first-sets) + for f in rhs-first { + let current-first = first-sets.at(lhs) + if f not in current-first { + current-first.push(f) + first-sets.insert(lhs, current-first) + changed = true + } + } + } + } + return first-sets +} + +#let compute-follow(grammar, first-sets) = { + let follow-sets = (:) + let non-terminals = get-variables(grammar) + for nt in non-terminals { follow-sets.insert(nt, ()) } + + let original-start = grammar.at(0).at(1).at(0) + follow-sets.insert(original-start, ("$",)) + + let changed = true + while changed { + changed = false + for prod in grammar { + let lhs = prod.at(0) + let rhs = prod.at(1) + if rhs == ("\\epsilon",) { continue } + + for i in range(rhs.len()) { + let symbol = rhs.at(i) + if symbol in non-terminals { + let beta = rhs.slice(i + 1) + let first-beta = get-first-of-sequence(beta, first-sets) + + for f in first-beta { + if f != "\\epsilon" and f not in follow-sets.at(symbol) { + let sym-follow = follow-sets.at(symbol) + sym-follow.push(f) + follow-sets.insert(symbol, sym-follow) + changed = true + } + } + if "\\epsilon" in first-beta or beta.len() == 0 { + for f in follow-sets.at(lhs) { + if f not in follow-sets.at(symbol) { + let sym-follow = follow-sets.at(symbol) + sym-follow.push(f) + follow-sets.insert(symbol, sym-follow) + changed = true + } + } + } + } + } + } + } + return follow-sets +} + + +// SLR(1) table construction + +// Returns (ACTION: array of dicts, GOTO: array of dicts, conflicts: array) +// Each conflict is a dict: (state: int, symbol: str, existing: action, incoming: action) +// Conflicts are reported but the first entry written wins (shift preferred on shift/reduce so the caller can decide what to do with the conflict list) + +#let build-tables(C, augmented-grammar) = { + let ACTION = () + let GOTO = () + let conflicts = () + + let terminals = get-terminals(augmented-grammar).filter(x => x != "\\epsilon") + let variables = get-variables(augmented-grammar) + + let first-sets = compute-first(augmented-grammar) + let follow-sets = compute-follow(augmented-grammar, first-sets) + + // S' → S . + let start-item = append-dot(augmented-grammar.at(0)) // S' → . S + let accept-item = advance-dot(start-item) // S' → S . + + for (state-idx, state) in C.enumerate() { + let current-action = (:) + let current-goto = (:) + + for symbol in terminals { + let next-state = goto(state, symbol, augmented-grammar) + + if next-state.len() > 0 { + let j = C.position(x => x == next-state) + current-action.insert(symbol, (action-type.SHIFT, j)) + } + } + + for symbol in variables { + let next-state = goto(state, symbol, augmented-grammar) + + if next-state.len() > 0 { + let j = C.position(x => x == next-state) + current-goto.insert(symbol, j) + } + } + + if accept-item in state { + current-action.insert("$", (action-type.ACCEPT, none)) + } + + for item in state { + let lhs = item.at(0) + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + // item is complete (dot at end) and is not the accept item + if dot-index == (rhs.len() - 1) and item != accept-item { + let pure-rhs = rhs.slice(0, dot-index) + if pure-rhs.len() == 0 { pure-rhs = ("\\epsilon",) } + + let rule-index = augmented-grammar.position( + x => x.at(0) == lhs and x.at(1) == pure-rhs + ) + + let follow-A = follow-sets.at(lhs) + for f in follow-A { + let reduce-action = (action-type.REDUCE, rule-index) + + if f in current-action { + // conflict detected and existing entry wins + // TODO: precedence/associativity rules + conflicts.push(( + state: state-idx, + symbol: f, + existing: current-action.at(f), + incoming: reduce-action, + )) + } else { + current-action.insert(f, reduce-action) + } + } + } + } + + ACTION.push(current-action) + GOTO.push(current-goto) + } + + return (ACTION: ACTION, GOTO: GOTO, conflicts: conflicts) +} + + + + + + +#let parse-input(input, ACTION, GOTO, augmented-grammar) = { + let stack = (0,) + let tree-stack = () + let current-input = input + let step = 0 + let history = () + + while current-input.len() > 0 { + step += 1 + // TODO: proper infinite loop detection + if step > 1000 { break } + + let state = stack.last() + let token = current-input.at(0) + let action-dict = ACTION.at(state) + + let act = action-dict.at(token, default: (action-type.ERROR, none)) + + history.push((step: step, stack: stack, input: current-input, action: act)) + + if act.at(0) == action-type.SHIFT { + let next-state = act.at(1) + stack.push(token) + stack.push(next-state) + current-input.remove(0) + tree-stack.push((label: token, children: ())) + + } else if act.at(0) == action-type.REDUCE { + let rule-index = act.at(1) + let rule = augmented-grammar.at(rule-index) + let lhs = rule.at(0) + let rhs = rule.at(1) + + let rhs-len = if rhs == ("\\epsilon",) { 0 } else { rhs.len() } + let children = () + + if rhs-len > 0 { + let pop-count = rhs-len * 2 + stack = stack.slice(0, stack.len() - pop-count) + children = tree-stack.slice(tree-stack.len() - rhs-len) + tree-stack = tree-stack.slice(0, tree-stack.len() - rhs-len) + } else { + children = ((label: "\\epsilon", children: ()),) + } + + let top-state = stack.last() + let next-state = GOTO.at(top-state).at(lhs) + + stack.push(lhs) + stack.push(next-state) + tree-stack.push((label: lhs, children: children)) + + } else if act.at(0) == action-type.ACCEPT { + return (success: true, log: history, ast: tree-stack.last()) + + } else { + return (success: false, log: history, ast: none) + } + } + + return (success: false, log: history, ast: none) +} diff --git a/packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ b/packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ new file mode 100644 index 0000000000..707695bf63 --- /dev/null +++ b/packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ @@ -0,0 +1,376 @@ +#import "lib.typ": * +#import "@preview/diagraph:0.3.6": raw-render + + + +#let render-item(item) = { + let (lhs, rhs) = item + let rhs-str = rhs.map(s => if s == "." { text(fill: red.darken(20%))[$bullet.op$] } else if s == "\\epsilon" { $epsilon$ } else { $#s$ }) + box[#$#lhs arrow.r$ #rhs-str.join(h(2pt))] +} + +#let fmt-sym(s, variables) = { + if s == "\\epsilon" { $epsilon$ } + else if s == "$" { text(font: "DejaVu Sans Mono", size: 8pt)[\$] } + else if s in variables { $#s$ } + else { text(font: "DejaVu Sans Mono", size: 8pt)[#s] } +} + +#let dot-escape(s) = { + s.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("'", "\\'") +} + +#let item-to-str(item) = { + let (lhs, rhs) = item + let rhs-s = rhs.map(s => if s == "." { "•" } else if s == "\\epsilon" { "ε" } else { s }).join(" ") + lhs + " → " + rhs-s +} + + + + +#let show-grammar(grammar) = { + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + stroke: none, + align: (center, center, center, left), + inset: (x: 6pt, y: 3pt), + [*\#*], [*Var*], [], [*Production*], + ..grammar.enumerate().map(((i, prod)) => { + let (lhs, rhs) = prod + ( + text(fill: purple.darken(20%))[$#i$], + $#lhs$, + $arrow.r$, + rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), + ) + }).flatten() + ) + ] +} + + +#let show-aug-grammar(grammar) = { + let aug = augment-grammar(grammar) + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + stroke: none, + align: (center, center, center, left), + inset: (x: 6pt, y: 3pt), + [*\#*], [*Var*], [], [*Production*], + ..aug.enumerate().map(((i, prod)) => { + let (lhs, rhs) = prod + ( + text(fill: purple.darken(20%))[$#i$], + $#lhs$, + $arrow.r$, + rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), + ) + }).flatten() + ) + ] +} + + + +#let show-first-follow(grammar) = { + let aug = augment-grammar(grammar) + let vars = get-variables(aug).filter(v => v != aug.at(0).at(0)) + let first = compute-first(aug) + let follow = compute-follow(aug, first) + + block(width: 100%)[ + #table( + columns: (auto, 1fr, 1fr), + inset: (x: 8pt, y: 5pt), + fill: (col, row) => { + if row == 0 { luma(220) } + else if calc.odd(row) { luma(248) } + else { white } + }, [*Variable*], [*FIRST*], [*FOLLOW*], + ..vars.map(v => { + let fi = first.at(v, default: ()).map(s => + if s == "\\epsilon" { strong($epsilon$) } else if s == "$" { strong([\$]) } else { strong($#s$) } + ).join([, ]) + let fo = follow.at(v, default: ()).map(s => + if s == "$" { strong([\$]) } else { strong($#s$) } + ).join([, ]) + ($#v$, fi, fo) + }).flatten() + ) + ] +} + + + +#let show-canonical-items(grammar) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") + + // Build origin map: state-index -> (parent-index, symbol) + let origins = (:) + for (i, state) in C.enumerate() { + for sym in symbols { + let next = goto(state, sym, aug) + if next.len() > 0 { + let j = C.position(x => x == next) + if j != none and str(j) not in origins { + origins.insert(str(j), (i, sym)) + } + } + } + } + + block(width: 100%)[ + #grid( + columns: (1fr, 1fr, 1fr, 1fr, 1fr), + gutter: 10pt, + ..C.enumerate().map(((i, state)) => { + let origin-label = if str(i) in origins { + let (par, sym) = origins.at(str(i)) + text(size: 10pt, fill: purple.darken(20%))[(I#sub[#par], #sym)] + } else { + text(size: 10pt, fill: purple.darken(20%))[#emph[inicial]] + } + block( + stroke: 1pt + luma(100), + inset: 8pt, + width: 100%, + )[ + #text(size: 14pt, weight: "bold", fill: purple.darken(20%))[I#sub[#i]] + #h(4pt) + #origin-label + #stack( + dir: ttb, + spacing: 2pt, + ..state.map(item => render-item(item)) + ) + ] + }) + ) + ] +} + + + +#let show-automaton(grammar, width: 100%) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") + + let edges = () + for (i, state) in C.enumerate() { + for sym in symbols { + let next = goto(state, sym, aug) + if next.len() > 0 { + let j = C.position(x => x == next) + if j != none { + edges.push((i, j, sym)) + } + } + } + } + + + let edge-lines = edges.map(e => { + let (a, b, sym) = e + let lbl = dot-escape(if sym == "\\epsilon" { "ε" } else { sym }) + " I" + str(a) + " -> I" + str(b) + " [label=\"" + lbl + "\"];" + }) + + let dot-src = ( + "digraph LR0 {\n" + + " rankdir=LR;\n" + + " node [margin=\"0.05,0.17\", fontsize=18, fontcolor=darkviolet];\n" + + " edge [fontsize=15];\n" + + edge-lines.join("\n") + "\n" + + "}" + ) + + block(width: 100%)[ + #raw-render(raw(dot-src, lang: "dot"), width: width) + ] +} + + + +#let show-parse-table(grammar) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let result = build-tables(C, aug) + let ACTION = result.ACTION + let GOTO = result.GOTO + let conflicts = result.conflicts + + let terminals = get-terminals(aug).filter(x => x != "\\epsilon") + ("$",) + let variables = get-variables(aug).filter(x => x != aug.at(0).at(0)) // drop S' + + let n-cols = 1 + terminals.len() + variables.len() + + let render-cell(entry) = { + if entry == none { return [] } + let (kind, val) = entry + if kind == action-type.SHIFT { text(weight: "bold", fill: blue.darken(20%))[s#val] } + else if kind == action-type.REDUCE { text(weight: "bold", fill: green.darken(20%))[r#val] } + else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[acc] } + else { [] } + } + + block(width: 100%)[ + #if conflicts.len() > 0 { + block( + fill: red.lighten(80%), + stroke: 0.5pt + red, + inset: 6pt, + radius: 3pt, + )[ + #text(fill: red.darken(20%), weight: "bold")[⚠ Conflicts (#conflicts.len())] + #for c in conflicts [ + - State #c.state, symbol `#c.symbol`: existing #repr(c.existing) vs incoming #repr(c.incoming) + ] + ] + v(6pt) + } + + #table( + columns: range(n-cols).map(_ => auto), + inset: (x: 10pt, y: 6pt), + fill: (col, row) => { + if row == 0 or row == 1 { luma(220) } + else if calc.odd(row) { luma(248) } + else { white } + }, + align: center, + + table.cell(colspan: 1)[], + table.cell(colspan: terminals.len(), stroke: (bottom: 0.5pt + black))[*ACTION*], + table.cell(colspan: variables.len(), stroke: (bottom: 0.5pt + black))[*GOTO*], + + [*STATE*], + ..terminals.map(t => + text(font: "DejaVu Sans Mono", size: 8pt)[*#t*] + ), + ..variables.map(v => $bold(#v)$), + + // Data rows + ..C.enumerate().map(((i, _)) => { + let act-row = ACTION.at(i) + let got-row = GOTO.at(i) + ( + [*#i*], + ..terminals.map(t => render-cell(act-row.at(t, default: none))), + ..variables.map(v => { + let g = got-row.at(v, default: none) + if g != none { [#g] } else { [] } + }), + ) + }).flatten() + ) + ] +} + + + +#let show-parse-trace(grammar, sentence) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let tables = build-tables(C, aug) + let input = sentence + ("$",) + let result = parse-input(input, tables.ACTION, tables.GOTO, aug) + + let action-label(act) = { + let (kind, val) = act + if kind == action-type.SHIFT { [shift #val] } + else if kind == action-type.REDUCE { + let rule = aug.at(val) + let rhs-s = rule.at(1).map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$) + [$"reduce" #rule.at(0) arrow.r #rhs-s$] + } + else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[accept] } + else { text(fill: red)[error] } + } + + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + inset: (x: 7pt, y: 6pt), + fill: (_, row) => if row == 0 { luma(220) } else if calc.odd(row) { luma(248) } else { white }, + [*Step*], [*Stack*], [*Entry*], [*Action*], + ..result.log.map(entry => { + let stk = entry.stack.map(s => str(s)).join(" ") + let inp = entry.input.map(s => if s == "$" { [\$] } else { text(font: "DejaVu Sans Mono")[#s] }).join(h(3pt)) + ( + [#entry.step], + text(font: "DejaVu Sans Mono", size: 8pt)[#stk], + inp, + action-label(entry.action), + ) + }).flatten() + ) + ] +} + + + +#let _ast-to-dot(root) = { + let nodes = () // (id, label, is-leaf) + let edges = () // (parent-id, child-id) + let queue = ((0, root),) + let next-id = 1 + + while queue.len() > 0 { + let (my-id, node) = queue.remove(0) + let is-leaf = node.children.len() == 0 + nodes.push((my-id, node.label, is-leaf)) + + for child in node.children { + edges.push((my-id, next-id)) + queue.push((next-id, child)) + next-id = next-id + 1 + } + } + + let node-lines = nodes.map(n => { + let (id, lbl-raw, leaf) = n + let lbl = dot-escape(if lbl-raw == "\\epsilon" { "ε" } else { lbl-raw }) + let shape = if leaf { "ellipse" } else { "rectangle" } + let fill = if leaf { "#d6eaf8" } else { "#d5f5e3" } + let line = " n" + str(id) + " [label=\"" + lbl + "\", shape=" + shape + ", style=filled, fillcolor=\"" + fill + "\", fontname=\"Courier\", fontsize=10];" + line + }) + + let edge-lines = edges.map(e => { + " n" + str(e.at(0)) + " -> n" + str(e.at(1)) + ";" + }) + + ( + "digraph ParseTree {\n" + + " rankdir=TB;\n" + + node-lines.join("\n") + "\n" + + edge-lines.join("\n") + "\n" + + "}" + ) +} + +#let show-parse-tree(grammar, sentence) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let tables = build-tables(C, aug) + let input = sentence + ("$",) + let result = parse-input(input, tables.ACTION, tables.GOTO, aug) + + block(width: 100%)[ + #if result.ast == none { + text(fill: red)[No parse tree — input was rejected.] + } else { + let dot-src = _ast-to-dot(result.ast) + raw-render(raw(dot-src, lang: "dot")) + } + ] +} diff --git a/packages/preview/slr-parser-visualizer/0.0.1/typst.toml b/packages/preview/slr-parser-visualizer/0.0.1/typst.toml new file mode 100644 index 0000000000..d10e1a00ae --- /dev/null +++ b/packages/preview/slr-parser-visualizer/0.0.1/typst.toml @@ -0,0 +1,14 @@ +[package] +name = "slr-visualizer" +version = "0.0.1" +entrypoint = "src/vis.typ" +authors = ["Lucas Ramos"] +license = "MIT" +description = "A typst template to visualize SLR parser steps." +homepage = "https://github.com/lukinhasram/slr-visualizer" +repository = "https://github.com/lukinhasram/slr-visualizer" +compiler = "0.15.0" +categories = ["components", "visualization"] +disciplines = ["computer-science", "mathematics", "education", "linguistics"] +keywords = ["parser", "slr", "grammar", "compiler", "AST"] +exclude = ["README.md", "docs", "example.typ", "example.pdf"] \ No newline at end of file From 29c113b3cf624ad488880bdb4d905e7f2b8bd46a Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Thu, 25 Jun 2026 14:32:56 -0300 Subject: [PATCH 3/8] add slr8 package --- packages/preview/slr8/0.0.1/LICENSE | 21 + packages/preview/slr8/0.0.1/README.md | 85 ++++ packages/preview/slr8/0.0.1/docs/example.pdf | Bin 0 -> 224399 bytes packages/preview/slr8/0.0.1/docs/example.typ | 103 +++++ packages/preview/slr8/0.0.1/src/lib.typ | 397 +++++++++++++++++++ packages/preview/slr8/0.0.1/src/vis.typ | 376 ++++++++++++++++++ packages/preview/slr8/0.0.1/typst.toml | 14 + 7 files changed, 996 insertions(+) create mode 100644 packages/preview/slr8/0.0.1/LICENSE create mode 100644 packages/preview/slr8/0.0.1/README.md create mode 100644 packages/preview/slr8/0.0.1/docs/example.pdf create mode 100644 packages/preview/slr8/0.0.1/docs/example.typ create mode 100644 packages/preview/slr8/0.0.1/src/lib.typ create mode 100644 packages/preview/slr8/0.0.1/src/vis.typ create mode 100644 packages/preview/slr8/0.0.1/typst.toml diff --git a/packages/preview/slr8/0.0.1/LICENSE b/packages/preview/slr8/0.0.1/LICENSE new file mode 100644 index 0000000000..624cc3aa8f --- /dev/null +++ b/packages/preview/slr8/0.0.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 sjfhsjfh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/preview/slr8/0.0.1/README.md b/packages/preview/slr8/0.0.1/README.md new file mode 100644 index 0000000000..6a69263956 --- /dev/null +++ b/packages/preview/slr8/0.0.1/README.md @@ -0,0 +1,85 @@ +# slr8 + +Takes a grammar and a sentence and walks through SLR(1) parsing: augmented +grammar, FIRST/FOLLOW, canonical LR(0) items, the DFA, the ACTION/GOTO +table, a shift-reduce trace, the parse tree. All computed in Typst, no +external script generating a table beforehand. + +It's SLR(1) — LR(0) item sets, but reduce actions only go in when the +symbol's in FOLLOW(LHS). That's the whole difference from plain LR(0). + +See `example.pdf` for what it looks like end to end on: + +``` +C → id ( A ) +A → A , E | ε | E +E → E + T | T +T → id | num | C +``` +parsing `id ( num + id , id ( num + id ) )`. + +## Using it + +```typst +#import "@preview/slr8:0.0.1": * + +#let my-grammar = ( + ("C", ("id", "(", "A", ")")), + ("A", ("A", ",", "E")), + ("A", ("\\epsilon",)), + ("A", ("E",)), + ("E", ("E", "+", "T")), + ("E", ("T",)), + ("T", ("id",)), + ("T", ("num",)), + ("T", ("C",)), +) + +#let my-sentence = ("id", "(", "num", "+", "id", ",", "id", "(", "num", "+", "id", ")", ")") + +#show-grammar(my-grammar) +#show-parse-table(my-grammar) +#show-parse-trace(my-grammar, my-sentence) +#show-parse-tree(my-grammar, my-sentence) +``` + +A grammar is just a list of `(LHS, RHS)` pairs, RHS being a tuple of +symbols. First production's LHS = start symbol. Anything that's not a LHS +anywhere is a terminal. `"\\epsilon"` for empty productions. Don't use `"."` +as a symbol — it's the LR item dot internally and things will break in +confusing ways if it collides. + +A sentence is just the terminals, no `$` at the end, that gets added for +you. + +## What each function gives you + +`show-grammar` / `show-aug-grammar` — the production list, plain or with the +`S' → S` row added. + +`show-first-follow` — FIRST/FOLLOW per non-terminal. + +`show-canonical-items` — every I_n state, with where it came from. + +`show-automaton(grammar, width: 100%)` — the LR(0) DFA, rendered via +diagraph/Graphviz. + +`show-parse-table` — ACTION/GOTO, conflicts called out in red if there are +any. + +`show-parse-trace` / `show-parse-tree` — take `(grammar, sentence)`, give +you the stack-by-stack trace and the resulting tree. + +All of them take the grammar *before* augmentation — that part's handled +for you. + +## Known gaps + +- SLR(1) conflict resolution, not LALR/LR(1) — if your grammar genuinely + needs per-state lookahead to be unambiguous, you'll see conflicts here + even though a stronger parser wouldn't have any. +- FIRST-set computation only skips direct left recursion (`A → A α`). + Indirect left recursion through another non-terminal isn't handled. +- When there's a real shift/reduce or reduce/reduce conflict, whichever + action got inserted first wins — there's no precedence/associativity + table backing this, it's reported and left at that. diff --git a/packages/preview/slr8/0.0.1/docs/example.pdf b/packages/preview/slr8/0.0.1/docs/example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56968917b13a6447efaf8001750a9ae97263b872 GIT binary patch literal 224399 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

o9%g^Ao=m~wIN6T)n1beOwxr?xx`^SreSdy zi#^~!78UV03}PLoV+@VL<1n@u0NrBWF@SaS4X4CwOCDQbHmjQo!X9 z2zZy=L^6+|I%Lxmv~LL@lMtYRM%%0q-f7+fA_%_SDSfcG4kpShPi~1acDrMEkR~v< zPVdCGs+`K!6?QxzH=CU~Dr>MW8v=Q8z*c-G-;lHvme^yK2=*%D;OrMz$eCIkfMJ2^ zZaG<_2Il~v6ViIwkl+)qfa8pY*08SRpM%gxxbBGh

f43N}g-G@1l19U)u@_tB9g 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 { + if i == target { + append-dot(item) + } else { + item + } + }) +} + +#let advance-dot(item) = { + let (lhs, rhs) = item + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let next-symbol = rhs.at(dot-index + 1) + let new-rhs = rhs.slice(0, dot-index) + (next-symbol, ".") + rhs.slice(dot-index + 2) + return (lhs, new-rhs) + } + return item +} + + + +#let closure(state, grammar) = { + let J = state + let changed = true + + while changed { + changed = false + + for item in J { + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let target = rhs.at(dot-index + 1) + let target-prods = grammar.filter(x => x.at(0) == target) + + for prod in target-prods { + let new-item = append-dot(prod) + + if new-item not in J { + J.push(new-item) + changed = true + } + } + } + } + } + + return J +} + +#let goto(state, symbol, grammar) = { + let moved-items = () + + for item in state { + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + if dot-index != none and (dot-index + 1) < rhs.len() { + let next-symbol = rhs.at(dot-index + 1) + + if next-symbol == symbol { + moved-items.push(advance-dot(item)) + } + } + } + + return closure(moved-items, grammar) +} + + + +#let canonical-items(augmented-grammar) = { + let I0 = closure((append-dot(augmented-grammar.at(0)),), augmented-grammar) + let C = (I0,) + let changed = true + let symbols = get-all-symbols(augmented-grammar).filter(x => x != "\\epsilon") + + while changed { + changed = false + + for state in C { + for symbol in symbols { + let next-state = goto(state, symbol, augmented-grammar) + + if (next-state.len() != 0) and (next-state not in C) { + C.push(next-state) + changed = true + } + } + } + } + + return C +} + + + +#let get-first-of-sequence(seq, first-sets) = { + if seq.len() == 0 or seq == ("\\epsilon",) { return ("\\epsilon",) } + let result = () + let all-epsilon = true + for sym in seq { + let sym-first = first-sets.at(sym, default: ()) + for f in sym-first { + if f != "\\epsilon" and f not in result { result.push(f) } + } + if "\\epsilon" not in sym-first { + all-epsilon = false + break + } + } + if all-epsilon and "\\epsilon" not in result { result.push("\\epsilon") } + return result +} + +#let compute-first(grammar) = { + let first-sets = (:) + for sym in get-terminals(grammar) { first-sets.insert(sym, (sym,)) } + for sym in get-variables(grammar) { first-sets.insert(sym, ()) } + + let changed = true + while changed { + changed = false + for prod in grammar { + let lhs = prod.at(0) + let rhs = prod.at(1) + + // skip left-recursive productions entirely + if rhs.at(0) == lhs { continue } + + let rhs-first = get-first-of-sequence(rhs, first-sets) + for f in rhs-first { + let current-first = first-sets.at(lhs) + if f not in current-first { + current-first.push(f) + first-sets.insert(lhs, current-first) + changed = true + } + } + } + } + return first-sets +} + +#let compute-follow(grammar, first-sets) = { + let follow-sets = (:) + let non-terminals = get-variables(grammar) + for nt in non-terminals { follow-sets.insert(nt, ()) } + + let original-start = grammar.at(0).at(1).at(0) + follow-sets.insert(original-start, ("$",)) + + let changed = true + while changed { + changed = false + for prod in grammar { + let lhs = prod.at(0) + let rhs = prod.at(1) + if rhs == ("\\epsilon",) { continue } + + for i in range(rhs.len()) { + let symbol = rhs.at(i) + if symbol in non-terminals { + let beta = rhs.slice(i + 1) + let first-beta = get-first-of-sequence(beta, first-sets) + + for f in first-beta { + if f != "\\epsilon" and f not in follow-sets.at(symbol) { + let sym-follow = follow-sets.at(symbol) + sym-follow.push(f) + follow-sets.insert(symbol, sym-follow) + changed = true + } + } + if "\\epsilon" in first-beta or beta.len() == 0 { + for f in follow-sets.at(lhs) { + if f not in follow-sets.at(symbol) { + let sym-follow = follow-sets.at(symbol) + sym-follow.push(f) + follow-sets.insert(symbol, sym-follow) + changed = true + } + } + } + } + } + } + } + return follow-sets +} + + +// SLR(1) table construction + +// Returns (ACTION: array of dicts, GOTO: array of dicts, conflicts: array) +// Each conflict is a dict: (state: int, symbol: str, existing: action, incoming: action) +// Conflicts are reported but the first entry written wins (shift preferred on shift/reduce so the caller can decide what to do with the conflict list) + +#let build-tables(C, augmented-grammar) = { + let ACTION = () + let GOTO = () + let conflicts = () + + let terminals = get-terminals(augmented-grammar).filter(x => x != "\\epsilon") + let variables = get-variables(augmented-grammar) + + let first-sets = compute-first(augmented-grammar) + let follow-sets = compute-follow(augmented-grammar, first-sets) + + // S' → S . + let start-item = append-dot(augmented-grammar.at(0)) // S' → . S + let accept-item = advance-dot(start-item) // S' → S . + + for (state-idx, state) in C.enumerate() { + let current-action = (:) + let current-goto = (:) + + for symbol in terminals { + let next-state = goto(state, symbol, augmented-grammar) + + if next-state.len() > 0 { + let j = C.position(x => x == next-state) + current-action.insert(symbol, (action-type.SHIFT, j)) + } + } + + for symbol in variables { + let next-state = goto(state, symbol, augmented-grammar) + + if next-state.len() > 0 { + let j = C.position(x => x == next-state) + current-goto.insert(symbol, j) + } + } + + if accept-item in state { + current-action.insert("$", (action-type.ACCEPT, none)) + } + + for item in state { + let lhs = item.at(0) + let rhs = item.at(1) + let dot-index = rhs.position(x => x == ".") + + // item is complete (dot at end) and is not the accept item + if dot-index == (rhs.len() - 1) and item != accept-item { + let pure-rhs = rhs.slice(0, dot-index) + if pure-rhs.len() == 0 { pure-rhs = ("\\epsilon",) } + + let rule-index = augmented-grammar.position( + x => x.at(0) == lhs and x.at(1) == pure-rhs + ) + + let follow-A = follow-sets.at(lhs) + for f in follow-A { + let reduce-action = (action-type.REDUCE, rule-index) + + if f in current-action { + // conflict detected and existing entry wins + // TODO: precedence/associativity rules + conflicts.push(( + state: state-idx, + symbol: f, + existing: current-action.at(f), + incoming: reduce-action, + )) + } else { + current-action.insert(f, reduce-action) + } + } + } + } + + ACTION.push(current-action) + GOTO.push(current-goto) + } + + return (ACTION: ACTION, GOTO: GOTO, conflicts: conflicts) +} + + + + + + +#let parse-input(input, ACTION, GOTO, augmented-grammar) = { + let stack = (0,) + let tree-stack = () + let current-input = input + let step = 0 + let history = () + + while current-input.len() > 0 { + step += 1 + // TODO: proper infinite loop detection + if step > 1000 { break } + + let state = stack.last() + let token = current-input.at(0) + let action-dict = ACTION.at(state) + + let act = action-dict.at(token, default: (action-type.ERROR, none)) + + history.push((step: step, stack: stack, input: current-input, action: act)) + + if act.at(0) == action-type.SHIFT { + let next-state = act.at(1) + stack.push(token) + stack.push(next-state) + current-input.remove(0) + tree-stack.push((label: token, children: ())) + + } else if act.at(0) == action-type.REDUCE { + let rule-index = act.at(1) + let rule = augmented-grammar.at(rule-index) + let lhs = rule.at(0) + let rhs = rule.at(1) + + let rhs-len = if rhs == ("\\epsilon",) { 0 } else { rhs.len() } + let children = () + + if rhs-len > 0 { + let pop-count = rhs-len * 2 + stack = stack.slice(0, stack.len() - pop-count) + children = tree-stack.slice(tree-stack.len() - rhs-len) + tree-stack = tree-stack.slice(0, tree-stack.len() - rhs-len) + } else { + children = ((label: "\\epsilon", children: ()),) + } + + let top-state = stack.last() + let next-state = GOTO.at(top-state).at(lhs) + + stack.push(lhs) + stack.push(next-state) + tree-stack.push((label: lhs, children: children)) + + } else if act.at(0) == action-type.ACCEPT { + return (success: true, log: history, ast: tree-stack.last()) + + } else { + return (success: false, log: history, ast: none) + } + } + + return (success: false, log: history, ast: none) +} diff --git a/packages/preview/slr8/0.0.1/src/vis.typ b/packages/preview/slr8/0.0.1/src/vis.typ new file mode 100644 index 0000000000..707695bf63 --- /dev/null +++ b/packages/preview/slr8/0.0.1/src/vis.typ @@ -0,0 +1,376 @@ +#import "lib.typ": * +#import "@preview/diagraph:0.3.6": raw-render + + + +#let render-item(item) = { + let (lhs, rhs) = item + let rhs-str = rhs.map(s => if s == "." { text(fill: red.darken(20%))[$bullet.op$] } else if s == "\\epsilon" { $epsilon$ } else { $#s$ }) + box[#$#lhs arrow.r$ #rhs-str.join(h(2pt))] +} + +#let fmt-sym(s, variables) = { + if s == "\\epsilon" { $epsilon$ } + else if s == "$" { text(font: "DejaVu Sans Mono", size: 8pt)[\$] } + else if s in variables { $#s$ } + else { text(font: "DejaVu Sans Mono", size: 8pt)[#s] } +} + +#let dot-escape(s) = { + s.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("'", "\\'") +} + +#let item-to-str(item) = { + let (lhs, rhs) = item + let rhs-s = rhs.map(s => if s == "." { "•" } else if s == "\\epsilon" { "ε" } else { s }).join(" ") + lhs + " → " + rhs-s +} + + + + +#let show-grammar(grammar) = { + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + stroke: none, + align: (center, center, center, left), + inset: (x: 6pt, y: 3pt), + [*\#*], [*Var*], [], [*Production*], + ..grammar.enumerate().map(((i, prod)) => { + let (lhs, rhs) = prod + ( + text(fill: purple.darken(20%))[$#i$], + $#lhs$, + $arrow.r$, + rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), + ) + }).flatten() + ) + ] +} + + +#let show-aug-grammar(grammar) = { + let aug = augment-grammar(grammar) + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + stroke: none, + align: (center, center, center, left), + inset: (x: 6pt, y: 3pt), + [*\#*], [*Var*], [], [*Production*], + ..aug.enumerate().map(((i, prod)) => { + let (lhs, rhs) = prod + ( + text(fill: purple.darken(20%))[$#i$], + $#lhs$, + $arrow.r$, + rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), + ) + }).flatten() + ) + ] +} + + + +#let show-first-follow(grammar) = { + let aug = augment-grammar(grammar) + let vars = get-variables(aug).filter(v => v != aug.at(0).at(0)) + let first = compute-first(aug) + let follow = compute-follow(aug, first) + + block(width: 100%)[ + #table( + columns: (auto, 1fr, 1fr), + inset: (x: 8pt, y: 5pt), + fill: (col, row) => { + if row == 0 { luma(220) } + else if calc.odd(row) { luma(248) } + else { white } + }, [*Variable*], [*FIRST*], [*FOLLOW*], + ..vars.map(v => { + let fi = first.at(v, default: ()).map(s => + if s == "\\epsilon" { strong($epsilon$) } else if s == "$" { strong([\$]) } else { strong($#s$) } + ).join([, ]) + let fo = follow.at(v, default: ()).map(s => + if s == "$" { strong([\$]) } else { strong($#s$) } + ).join([, ]) + ($#v$, fi, fo) + }).flatten() + ) + ] +} + + + +#let show-canonical-items(grammar) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") + + // Build origin map: state-index -> (parent-index, symbol) + let origins = (:) + for (i, state) in C.enumerate() { + for sym in symbols { + let next = goto(state, sym, aug) + if next.len() > 0 { + let j = C.position(x => x == next) + if j != none and str(j) not in origins { + origins.insert(str(j), (i, sym)) + } + } + } + } + + block(width: 100%)[ + #grid( + columns: (1fr, 1fr, 1fr, 1fr, 1fr), + gutter: 10pt, + ..C.enumerate().map(((i, state)) => { + let origin-label = if str(i) in origins { + let (par, sym) = origins.at(str(i)) + text(size: 10pt, fill: purple.darken(20%))[(I#sub[#par], #sym)] + } else { + text(size: 10pt, fill: purple.darken(20%))[#emph[inicial]] + } + block( + stroke: 1pt + luma(100), + inset: 8pt, + width: 100%, + )[ + #text(size: 14pt, weight: "bold", fill: purple.darken(20%))[I#sub[#i]] + #h(4pt) + #origin-label + #stack( + dir: ttb, + spacing: 2pt, + ..state.map(item => render-item(item)) + ) + ] + }) + ) + ] +} + + + +#let show-automaton(grammar, width: 100%) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") + + let edges = () + for (i, state) in C.enumerate() { + for sym in symbols { + let next = goto(state, sym, aug) + if next.len() > 0 { + let j = C.position(x => x == next) + if j != none { + edges.push((i, j, sym)) + } + } + } + } + + + let edge-lines = edges.map(e => { + let (a, b, sym) = e + let lbl = dot-escape(if sym == "\\epsilon" { "ε" } else { sym }) + " I" + str(a) + " -> I" + str(b) + " [label=\"" + lbl + "\"];" + }) + + let dot-src = ( + "digraph LR0 {\n" + + " rankdir=LR;\n" + + " node [margin=\"0.05,0.17\", fontsize=18, fontcolor=darkviolet];\n" + + " edge [fontsize=15];\n" + + edge-lines.join("\n") + "\n" + + "}" + ) + + block(width: 100%)[ + #raw-render(raw(dot-src, lang: "dot"), width: width) + ] +} + + + +#let show-parse-table(grammar) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let result = build-tables(C, aug) + let ACTION = result.ACTION + let GOTO = result.GOTO + let conflicts = result.conflicts + + let terminals = get-terminals(aug).filter(x => x != "\\epsilon") + ("$",) + let variables = get-variables(aug).filter(x => x != aug.at(0).at(0)) // drop S' + + let n-cols = 1 + terminals.len() + variables.len() + + let render-cell(entry) = { + if entry == none { return [] } + let (kind, val) = entry + if kind == action-type.SHIFT { text(weight: "bold", fill: blue.darken(20%))[s#val] } + else if kind == action-type.REDUCE { text(weight: "bold", fill: green.darken(20%))[r#val] } + else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[acc] } + else { [] } + } + + block(width: 100%)[ + #if conflicts.len() > 0 { + block( + fill: red.lighten(80%), + stroke: 0.5pt + red, + inset: 6pt, + radius: 3pt, + )[ + #text(fill: red.darken(20%), weight: "bold")[⚠ Conflicts (#conflicts.len())] + #for c in conflicts [ + - State #c.state, symbol `#c.symbol`: existing #repr(c.existing) vs incoming #repr(c.incoming) + ] + ] + v(6pt) + } + + #table( + columns: range(n-cols).map(_ => auto), + inset: (x: 10pt, y: 6pt), + fill: (col, row) => { + if row == 0 or row == 1 { luma(220) } + else if calc.odd(row) { luma(248) } + else { white } + }, + align: center, + + table.cell(colspan: 1)[], + table.cell(colspan: terminals.len(), stroke: (bottom: 0.5pt + black))[*ACTION*], + table.cell(colspan: variables.len(), stroke: (bottom: 0.5pt + black))[*GOTO*], + + [*STATE*], + ..terminals.map(t => + text(font: "DejaVu Sans Mono", size: 8pt)[*#t*] + ), + ..variables.map(v => $bold(#v)$), + + // Data rows + ..C.enumerate().map(((i, _)) => { + let act-row = ACTION.at(i) + let got-row = GOTO.at(i) + ( + [*#i*], + ..terminals.map(t => render-cell(act-row.at(t, default: none))), + ..variables.map(v => { + let g = got-row.at(v, default: none) + if g != none { [#g] } else { [] } + }), + ) + }).flatten() + ) + ] +} + + + +#let show-parse-trace(grammar, sentence) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let tables = build-tables(C, aug) + let input = sentence + ("$",) + let result = parse-input(input, tables.ACTION, tables.GOTO, aug) + + let action-label(act) = { + let (kind, val) = act + if kind == action-type.SHIFT { [shift #val] } + else if kind == action-type.REDUCE { + let rule = aug.at(val) + let rhs-s = rule.at(1).map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$) + [$"reduce" #rule.at(0) arrow.r #rhs-s$] + } + else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[accept] } + else { text(fill: red)[error] } + } + + block(width: 100%)[ + #table( + columns: (auto, auto, auto, auto), + inset: (x: 7pt, y: 6pt), + fill: (_, row) => if row == 0 { luma(220) } else if calc.odd(row) { luma(248) } else { white }, + [*Step*], [*Stack*], [*Entry*], [*Action*], + ..result.log.map(entry => { + let stk = entry.stack.map(s => str(s)).join(" ") + let inp = entry.input.map(s => if s == "$" { [\$] } else { text(font: "DejaVu Sans Mono")[#s] }).join(h(3pt)) + ( + [#entry.step], + text(font: "DejaVu Sans Mono", size: 8pt)[#stk], + inp, + action-label(entry.action), + ) + }).flatten() + ) + ] +} + + + +#let _ast-to-dot(root) = { + let nodes = () // (id, label, is-leaf) + let edges = () // (parent-id, child-id) + let queue = ((0, root),) + let next-id = 1 + + while queue.len() > 0 { + let (my-id, node) = queue.remove(0) + let is-leaf = node.children.len() == 0 + nodes.push((my-id, node.label, is-leaf)) + + for child in node.children { + edges.push((my-id, next-id)) + queue.push((next-id, child)) + next-id = next-id + 1 + } + } + + let node-lines = nodes.map(n => { + let (id, lbl-raw, leaf) = n + let lbl = dot-escape(if lbl-raw == "\\epsilon" { "ε" } else { lbl-raw }) + let shape = if leaf { "ellipse" } else { "rectangle" } + let fill = if leaf { "#d6eaf8" } else { "#d5f5e3" } + let line = " n" + str(id) + " [label=\"" + lbl + "\", shape=" + shape + ", style=filled, fillcolor=\"" + fill + "\", fontname=\"Courier\", fontsize=10];" + line + }) + + let edge-lines = edges.map(e => { + " n" + str(e.at(0)) + " -> n" + str(e.at(1)) + ";" + }) + + ( + "digraph ParseTree {\n" + + " rankdir=TB;\n" + + node-lines.join("\n") + "\n" + + edge-lines.join("\n") + "\n" + + "}" + ) +} + +#let show-parse-tree(grammar, sentence) = { + let aug = augment-grammar(grammar) + let C = canonical-items(aug) + let tables = build-tables(C, aug) + let input = sentence + ("$",) + let result = parse-input(input, tables.ACTION, tables.GOTO, aug) + + block(width: 100%)[ + #if result.ast == none { + text(fill: red)[No parse tree — input was rejected.] + } else { + let dot-src = _ast-to-dot(result.ast) + raw-render(raw(dot-src, lang: "dot")) + } + ] +} diff --git a/packages/preview/slr8/0.0.1/typst.toml b/packages/preview/slr8/0.0.1/typst.toml new file mode 100644 index 0000000000..396227fbc7 --- /dev/null +++ b/packages/preview/slr8/0.0.1/typst.toml @@ -0,0 +1,14 @@ +[package] +name = "slr8" +version = "0.0.1" +entrypoint = "src/vis.typ" +authors = ["Lucas Ramos"] +license = "MIT" +description = "A typst template to visualize SLR parser steps." +homepage = "https://github.com/lukinhasram/slr-visualizer" +repository = "https://github.com/lukinhasram/slr-visualizer" +compiler = "0.15.0" +categories = ["components", "visualization"] +disciplines = ["computer-science", "mathematics", "education", "linguistics"] +keywords = ["parser", "slr", "grammar", "compiler", "AST"] +exclude = ["README.md", "docs", "example.typ", "example.pdf"] \ No newline at end of file From 9d13b763a5281125ae5a8a6d5ae80358825e02d0 Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Thu, 25 Jun 2026 14:36:19 -0300 Subject: [PATCH 4/8] remove old package names --- .../slr-parser-visualizer/0.0.1/LICENSE | 21 - .../slr-parser-visualizer/0.0.1/README.md | 85 ---- .../0.0.1/docs/example.pdf | Bin 224399 -> 0 bytes .../0.0.1/docs/example.typ | 103 ----- .../slr-parser-visualizer/0.0.1/src/lib.typ | 397 ------------------ .../slr-parser-visualizer/0.0.1/src/vis.typ | 376 ----------------- .../slr-parser-visualizer/0.0.1/typst.toml | 14 - packages/preview/slr-parser/0.0.1/LICENSE | 21 - packages/preview/slr-parser/0.0.1/README.md | 85 ---- .../preview/slr-parser/0.0.1/docs/example.pdf | Bin 224399 -> 0 bytes .../preview/slr-parser/0.0.1/docs/example.typ | 103 ----- packages/preview/slr-parser/0.0.1/src/lib.typ | 397 ------------------ packages/preview/slr-parser/0.0.1/src/vis.typ | 376 ----------------- packages/preview/slr-parser/0.0.1/typst.toml | 14 - 14 files changed, 1992 deletions(-) delete mode 100644 packages/preview/slr-parser-visualizer/0.0.1/LICENSE delete mode 100644 packages/preview/slr-parser-visualizer/0.0.1/README.md delete mode 100644 packages/preview/slr-parser-visualizer/0.0.1/docs/example.pdf delete mode 100644 packages/preview/slr-parser-visualizer/0.0.1/docs/example.typ delete mode 100644 packages/preview/slr-parser-visualizer/0.0.1/src/lib.typ delete mode 100644 packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ delete mode 100644 packages/preview/slr-parser-visualizer/0.0.1/typst.toml delete mode 100644 packages/preview/slr-parser/0.0.1/LICENSE delete mode 100644 packages/preview/slr-parser/0.0.1/README.md delete mode 100644 packages/preview/slr-parser/0.0.1/docs/example.pdf delete mode 100644 packages/preview/slr-parser/0.0.1/docs/example.typ delete mode 100644 packages/preview/slr-parser/0.0.1/src/lib.typ delete mode 100644 packages/preview/slr-parser/0.0.1/src/vis.typ delete mode 100644 packages/preview/slr-parser/0.0.1/typst.toml diff --git a/packages/preview/slr-parser-visualizer/0.0.1/LICENSE b/packages/preview/slr-parser-visualizer/0.0.1/LICENSE deleted file mode 100644 index 624cc3aa8f..0000000000 --- a/packages/preview/slr-parser-visualizer/0.0.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 sjfhsjfh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/preview/slr-parser-visualizer/0.0.1/README.md b/packages/preview/slr-parser-visualizer/0.0.1/README.md deleted file mode 100644 index 03180ba542..0000000000 --- a/packages/preview/slr-parser-visualizer/0.0.1/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# slr-visualizer - -Takes a grammar and a sentence and walks through SLR(1) parsing: augmented -grammar, FIRST/FOLLOW, canonical LR(0) items, the DFA, the ACTION/GOTO -table, a shift-reduce trace, the parse tree. All computed in Typst, no -external script generating a table beforehand. - -It's SLR(1) — LR(0) item sets, but reduce actions only go in when the -symbol's in FOLLOW(LHS). That's the whole difference from plain LR(0). - -See `example.pdf` for what it looks like end to end on: - -``` -C → id ( A ) -A → A , E | ε | E -E → E + T | T -T → id | num | C -``` -parsing `id ( num + id , id ( num + id ) )`. - -## Using it - -```typst -#import "@preview/slr-visualizer:0.1.0": * - -#let my-grammar = ( - ("C", ("id", "(", "A", ")")), - ("A", ("A", ",", "E")), - ("A", ("\\epsilon",)), - ("A", ("E",)), - ("E", ("E", "+", "T")), - ("E", ("T",)), - ("T", ("id",)), - ("T", ("num",)), - ("T", ("C",)), -) - -#let my-sentence = ("id", "(", "num", "+", "id", ",", "id", "(", "num", "+", "id", ")", ")") - -#show-grammar(my-grammar) -#show-parse-table(my-grammar) -#show-parse-trace(my-grammar, my-sentence) -#show-parse-tree(my-grammar, my-sentence) -``` - -A grammar is just a list of `(LHS, RHS)` pairs, RHS being a tuple of -symbols. First production's LHS = start symbol. Anything that's not a LHS -anywhere is a terminal. `"\\epsilon"` for empty productions. Don't use `"."` -as a symbol — it's the LR item dot internally and things will break in -confusing ways if it collides. - -A sentence is just the terminals, no `$` at the end, that gets added for -you. - -## What each function gives you - -`show-grammar` / `show-aug-grammar` — the production list, plain or with the -`S' → S` row added. - -`show-first-follow` — FIRST/FOLLOW per non-terminal. - -`show-canonical-items` — every I_n state, with where it came from. - -`show-automaton(grammar, width: 100%)` — the LR(0) DFA, rendered via -diagraph/Graphviz. - -`show-parse-table` — ACTION/GOTO, conflicts called out in red if there are -any. - -`show-parse-trace` / `show-parse-tree` — take `(grammar, sentence)`, give -you the stack-by-stack trace and the resulting tree. - -All of them take the grammar *before* augmentation — that part's handled -for you. - -## Known gaps - -- SLR(1) conflict resolution, not LALR/LR(1) — if your grammar genuinely - needs per-state lookahead to be unambiguous, you'll see conflicts here - even though a stronger parser wouldn't have any. -- FIRST-set computation only skips direct left recursion (`A → A α`). - Indirect left recursion through another non-terminal isn't handled. -- When there's a real shift/reduce or reduce/reduce conflict, whichever - action got inserted first wins — there's no precedence/associativity - table backing this, it's reported and left at that. diff --git a/packages/preview/slr-parser-visualizer/0.0.1/docs/example.pdf b/packages/preview/slr-parser-visualizer/0.0.1/docs/example.pdf deleted file mode 100644 index 56968917b13a6447efaf8001750a9ae97263b872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224399 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

o9%g^Ao=m~wIN6T)n1beOwxr?xx`^SreSdy zi#^~!78UV03}PLoV+@VL<1n@u0NrBWF@SaS4X4CwOCDQbHmjQo!X9 z2zZy=L^6+|I%Lxmv~LL@lMtYRM%%0q-f7+fA_%_SDSfcG4kpShPi~1acDrMEkR~v< zPVdCGs+`K!6?QxzH=CU~Dr>MW8v=Q8z*c-G-;lHvme^yK2=*%D;OrMz$eCIkfMJ2^ zZaG<_2Il~v6ViIwkl+)qfa8pY*08SRpM%gxxbBGh

f43N}g-G@1l19U)u@_tB9g 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 { - if i == target { - append-dot(item) - } else { - item - } - }) -} - -#let advance-dot(item) = { - let (lhs, rhs) = item - let dot-index = rhs.position(x => x == ".") - - if dot-index != none and (dot-index + 1) < rhs.len() { - let next-symbol = rhs.at(dot-index + 1) - let new-rhs = rhs.slice(0, dot-index) + (next-symbol, ".") + rhs.slice(dot-index + 2) - return (lhs, new-rhs) - } - return item -} - - - -#let closure(state, grammar) = { - let J = state - let changed = true - - while changed { - changed = false - - for item in J { - let rhs = item.at(1) - let dot-index = rhs.position(x => x == ".") - - if dot-index != none and (dot-index + 1) < rhs.len() { - let target = rhs.at(dot-index + 1) - let target-prods = grammar.filter(x => x.at(0) == target) - - for prod in target-prods { - let new-item = append-dot(prod) - - if new-item not in J { - J.push(new-item) - changed = true - } - } - } - } - } - - return J -} - -#let goto(state, symbol, grammar) = { - let moved-items = () - - for item in state { - let rhs = item.at(1) - let dot-index = rhs.position(x => x == ".") - - if dot-index != none and (dot-index + 1) < rhs.len() { - let next-symbol = rhs.at(dot-index + 1) - - if next-symbol == symbol { - moved-items.push(advance-dot(item)) - } - } - } - - return closure(moved-items, grammar) -} - - - -#let canonical-items(augmented-grammar) = { - let I0 = closure((append-dot(augmented-grammar.at(0)),), augmented-grammar) - let C = (I0,) - let changed = true - let symbols = get-all-symbols(augmented-grammar).filter(x => x != "\\epsilon") - - while changed { - changed = false - - for state in C { - for symbol in symbols { - let next-state = goto(state, symbol, augmented-grammar) - - if (next-state.len() != 0) and (next-state not in C) { - C.push(next-state) - changed = true - } - } - } - } - - return C -} - - - -#let get-first-of-sequence(seq, first-sets) = { - if seq.len() == 0 or seq == ("\\epsilon",) { return ("\\epsilon",) } - let result = () - let all-epsilon = true - for sym in seq { - let sym-first = first-sets.at(sym, default: ()) - for f in sym-first { - if f != "\\epsilon" and f not in result { result.push(f) } - } - if "\\epsilon" not in sym-first { - all-epsilon = false - break - } - } - if all-epsilon and "\\epsilon" not in result { result.push("\\epsilon") } - return result -} - -#let compute-first(grammar) = { - let first-sets = (:) - for sym in get-terminals(grammar) { first-sets.insert(sym, (sym,)) } - for sym in get-variables(grammar) { first-sets.insert(sym, ()) } - - let changed = true - while changed { - changed = false - for prod in grammar { - let lhs = prod.at(0) - let rhs = prod.at(1) - - // skip left-recursive productions entirely - if rhs.at(0) == lhs { continue } - - let rhs-first = get-first-of-sequence(rhs, first-sets) - for f in rhs-first { - let current-first = first-sets.at(lhs) - if f not in current-first { - current-first.push(f) - first-sets.insert(lhs, current-first) - changed = true - } - } - } - } - return first-sets -} - -#let compute-follow(grammar, first-sets) = { - let follow-sets = (:) - let non-terminals = get-variables(grammar) - for nt in non-terminals { follow-sets.insert(nt, ()) } - - let original-start = grammar.at(0).at(1).at(0) - follow-sets.insert(original-start, ("$",)) - - let changed = true - while changed { - changed = false - for prod in grammar { - let lhs = prod.at(0) - let rhs = prod.at(1) - if rhs == ("\\epsilon",) { continue } - - for i in range(rhs.len()) { - let symbol = rhs.at(i) - if symbol in non-terminals { - let beta = rhs.slice(i + 1) - let first-beta = get-first-of-sequence(beta, first-sets) - - for f in first-beta { - if f != "\\epsilon" and f not in follow-sets.at(symbol) { - let sym-follow = follow-sets.at(symbol) - sym-follow.push(f) - follow-sets.insert(symbol, sym-follow) - changed = true - } - } - if "\\epsilon" in first-beta or beta.len() == 0 { - for f in follow-sets.at(lhs) { - if f not in follow-sets.at(symbol) { - let sym-follow = follow-sets.at(symbol) - sym-follow.push(f) - follow-sets.insert(symbol, sym-follow) - changed = true - } - } - } - } - } - } - } - return follow-sets -} - - -// SLR(1) table construction - -// Returns (ACTION: array of dicts, GOTO: array of dicts, conflicts: array) -// Each conflict is a dict: (state: int, symbol: str, existing: action, incoming: action) -// Conflicts are reported but the first entry written wins (shift preferred on shift/reduce so the caller can decide what to do with the conflict list) - -#let build-tables(C, augmented-grammar) = { - let ACTION = () - let GOTO = () - let conflicts = () - - let terminals = get-terminals(augmented-grammar).filter(x => x != "\\epsilon") - let variables = get-variables(augmented-grammar) - - let first-sets = compute-first(augmented-grammar) - let follow-sets = compute-follow(augmented-grammar, first-sets) - - // S' → S . - let start-item = append-dot(augmented-grammar.at(0)) // S' → . S - let accept-item = advance-dot(start-item) // S' → S . - - for (state-idx, state) in C.enumerate() { - let current-action = (:) - let current-goto = (:) - - for symbol in terminals { - let next-state = goto(state, symbol, augmented-grammar) - - if next-state.len() > 0 { - let j = C.position(x => x == next-state) - current-action.insert(symbol, (action-type.SHIFT, j)) - } - } - - for symbol in variables { - let next-state = goto(state, symbol, augmented-grammar) - - if next-state.len() > 0 { - let j = C.position(x => x == next-state) - current-goto.insert(symbol, j) - } - } - - if accept-item in state { - current-action.insert("$", (action-type.ACCEPT, none)) - } - - for item in state { - let lhs = item.at(0) - let rhs = item.at(1) - let dot-index = rhs.position(x => x == ".") - - // item is complete (dot at end) and is not the accept item - if dot-index == (rhs.len() - 1) and item != accept-item { - let pure-rhs = rhs.slice(0, dot-index) - if pure-rhs.len() == 0 { pure-rhs = ("\\epsilon",) } - - let rule-index = augmented-grammar.position( - x => x.at(0) == lhs and x.at(1) == pure-rhs - ) - - let follow-A = follow-sets.at(lhs) - for f in follow-A { - let reduce-action = (action-type.REDUCE, rule-index) - - if f in current-action { - // conflict detected and existing entry wins - // TODO: precedence/associativity rules - conflicts.push(( - state: state-idx, - symbol: f, - existing: current-action.at(f), - incoming: reduce-action, - )) - } else { - current-action.insert(f, reduce-action) - } - } - } - } - - ACTION.push(current-action) - GOTO.push(current-goto) - } - - return (ACTION: ACTION, GOTO: GOTO, conflicts: conflicts) -} - - - - - - -#let parse-input(input, ACTION, GOTO, augmented-grammar) = { - let stack = (0,) - let tree-stack = () - let current-input = input - let step = 0 - let history = () - - while current-input.len() > 0 { - step += 1 - // TODO: proper infinite loop detection - if step > 1000 { break } - - let state = stack.last() - let token = current-input.at(0) - let action-dict = ACTION.at(state) - - let act = action-dict.at(token, default: (action-type.ERROR, none)) - - history.push((step: step, stack: stack, input: current-input, action: act)) - - if act.at(0) == action-type.SHIFT { - let next-state = act.at(1) - stack.push(token) - stack.push(next-state) - current-input.remove(0) - tree-stack.push((label: token, children: ())) - - } else if act.at(0) == action-type.REDUCE { - let rule-index = act.at(1) - let rule = augmented-grammar.at(rule-index) - let lhs = rule.at(0) - let rhs = rule.at(1) - - let rhs-len = if rhs == ("\\epsilon",) { 0 } else { rhs.len() } - let children = () - - if rhs-len > 0 { - let pop-count = rhs-len * 2 - stack = stack.slice(0, stack.len() - pop-count) - children = tree-stack.slice(tree-stack.len() - rhs-len) - tree-stack = tree-stack.slice(0, tree-stack.len() - rhs-len) - } else { - children = ((label: "\\epsilon", children: ()),) - } - - let top-state = stack.last() - let next-state = GOTO.at(top-state).at(lhs) - - stack.push(lhs) - stack.push(next-state) - tree-stack.push((label: lhs, children: children)) - - } else if act.at(0) == action-type.ACCEPT { - return (success: true, log: history, ast: tree-stack.last()) - - } else { - return (success: false, log: history, ast: none) - } - } - - return (success: false, log: history, ast: none) -} diff --git a/packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ b/packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ deleted file mode 100644 index 707695bf63..0000000000 --- a/packages/preview/slr-parser-visualizer/0.0.1/src/vis.typ +++ /dev/null @@ -1,376 +0,0 @@ -#import "lib.typ": * -#import "@preview/diagraph:0.3.6": raw-render - - - -#let render-item(item) = { - let (lhs, rhs) = item - let rhs-str = rhs.map(s => if s == "." { text(fill: red.darken(20%))[$bullet.op$] } else if s == "\\epsilon" { $epsilon$ } else { $#s$ }) - box[#$#lhs arrow.r$ #rhs-str.join(h(2pt))] -} - -#let fmt-sym(s, variables) = { - if s == "\\epsilon" { $epsilon$ } - else if s == "$" { text(font: "DejaVu Sans Mono", size: 8pt)[\$] } - else if s in variables { $#s$ } - else { text(font: "DejaVu Sans Mono", size: 8pt)[#s] } -} - -#let dot-escape(s) = { - s.replace("\\", "\\\\") - .replace("\"", "\\\"") - .replace("\n", "\\n") - .replace("'", "\\'") -} - -#let item-to-str(item) = { - let (lhs, rhs) = item - let rhs-s = rhs.map(s => if s == "." { "•" } else if s == "\\epsilon" { "ε" } else { s }).join(" ") - lhs + " → " + rhs-s -} - - - - -#let show-grammar(grammar) = { - block(width: 100%)[ - #table( - columns: (auto, auto, auto, auto), - stroke: none, - align: (center, center, center, left), - inset: (x: 6pt, y: 3pt), - [*\#*], [*Var*], [], [*Production*], - ..grammar.enumerate().map(((i, prod)) => { - let (lhs, rhs) = prod - ( - text(fill: purple.darken(20%))[$#i$], - $#lhs$, - $arrow.r$, - rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), - ) - }).flatten() - ) - ] -} - - -#let show-aug-grammar(grammar) = { - let aug = augment-grammar(grammar) - block(width: 100%)[ - #table( - columns: (auto, auto, auto, auto), - stroke: none, - align: (center, center, center, left), - inset: (x: 6pt, y: 3pt), - [*\#*], [*Var*], [], [*Production*], - ..aug.enumerate().map(((i, prod)) => { - let (lhs, rhs) = prod - ( - text(fill: purple.darken(20%))[$#i$], - $#lhs$, - $arrow.r$, - rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), - ) - }).flatten() - ) - ] -} - - - -#let show-first-follow(grammar) = { - let aug = augment-grammar(grammar) - let vars = get-variables(aug).filter(v => v != aug.at(0).at(0)) - let first = compute-first(aug) - let follow = compute-follow(aug, first) - - block(width: 100%)[ - #table( - columns: (auto, 1fr, 1fr), - inset: (x: 8pt, y: 5pt), - fill: (col, row) => { - if row == 0 { luma(220) } - else if calc.odd(row) { luma(248) } - else { white } - }, [*Variable*], [*FIRST*], [*FOLLOW*], - ..vars.map(v => { - let fi = first.at(v, default: ()).map(s => - if s == "\\epsilon" { strong($epsilon$) } else if s == "$" { strong([\$]) } else { strong($#s$) } - ).join([, ]) - let fo = follow.at(v, default: ()).map(s => - if s == "$" { strong([\$]) } else { strong($#s$) } - ).join([, ]) - ($#v$, fi, fo) - }).flatten() - ) - ] -} - - - -#let show-canonical-items(grammar) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") - - // Build origin map: state-index -> (parent-index, symbol) - let origins = (:) - for (i, state) in C.enumerate() { - for sym in symbols { - let next = goto(state, sym, aug) - if next.len() > 0 { - let j = C.position(x => x == next) - if j != none and str(j) not in origins { - origins.insert(str(j), (i, sym)) - } - } - } - } - - block(width: 100%)[ - #grid( - columns: (1fr, 1fr, 1fr, 1fr, 1fr), - gutter: 10pt, - ..C.enumerate().map(((i, state)) => { - let origin-label = if str(i) in origins { - let (par, sym) = origins.at(str(i)) - text(size: 10pt, fill: purple.darken(20%))[(I#sub[#par], #sym)] - } else { - text(size: 10pt, fill: purple.darken(20%))[#emph[inicial]] - } - block( - stroke: 1pt + luma(100), - inset: 8pt, - width: 100%, - )[ - #text(size: 14pt, weight: "bold", fill: purple.darken(20%))[I#sub[#i]] - #h(4pt) - #origin-label - #stack( - dir: ttb, - spacing: 2pt, - ..state.map(item => render-item(item)) - ) - ] - }) - ) - ] -} - - - -#let show-automaton(grammar, width: 100%) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") - - let edges = () - for (i, state) in C.enumerate() { - for sym in symbols { - let next = goto(state, sym, aug) - if next.len() > 0 { - let j = C.position(x => x == next) - if j != none { - edges.push((i, j, sym)) - } - } - } - } - - - let edge-lines = edges.map(e => { - let (a, b, sym) = e - let lbl = dot-escape(if sym == "\\epsilon" { "ε" } else { sym }) - " I" + str(a) + " -> I" + str(b) + " [label=\"" + lbl + "\"];" - }) - - let dot-src = ( - "digraph LR0 {\n" - + " rankdir=LR;\n" - + " node [margin=\"0.05,0.17\", fontsize=18, fontcolor=darkviolet];\n" - + " edge [fontsize=15];\n" - + edge-lines.join("\n") + "\n" - + "}" - ) - - block(width: 100%)[ - #raw-render(raw(dot-src, lang: "dot"), width: width) - ] -} - - - -#let show-parse-table(grammar) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let result = build-tables(C, aug) - let ACTION = result.ACTION - let GOTO = result.GOTO - let conflicts = result.conflicts - - let terminals = get-terminals(aug).filter(x => x != "\\epsilon") + ("$",) - let variables = get-variables(aug).filter(x => x != aug.at(0).at(0)) // drop S' - - let n-cols = 1 + terminals.len() + variables.len() - - let render-cell(entry) = { - if entry == none { return [] } - let (kind, val) = entry - if kind == action-type.SHIFT { text(weight: "bold", fill: blue.darken(20%))[s#val] } - else if kind == action-type.REDUCE { text(weight: "bold", fill: green.darken(20%))[r#val] } - else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[acc] } - else { [] } - } - - block(width: 100%)[ - #if conflicts.len() > 0 { - block( - fill: red.lighten(80%), - stroke: 0.5pt + red, - inset: 6pt, - radius: 3pt, - )[ - #text(fill: red.darken(20%), weight: "bold")[⚠ Conflicts (#conflicts.len())] - #for c in conflicts [ - - State #c.state, symbol `#c.symbol`: existing #repr(c.existing) vs incoming #repr(c.incoming) - ] - ] - v(6pt) - } - - #table( - columns: range(n-cols).map(_ => auto), - inset: (x: 10pt, y: 6pt), - fill: (col, row) => { - if row == 0 or row == 1 { luma(220) } - else if calc.odd(row) { luma(248) } - else { white } - }, - align: center, - - table.cell(colspan: 1)[], - table.cell(colspan: terminals.len(), stroke: (bottom: 0.5pt + black))[*ACTION*], - table.cell(colspan: variables.len(), stroke: (bottom: 0.5pt + black))[*GOTO*], - - [*STATE*], - ..terminals.map(t => - text(font: "DejaVu Sans Mono", size: 8pt)[*#t*] - ), - ..variables.map(v => $bold(#v)$), - - // Data rows - ..C.enumerate().map(((i, _)) => { - let act-row = ACTION.at(i) - let got-row = GOTO.at(i) - ( - [*#i*], - ..terminals.map(t => render-cell(act-row.at(t, default: none))), - ..variables.map(v => { - let g = got-row.at(v, default: none) - if g != none { [#g] } else { [] } - }), - ) - }).flatten() - ) - ] -} - - - -#let show-parse-trace(grammar, sentence) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let tables = build-tables(C, aug) - let input = sentence + ("$",) - let result = parse-input(input, tables.ACTION, tables.GOTO, aug) - - let action-label(act) = { - let (kind, val) = act - if kind == action-type.SHIFT { [shift #val] } - else if kind == action-type.REDUCE { - let rule = aug.at(val) - let rhs-s = rule.at(1).map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$) - [$"reduce" #rule.at(0) arrow.r #rhs-s$] - } - else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[accept] } - else { text(fill: red)[error] } - } - - block(width: 100%)[ - #table( - columns: (auto, auto, auto, auto), - inset: (x: 7pt, y: 6pt), - fill: (_, row) => if row == 0 { luma(220) } else if calc.odd(row) { luma(248) } else { white }, - [*Step*], [*Stack*], [*Entry*], [*Action*], - ..result.log.map(entry => { - let stk = entry.stack.map(s => str(s)).join(" ") - let inp = entry.input.map(s => if s == "$" { [\$] } else { text(font: "DejaVu Sans Mono")[#s] }).join(h(3pt)) - ( - [#entry.step], - text(font: "DejaVu Sans Mono", size: 8pt)[#stk], - inp, - action-label(entry.action), - ) - }).flatten() - ) - ] -} - - - -#let _ast-to-dot(root) = { - let nodes = () // (id, label, is-leaf) - let edges = () // (parent-id, child-id) - let queue = ((0, root),) - let next-id = 1 - - while queue.len() > 0 { - let (my-id, node) = queue.remove(0) - let is-leaf = node.children.len() == 0 - nodes.push((my-id, node.label, is-leaf)) - - for child in node.children { - edges.push((my-id, next-id)) - queue.push((next-id, child)) - next-id = next-id + 1 - } - } - - let node-lines = nodes.map(n => { - let (id, lbl-raw, leaf) = n - let lbl = dot-escape(if lbl-raw == "\\epsilon" { "ε" } else { lbl-raw }) - let shape = if leaf { "ellipse" } else { "rectangle" } - let fill = if leaf { "#d6eaf8" } else { "#d5f5e3" } - let line = " n" + str(id) + " [label=\"" + lbl + "\", shape=" + shape + ", style=filled, fillcolor=\"" + fill + "\", fontname=\"Courier\", fontsize=10];" - line - }) - - let edge-lines = edges.map(e => { - " n" + str(e.at(0)) + " -> n" + str(e.at(1)) + ";" - }) - - ( - "digraph ParseTree {\n" - + " rankdir=TB;\n" - + node-lines.join("\n") + "\n" - + edge-lines.join("\n") + "\n" - + "}" - ) -} - -#let show-parse-tree(grammar, sentence) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let tables = build-tables(C, aug) - let input = sentence + ("$",) - let result = parse-input(input, tables.ACTION, tables.GOTO, aug) - - block(width: 100%)[ - #if result.ast == none { - text(fill: red)[No parse tree — input was rejected.] - } else { - let dot-src = _ast-to-dot(result.ast) - raw-render(raw(dot-src, lang: "dot")) - } - ] -} diff --git a/packages/preview/slr-parser-visualizer/0.0.1/typst.toml b/packages/preview/slr-parser-visualizer/0.0.1/typst.toml deleted file mode 100644 index d10e1a00ae..0000000000 --- a/packages/preview/slr-parser-visualizer/0.0.1/typst.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "slr-visualizer" -version = "0.0.1" -entrypoint = "src/vis.typ" -authors = ["Lucas Ramos"] -license = "MIT" -description = "A typst template to visualize SLR parser steps." -homepage = "https://github.com/lukinhasram/slr-visualizer" -repository = "https://github.com/lukinhasram/slr-visualizer" -compiler = "0.15.0" -categories = ["components", "visualization"] -disciplines = ["computer-science", "mathematics", "education", "linguistics"] -keywords = ["parser", "slr", "grammar", "compiler", "AST"] -exclude = ["README.md", "docs", "example.typ", "example.pdf"] \ No newline at end of file diff --git a/packages/preview/slr-parser/0.0.1/LICENSE b/packages/preview/slr-parser/0.0.1/LICENSE deleted file mode 100644 index 624cc3aa8f..0000000000 --- a/packages/preview/slr-parser/0.0.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 sjfhsjfh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/preview/slr-parser/0.0.1/README.md b/packages/preview/slr-parser/0.0.1/README.md deleted file mode 100644 index 56657e7fd0..0000000000 --- a/packages/preview/slr-parser/0.0.1/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# slr-parser - -Takes a grammar and a sentence and walks through SLR(1) parsing: augmented -grammar, FIRST/FOLLOW, canonical LR(0) items, the DFA, the ACTION/GOTO -table, a shift-reduce trace, the parse tree. All computed in Typst, no -external script generating a table beforehand. - -It's SLR(1) — LR(0) item sets, but reduce actions only go in when the -symbol's in FOLLOW(LHS). That's the whole difference from plain LR(0). - -See `example.pdf` for what it looks like end to end on: - -``` -C → id ( A ) -A → A , E | ε | E -E → E + T | T -T → id | num | C -``` -parsing `id ( num + id , id ( num + id ) )`. - -## Using it - -```typst -#import "@preview/slr-visualizer:0.1.0": * - -#let my-grammar = ( - ("C", ("id", "(", "A", ")")), - ("A", ("A", ",", "E")), - ("A", ("\\epsilon",)), - ("A", ("E",)), - ("E", ("E", "+", "T")), - ("E", ("T",)), - ("T", ("id",)), - ("T", ("num",)), - ("T", ("C",)), -) - -#let my-sentence = ("id", "(", "num", "+", "id", ",", "id", "(", "num", "+", "id", ")", ")") - -#show-grammar(my-grammar) -#show-parse-table(my-grammar) -#show-parse-trace(my-grammar, my-sentence) -#show-parse-tree(my-grammar, my-sentence) -``` - -A grammar is just a list of `(LHS, RHS)` pairs, RHS being a tuple of -symbols. First production's LHS = start symbol. Anything that's not a LHS -anywhere is a terminal. `"\\epsilon"` for empty productions. Don't use `"."` -as a symbol — it's the LR item dot internally and things will break in -confusing ways if it collides. - -A sentence is just the terminals, no `$` at the end, that gets added for -you. - -## What each function gives you - -`show-grammar` / `show-aug-grammar` — the production list, plain or with the -`S' → S` row added. - -`show-first-follow` — FIRST/FOLLOW per non-terminal. - -`show-canonical-items` — every I_n state, with where it came from. - -`show-automaton(grammar, width: 100%)` — the LR(0) DFA, rendered via -diagraph/Graphviz. - -`show-parse-table` — ACTION/GOTO, conflicts called out in red if there are -any. - -`show-parse-trace` / `show-parse-tree` — take `(grammar, sentence)`, give -you the stack-by-stack trace and the resulting tree. - -All of them take the grammar *before* augmentation — that part's handled -for you. - -## Known gaps - -- SLR(1) conflict resolution, not LALR/LR(1) — if your grammar genuinely - needs per-state lookahead to be unambiguous, you'll see conflicts here - even though a stronger parser wouldn't have any. -- FIRST-set computation only skips direct left recursion (`A → A α`). - Indirect left recursion through another non-terminal isn't handled. -- When there's a real shift/reduce or reduce/reduce conflict, whichever - action got inserted first wins — there's no precedence/associativity - table backing this, it's reported and left at that. diff --git a/packages/preview/slr-parser/0.0.1/docs/example.pdf b/packages/preview/slr-parser/0.0.1/docs/example.pdf deleted file mode 100644 index 56968917b13a6447efaf8001750a9ae97263b872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224399 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

o9%g^Ao=m~wIN6T)n1beOwxr?xx`^SreSdy zi#^~!78UV03}PLoV+@VL<1n@u0NrBWF@SaS4X4CwOCDQbHmjQo!X9 z2zZy=L^6+|I%Lxmv~LL@lMtYRM%%0q-f7+fA_%_SDSfcG4kpShPi~1acDrMEkR~v< zPVdCGs+`K!6?QxzH=CU~Dr>MW8v=Q8z*c-G-;lHvme^yK2=*%D;OrMz$eCIkfMJ2^ zZaG<_2Il~v6ViIwkl+)qfa8pY*08SRpM%gxxbBGh

f43N}g-G@1l19U)u@_tB9g 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 { - if i == target { - append-dot(item) - } else { - item - } - }) -} - -#let advance-dot(item) = { - let (lhs, rhs) = item - let dot-index = rhs.position(x => x == ".") - - if dot-index != none and (dot-index + 1) < rhs.len() { - let next-symbol = rhs.at(dot-index + 1) - let new-rhs = rhs.slice(0, dot-index) + (next-symbol, ".") + rhs.slice(dot-index + 2) - return (lhs, new-rhs) - } - return item -} - - - -#let closure(state, grammar) = { - let J = state - let changed = true - - while changed { - changed = false - - for item in J { - let rhs = item.at(1) - let dot-index = rhs.position(x => x == ".") - - if dot-index != none and (dot-index + 1) < rhs.len() { - let target = rhs.at(dot-index + 1) - let target-prods = grammar.filter(x => x.at(0) == target) - - for prod in target-prods { - let new-item = append-dot(prod) - - if new-item not in J { - J.push(new-item) - changed = true - } - } - } - } - } - - return J -} - -#let goto(state, symbol, grammar) = { - let moved-items = () - - for item in state { - let rhs = item.at(1) - let dot-index = rhs.position(x => x == ".") - - if dot-index != none and (dot-index + 1) < rhs.len() { - let next-symbol = rhs.at(dot-index + 1) - - if next-symbol == symbol { - moved-items.push(advance-dot(item)) - } - } - } - - return closure(moved-items, grammar) -} - - - -#let canonical-items(augmented-grammar) = { - let I0 = closure((append-dot(augmented-grammar.at(0)),), augmented-grammar) - let C = (I0,) - let changed = true - let symbols = get-all-symbols(augmented-grammar).filter(x => x != "\\epsilon") - - while changed { - changed = false - - for state in C { - for symbol in symbols { - let next-state = goto(state, symbol, augmented-grammar) - - if (next-state.len() != 0) and (next-state not in C) { - C.push(next-state) - changed = true - } - } - } - } - - return C -} - - - -#let get-first-of-sequence(seq, first-sets) = { - if seq.len() == 0 or seq == ("\\epsilon",) { return ("\\epsilon",) } - let result = () - let all-epsilon = true - for sym in seq { - let sym-first = first-sets.at(sym, default: ()) - for f in sym-first { - if f != "\\epsilon" and f not in result { result.push(f) } - } - if "\\epsilon" not in sym-first { - all-epsilon = false - break - } - } - if all-epsilon and "\\epsilon" not in result { result.push("\\epsilon") } - return result -} - -#let compute-first(grammar) = { - let first-sets = (:) - for sym in get-terminals(grammar) { first-sets.insert(sym, (sym,)) } - for sym in get-variables(grammar) { first-sets.insert(sym, ()) } - - let changed = true - while changed { - changed = false - for prod in grammar { - let lhs = prod.at(0) - let rhs = prod.at(1) - - // skip left-recursive productions entirely - if rhs.at(0) == lhs { continue } - - let rhs-first = get-first-of-sequence(rhs, first-sets) - for f in rhs-first { - let current-first = first-sets.at(lhs) - if f not in current-first { - current-first.push(f) - first-sets.insert(lhs, current-first) - changed = true - } - } - } - } - return first-sets -} - -#let compute-follow(grammar, first-sets) = { - let follow-sets = (:) - let non-terminals = get-variables(grammar) - for nt in non-terminals { follow-sets.insert(nt, ()) } - - let original-start = grammar.at(0).at(1).at(0) - follow-sets.insert(original-start, ("$",)) - - let changed = true - while changed { - changed = false - for prod in grammar { - let lhs = prod.at(0) - let rhs = prod.at(1) - if rhs == ("\\epsilon",) { continue } - - for i in range(rhs.len()) { - let symbol = rhs.at(i) - if symbol in non-terminals { - let beta = rhs.slice(i + 1) - let first-beta = get-first-of-sequence(beta, first-sets) - - for f in first-beta { - if f != "\\epsilon" and f not in follow-sets.at(symbol) { - let sym-follow = follow-sets.at(symbol) - sym-follow.push(f) - follow-sets.insert(symbol, sym-follow) - changed = true - } - } - if "\\epsilon" in first-beta or beta.len() == 0 { - for f in follow-sets.at(lhs) { - if f not in follow-sets.at(symbol) { - let sym-follow = follow-sets.at(symbol) - sym-follow.push(f) - follow-sets.insert(symbol, sym-follow) - changed = true - } - } - } - } - } - } - } - return follow-sets -} - - -// SLR(1) table construction - -// Returns (ACTION: array of dicts, GOTO: array of dicts, conflicts: array) -// Each conflict is a dict: (state: int, symbol: str, existing: action, incoming: action) -// Conflicts are reported but the first entry written wins (shift preferred on shift/reduce so the caller can decide what to do with the conflict list) - -#let build-tables(C, augmented-grammar) = { - let ACTION = () - let GOTO = () - let conflicts = () - - let terminals = get-terminals(augmented-grammar).filter(x => x != "\\epsilon") - let variables = get-variables(augmented-grammar) - - let first-sets = compute-first(augmented-grammar) - let follow-sets = compute-follow(augmented-grammar, first-sets) - - // S' → S . - let start-item = append-dot(augmented-grammar.at(0)) // S' → . S - let accept-item = advance-dot(start-item) // S' → S . - - for (state-idx, state) in C.enumerate() { - let current-action = (:) - let current-goto = (:) - - for symbol in terminals { - let next-state = goto(state, symbol, augmented-grammar) - - if next-state.len() > 0 { - let j = C.position(x => x == next-state) - current-action.insert(symbol, (action-type.SHIFT, j)) - } - } - - for symbol in variables { - let next-state = goto(state, symbol, augmented-grammar) - - if next-state.len() > 0 { - let j = C.position(x => x == next-state) - current-goto.insert(symbol, j) - } - } - - if accept-item in state { - current-action.insert("$", (action-type.ACCEPT, none)) - } - - for item in state { - let lhs = item.at(0) - let rhs = item.at(1) - let dot-index = rhs.position(x => x == ".") - - // item is complete (dot at end) and is not the accept item - if dot-index == (rhs.len() - 1) and item != accept-item { - let pure-rhs = rhs.slice(0, dot-index) - if pure-rhs.len() == 0 { pure-rhs = ("\\epsilon",) } - - let rule-index = augmented-grammar.position( - x => x.at(0) == lhs and x.at(1) == pure-rhs - ) - - let follow-A = follow-sets.at(lhs) - for f in follow-A { - let reduce-action = (action-type.REDUCE, rule-index) - - if f in current-action { - // conflict detected and existing entry wins - // TODO: precedence/associativity rules - conflicts.push(( - state: state-idx, - symbol: f, - existing: current-action.at(f), - incoming: reduce-action, - )) - } else { - current-action.insert(f, reduce-action) - } - } - } - } - - ACTION.push(current-action) - GOTO.push(current-goto) - } - - return (ACTION: ACTION, GOTO: GOTO, conflicts: conflicts) -} - - - - - - -#let parse-input(input, ACTION, GOTO, augmented-grammar) = { - let stack = (0,) - let tree-stack = () - let current-input = input - let step = 0 - let history = () - - while current-input.len() > 0 { - step += 1 - // TODO: proper infinite loop detection - if step > 1000 { break } - - let state = stack.last() - let token = current-input.at(0) - let action-dict = ACTION.at(state) - - let act = action-dict.at(token, default: (action-type.ERROR, none)) - - history.push((step: step, stack: stack, input: current-input, action: act)) - - if act.at(0) == action-type.SHIFT { - let next-state = act.at(1) - stack.push(token) - stack.push(next-state) - current-input.remove(0) - tree-stack.push((label: token, children: ())) - - } else if act.at(0) == action-type.REDUCE { - let rule-index = act.at(1) - let rule = augmented-grammar.at(rule-index) - let lhs = rule.at(0) - let rhs = rule.at(1) - - let rhs-len = if rhs == ("\\epsilon",) { 0 } else { rhs.len() } - let children = () - - if rhs-len > 0 { - let pop-count = rhs-len * 2 - stack = stack.slice(0, stack.len() - pop-count) - children = tree-stack.slice(tree-stack.len() - rhs-len) - tree-stack = tree-stack.slice(0, tree-stack.len() - rhs-len) - } else { - children = ((label: "\\epsilon", children: ()),) - } - - let top-state = stack.last() - let next-state = GOTO.at(top-state).at(lhs) - - stack.push(lhs) - stack.push(next-state) - tree-stack.push((label: lhs, children: children)) - - } else if act.at(0) == action-type.ACCEPT { - return (success: true, log: history, ast: tree-stack.last()) - - } else { - return (success: false, log: history, ast: none) - } - } - - return (success: false, log: history, ast: none) -} diff --git a/packages/preview/slr-parser/0.0.1/src/vis.typ b/packages/preview/slr-parser/0.0.1/src/vis.typ deleted file mode 100644 index 707695bf63..0000000000 --- a/packages/preview/slr-parser/0.0.1/src/vis.typ +++ /dev/null @@ -1,376 +0,0 @@ -#import "lib.typ": * -#import "@preview/diagraph:0.3.6": raw-render - - - -#let render-item(item) = { - let (lhs, rhs) = item - let rhs-str = rhs.map(s => if s == "." { text(fill: red.darken(20%))[$bullet.op$] } else if s == "\\epsilon" { $epsilon$ } else { $#s$ }) - box[#$#lhs arrow.r$ #rhs-str.join(h(2pt))] -} - -#let fmt-sym(s, variables) = { - if s == "\\epsilon" { $epsilon$ } - else if s == "$" { text(font: "DejaVu Sans Mono", size: 8pt)[\$] } - else if s in variables { $#s$ } - else { text(font: "DejaVu Sans Mono", size: 8pt)[#s] } -} - -#let dot-escape(s) = { - s.replace("\\", "\\\\") - .replace("\"", "\\\"") - .replace("\n", "\\n") - .replace("'", "\\'") -} - -#let item-to-str(item) = { - let (lhs, rhs) = item - let rhs-s = rhs.map(s => if s == "." { "•" } else if s == "\\epsilon" { "ε" } else { s }).join(" ") - lhs + " → " + rhs-s -} - - - - -#let show-grammar(grammar) = { - block(width: 100%)[ - #table( - columns: (auto, auto, auto, auto), - stroke: none, - align: (center, center, center, left), - inset: (x: 6pt, y: 3pt), - [*\#*], [*Var*], [], [*Production*], - ..grammar.enumerate().map(((i, prod)) => { - let (lhs, rhs) = prod - ( - text(fill: purple.darken(20%))[$#i$], - $#lhs$, - $arrow.r$, - rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), - ) - }).flatten() - ) - ] -} - - -#let show-aug-grammar(grammar) = { - let aug = augment-grammar(grammar) - block(width: 100%)[ - #table( - columns: (auto, auto, auto, auto), - stroke: none, - align: (center, center, center, left), - inset: (x: 6pt, y: 3pt), - [*\#*], [*Var*], [], [*Production*], - ..aug.enumerate().map(((i, prod)) => { - let (lhs, rhs) = prod - ( - text(fill: purple.darken(20%))[$#i$], - $#lhs$, - $arrow.r$, - rhs.map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$), - ) - }).flatten() - ) - ] -} - - - -#let show-first-follow(grammar) = { - let aug = augment-grammar(grammar) - let vars = get-variables(aug).filter(v => v != aug.at(0).at(0)) - let first = compute-first(aug) - let follow = compute-follow(aug, first) - - block(width: 100%)[ - #table( - columns: (auto, 1fr, 1fr), - inset: (x: 8pt, y: 5pt), - fill: (col, row) => { - if row == 0 { luma(220) } - else if calc.odd(row) { luma(248) } - else { white } - }, [*Variable*], [*FIRST*], [*FOLLOW*], - ..vars.map(v => { - let fi = first.at(v, default: ()).map(s => - if s == "\\epsilon" { strong($epsilon$) } else if s == "$" { strong([\$]) } else { strong($#s$) } - ).join([, ]) - let fo = follow.at(v, default: ()).map(s => - if s == "$" { strong([\$]) } else { strong($#s$) } - ).join([, ]) - ($#v$, fi, fo) - }).flatten() - ) - ] -} - - - -#let show-canonical-items(grammar) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") - - // Build origin map: state-index -> (parent-index, symbol) - let origins = (:) - for (i, state) in C.enumerate() { - for sym in symbols { - let next = goto(state, sym, aug) - if next.len() > 0 { - let j = C.position(x => x == next) - if j != none and str(j) not in origins { - origins.insert(str(j), (i, sym)) - } - } - } - } - - block(width: 100%)[ - #grid( - columns: (1fr, 1fr, 1fr, 1fr, 1fr), - gutter: 10pt, - ..C.enumerate().map(((i, state)) => { - let origin-label = if str(i) in origins { - let (par, sym) = origins.at(str(i)) - text(size: 10pt, fill: purple.darken(20%))[(I#sub[#par], #sym)] - } else { - text(size: 10pt, fill: purple.darken(20%))[#emph[inicial]] - } - block( - stroke: 1pt + luma(100), - inset: 8pt, - width: 100%, - )[ - #text(size: 14pt, weight: "bold", fill: purple.darken(20%))[I#sub[#i]] - #h(4pt) - #origin-label - #stack( - dir: ttb, - spacing: 2pt, - ..state.map(item => render-item(item)) - ) - ] - }) - ) - ] -} - - - -#let show-automaton(grammar, width: 100%) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let symbols = get-all-symbols(aug).filter(x => x != "\\epsilon") - - let edges = () - for (i, state) in C.enumerate() { - for sym in symbols { - let next = goto(state, sym, aug) - if next.len() > 0 { - let j = C.position(x => x == next) - if j != none { - edges.push((i, j, sym)) - } - } - } - } - - - let edge-lines = edges.map(e => { - let (a, b, sym) = e - let lbl = dot-escape(if sym == "\\epsilon" { "ε" } else { sym }) - " I" + str(a) + " -> I" + str(b) + " [label=\"" + lbl + "\"];" - }) - - let dot-src = ( - "digraph LR0 {\n" - + " rankdir=LR;\n" - + " node [margin=\"0.05,0.17\", fontsize=18, fontcolor=darkviolet];\n" - + " edge [fontsize=15];\n" - + edge-lines.join("\n") + "\n" - + "}" - ) - - block(width: 100%)[ - #raw-render(raw(dot-src, lang: "dot"), width: width) - ] -} - - - -#let show-parse-table(grammar) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let result = build-tables(C, aug) - let ACTION = result.ACTION - let GOTO = result.GOTO - let conflicts = result.conflicts - - let terminals = get-terminals(aug).filter(x => x != "\\epsilon") + ("$",) - let variables = get-variables(aug).filter(x => x != aug.at(0).at(0)) // drop S' - - let n-cols = 1 + terminals.len() + variables.len() - - let render-cell(entry) = { - if entry == none { return [] } - let (kind, val) = entry - if kind == action-type.SHIFT { text(weight: "bold", fill: blue.darken(20%))[s#val] } - else if kind == action-type.REDUCE { text(weight: "bold", fill: green.darken(20%))[r#val] } - else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[acc] } - else { [] } - } - - block(width: 100%)[ - #if conflicts.len() > 0 { - block( - fill: red.lighten(80%), - stroke: 0.5pt + red, - inset: 6pt, - radius: 3pt, - )[ - #text(fill: red.darken(20%), weight: "bold")[⚠ Conflicts (#conflicts.len())] - #for c in conflicts [ - - State #c.state, symbol `#c.symbol`: existing #repr(c.existing) vs incoming #repr(c.incoming) - ] - ] - v(6pt) - } - - #table( - columns: range(n-cols).map(_ => auto), - inset: (x: 10pt, y: 6pt), - fill: (col, row) => { - if row == 0 or row == 1 { luma(220) } - else if calc.odd(row) { luma(248) } - else { white } - }, - align: center, - - table.cell(colspan: 1)[], - table.cell(colspan: terminals.len(), stroke: (bottom: 0.5pt + black))[*ACTION*], - table.cell(colspan: variables.len(), stroke: (bottom: 0.5pt + black))[*GOTO*], - - [*STATE*], - ..terminals.map(t => - text(font: "DejaVu Sans Mono", size: 8pt)[*#t*] - ), - ..variables.map(v => $bold(#v)$), - - // Data rows - ..C.enumerate().map(((i, _)) => { - let act-row = ACTION.at(i) - let got-row = GOTO.at(i) - ( - [*#i*], - ..terminals.map(t => render-cell(act-row.at(t, default: none))), - ..variables.map(v => { - let g = got-row.at(v, default: none) - if g != none { [#g] } else { [] } - }), - ) - }).flatten() - ) - ] -} - - - -#let show-parse-trace(grammar, sentence) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let tables = build-tables(C, aug) - let input = sentence + ("$",) - let result = parse-input(input, tables.ACTION, tables.GOTO, aug) - - let action-label(act) = { - let (kind, val) = act - if kind == action-type.SHIFT { [shift #val] } - else if kind == action-type.REDUCE { - let rule = aug.at(val) - let rhs-s = rule.at(1).map(s => if s == "\\epsilon" { $epsilon$ } else { $#s$ }).join($space$) - [$"reduce" #rule.at(0) arrow.r #rhs-s$] - } - else if kind == action-type.ACCEPT { text(fill: purple, weight: "bold")[accept] } - else { text(fill: red)[error] } - } - - block(width: 100%)[ - #table( - columns: (auto, auto, auto, auto), - inset: (x: 7pt, y: 6pt), - fill: (_, row) => if row == 0 { luma(220) } else if calc.odd(row) { luma(248) } else { white }, - [*Step*], [*Stack*], [*Entry*], [*Action*], - ..result.log.map(entry => { - let stk = entry.stack.map(s => str(s)).join(" ") - let inp = entry.input.map(s => if s == "$" { [\$] } else { text(font: "DejaVu Sans Mono")[#s] }).join(h(3pt)) - ( - [#entry.step], - text(font: "DejaVu Sans Mono", size: 8pt)[#stk], - inp, - action-label(entry.action), - ) - }).flatten() - ) - ] -} - - - -#let _ast-to-dot(root) = { - let nodes = () // (id, label, is-leaf) - let edges = () // (parent-id, child-id) - let queue = ((0, root),) - let next-id = 1 - - while queue.len() > 0 { - let (my-id, node) = queue.remove(0) - let is-leaf = node.children.len() == 0 - nodes.push((my-id, node.label, is-leaf)) - - for child in node.children { - edges.push((my-id, next-id)) - queue.push((next-id, child)) - next-id = next-id + 1 - } - } - - let node-lines = nodes.map(n => { - let (id, lbl-raw, leaf) = n - let lbl = dot-escape(if lbl-raw == "\\epsilon" { "ε" } else { lbl-raw }) - let shape = if leaf { "ellipse" } else { "rectangle" } - let fill = if leaf { "#d6eaf8" } else { "#d5f5e3" } - let line = " n" + str(id) + " [label=\"" + lbl + "\", shape=" + shape + ", style=filled, fillcolor=\"" + fill + "\", fontname=\"Courier\", fontsize=10];" - line - }) - - let edge-lines = edges.map(e => { - " n" + str(e.at(0)) + " -> n" + str(e.at(1)) + ";" - }) - - ( - "digraph ParseTree {\n" - + " rankdir=TB;\n" - + node-lines.join("\n") + "\n" - + edge-lines.join("\n") + "\n" - + "}" - ) -} - -#let show-parse-tree(grammar, sentence) = { - let aug = augment-grammar(grammar) - let C = canonical-items(aug) - let tables = build-tables(C, aug) - let input = sentence + ("$",) - let result = parse-input(input, tables.ACTION, tables.GOTO, aug) - - block(width: 100%)[ - #if result.ast == none { - text(fill: red)[No parse tree — input was rejected.] - } else { - let dot-src = _ast-to-dot(result.ast) - raw-render(raw(dot-src, lang: "dot")) - } - ] -} diff --git a/packages/preview/slr-parser/0.0.1/typst.toml b/packages/preview/slr-parser/0.0.1/typst.toml deleted file mode 100644 index 5c4909e5bd..0000000000 --- a/packages/preview/slr-parser/0.0.1/typst.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "slr-parser" -version = "0.0.1" -entrypoint = "src/vis.typ" -authors = ["Lucas Ramos"] -license = "MIT" -description = "A typst template to visualize SLR parser steps." -homepage = "https://github.com/lukinhasram/slr-visualizer" -repository = "https://github.com/lukinhasram/slr-visualizer" -compiler = "0.15.0" -categories = ["components", "visualization"] -disciplines = ["computer-science", "mathematics", "education", "linguistics"] -keywords = ["parser", "slr", "grammar", "compiler", "AST"] -exclude = ["README.md", "docs", "example.typ", "example.pdf"] \ No newline at end of file From a18a9aefa751c5ab132df6748c2e10154cdffa30 Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Thu, 25 Jun 2026 15:03:17 -0300 Subject: [PATCH 5/8] fix repo URL and linting warnings --- packages/preview/slr8/0.0.1/docs/example.typ | 2 +- packages/preview/slr8/0.0.1/typst.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/preview/slr8/0.0.1/docs/example.typ b/packages/preview/slr8/0.0.1/docs/example.typ index 55f77c2444..fc9473c9a3 100644 --- a/packages/preview/slr8/0.0.1/docs/example.typ +++ b/packages/preview/slr8/0.0.1/docs/example.typ @@ -1,4 +1,4 @@ -#import "../src/vis.typ": * +#import "@preview/slr8:0.0.1": * // Use "\\epsilon" for empty productions // The first production's LHS is treated as the start symbol diff --git a/packages/preview/slr8/0.0.1/typst.toml b/packages/preview/slr8/0.0.1/typst.toml index 396227fbc7..4f66953c01 100644 --- a/packages/preview/slr8/0.0.1/typst.toml +++ b/packages/preview/slr8/0.0.1/typst.toml @@ -4,9 +4,9 @@ version = "0.0.1" entrypoint = "src/vis.typ" authors = ["Lucas Ramos"] license = "MIT" -description = "A typst template to visualize SLR parser steps." -homepage = "https://github.com/lukinhasram/slr-visualizer" -repository = "https://github.com/lukinhasram/slr-visualizer" +description = "A package to visualize SLR parser steps." +homepage = "https://github.com/Lukinhasram/slr8" +repository = "https://github.com/Lukinhasram/slr8" compiler = "0.15.0" categories = ["components", "visualization"] disciplines = ["computer-science", "mathematics", "education", "linguistics"] From ab4635e4895a2f315e3c739949c420d0f1c86a80 Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Thu, 25 Jun 2026 15:05:59 -0300 Subject: [PATCH 6/8] remove homepage from typst toml --- packages/preview/slr8/0.0.1/typst.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/preview/slr8/0.0.1/typst.toml b/packages/preview/slr8/0.0.1/typst.toml index 4f66953c01..c32c1757b6 100644 --- a/packages/preview/slr8/0.0.1/typst.toml +++ b/packages/preview/slr8/0.0.1/typst.toml @@ -5,7 +5,6 @@ entrypoint = "src/vis.typ" authors = ["Lucas Ramos"] license = "MIT" description = "A package to visualize SLR parser steps." -homepage = "https://github.com/Lukinhasram/slr8" repository = "https://github.com/Lukinhasram/slr8" compiler = "0.15.0" categories = ["components", "visualization"] From 00b65e55a7755c21a59310800347d8d4288193c1 Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Thu, 25 Jun 2026 15:11:48 -0300 Subject: [PATCH 7/8] update diagraph version and remove README from exclude --- packages/preview/slr8/0.0.1/src/vis.typ | 2 +- packages/preview/slr8/0.0.1/typst.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/preview/slr8/0.0.1/src/vis.typ b/packages/preview/slr8/0.0.1/src/vis.typ index 707695bf63..71a2629528 100644 --- a/packages/preview/slr8/0.0.1/src/vis.typ +++ b/packages/preview/slr8/0.0.1/src/vis.typ @@ -1,5 +1,5 @@ #import "lib.typ": * -#import "@preview/diagraph:0.3.6": raw-render +#import "@preview/diagraph:0.3.7": raw-render diff --git a/packages/preview/slr8/0.0.1/typst.toml b/packages/preview/slr8/0.0.1/typst.toml index c32c1757b6..f0cb71f543 100644 --- a/packages/preview/slr8/0.0.1/typst.toml +++ b/packages/preview/slr8/0.0.1/typst.toml @@ -10,4 +10,4 @@ compiler = "0.15.0" categories = ["components", "visualization"] disciplines = ["computer-science", "mathematics", "education", "linguistics"] keywords = ["parser", "slr", "grammar", "compiler", "AST"] -exclude = ["README.md", "docs", "example.typ", "example.pdf"] \ No newline at end of file +exclude = ["docs", "example.typ", "example.pdf"] \ No newline at end of file From 3af515ff1974d82fe28b5942e3f7011eb9d44801 Mon Sep 17 00:00:00 2001 From: Lucas Ramos <137449735+Lukinhasram@users.noreply.github.com> Date: Mon, 29 Jun 2026 13:59:34 -0300 Subject: [PATCH 8/8] Update packages/preview/slr8/0.0.1/README.md Co-authored-by: Ana Gelez --- packages/preview/slr8/0.0.1/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/preview/slr8/0.0.1/README.md b/packages/preview/slr8/0.0.1/README.md index 6a69263956..eec26251b6 100644 --- a/packages/preview/slr8/0.0.1/README.md +++ b/packages/preview/slr8/0.0.1/README.md @@ -8,7 +8,7 @@ external script generating a table beforehand. It's SLR(1) — LR(0) item sets, but reduce actions only go in when the symbol's in FOLLOW(LHS). That's the whole difference from plain LR(0). -See `example.pdf` for what it looks like end to end on: +See [`example.pdf`](docs/example.pdf) for what it looks like end to end on: ``` C → id ( A )