# Trash **Repository Path**: LucasDot/Trash ## Basic Information - **Project Name**: Trash - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-12 - **Last Updated**: 2026-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Trash [![Build](https://github.com/kaby76/Trash/workflows/CI/badge.svg)](https://github.com/kaby76/Trash/actions?query=workflow%3ACI) **Status: The toolset is still undergoing a major rewrite. Consider this toolkit as "pre-alpha". Old tools are being removed, and new ones are being added. Features are being added, while bugs are constantly being fixed. The XPath/XQuery engine is still being rewritten.** **The repo [g4-scripts](https://github.com/kaby76/g4-scripts) contains a collections of Bash which use Trash. The repo also contains XQuery scripts that implement complex operations on a parse tree. You can also read about Trash details in [my blog](http://codinggorilla.com/).** Trash is a collection of ~40 command-line tools to analyze and transform Antlr parse trees and grammars. The toolkit can: generate a parser application for an Antlr4 grammar for any target and any OS; analyze the grammar for common problems; automate changes applied to a grammar scraped from a specification; transform parse trees for transpilating and proprocessing source code. With the [Antlr toolkit](https://www.antlr.org/) and the [collection of Antlr grammars](https://github.com/antlr/grammars-v4), one can write programming language tools quickly and easily. The toolkit is designed around a JSON representation of parse trees and command-line tools that read, modify, and write those tree via standard input and output. Complex refactorings can be achieved by chaining different commands together. Each app in `Trash` is implemented as a [Dotnet Tool](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools) console application, and can be used on Windows, Linux, or Mac. No prerequisites are required other than installing the [NET SDK](https://dotnet.microsoft.com/), and the toolchains for any other targets you want to use. The toolkit uses [Antlr](https://www.antlr.org/) and [XPath2](https://en.wikipedia.org/wiki/XPath). The code is implemented in C#. An application of the toolkit was used to scrape and refactor the Dart2 grammar from spec. See [this script](https://github.com/kaby76/ScrapeDartSpec/blob/master/refactor.sh). ## Installation ### Requirements [Install Dotnet 10.0.x](https://dotnet.microsoft.com/en-us/download) ### Install Globally dotnet tool install -g trash ### Uninstall dotnet tool uninstall -g trash ### Install Locally dotnet new tool-manifest dotnet tool install trash ## List of commands 1) dotnet trash analyze -- Analyze a grammar 1) dotnet trash caret -- Caret operations on a parse tree 1) dotnet trash clonereplace -- Clone and replace in a grammar 1) dotnet trash combine -- Combine a split Antlr4 grammar 1) dotnet trash convert -- Convert a grammar from one form to another 1) dotnet trash cover -- Code coverage analysis 1) dotnet trash dot -- Print a parse tree in Graphviz Dot format 1) dotnet trash extract -- Extract from a parse tree 1) dotnet trash ff -- Outputs FIRST and FOLLOW sets of a grammar 1) dotnet trash foldlit -- Perform fold transform on grammar with literals 1) dotnet trash gen -- Generate an Antlr4 parser for a given target language 1) dotnet trash genvsc -- Generate VS Code extension files 1) dotnet trash glob -- Glob file patterns 1) dotnet trash iconv -- Convert file encoding 1) dotnet trash itext -- Get strings from a PDF file 1) dotnet trash json -- Print a parse tree in JSON structured format 1) dotnet trash nullable -- Nullable analysis of a grammar 1) dotnet trash parse -- Parse a grammar or use a generated parser to parse input 1) dotnet trash perf -- Perform performance analysis of an Antlr grammar parse 1) dotnet trash query -- Query parse trees using XPath 1) dotnet trash rename -- Rename symbols in a grammar 1) dotnet trash sort -- Sort rules in a grammar 1) dotnet trash split -- Split a combined Antlr4 grammar 1) dotnet trash sponge -- Extract parsing results of a Trash command into files 1) dotnet trash text -- Print a parse tree with a specific interval 1) dotnet trash tokens -- Print tokens in a parse tree 1) dotnet trash tree -- Print a parse tree in a human-readable format 1) dotnet trash unfold -- Perform an unfold transform on a grammar 1) dotnet trash unfoldlit -- Perform unfold transform with literals on a grammar 1) dotnet trash ungroup -- Perform an ungroup transform on a grammar 1) dotnet trash wdog -- Kill a program that runs too long 1) dotnet trash xgrep -- Search using XPath in parse trees 1) dotnet trash xml -- Print a parse tree in XML structured format 1) dotnet trash xml2 -- Print an enumeration of all paths in a parse tree to leaves ## Examples ### Parse a grammar, create a parser for the grammar, build, and test ``` git clone https://github.com/antlr/grammars-v4 cd grammars-v4/python/python dotnet trash parse *.g4 | dotnet trash query 'grep //grammarDecl' | dotnet trash text # Output: # PythonLexer.g4:lexer grammar PythonLexer; # PythonParser.g4:parser grammar PythonParser; dotnet trash gen cd Generated dotnet build cat - < new-source.g4 trash parse Arithmetic.g4 | trash rename -r "expression,expression_;atom,atom_;scientific,scientific_" | trprint In these two examples, the Arithmetic grammar is parsed. [trrename](https://github.com/kaby76/Trash/tree/main/src/trrename) reads the parse tree data and modifies it by renaming the `expression` symbol two ways: first by XPath expression identifying the LHS terminal symbol of the `expression` symbol, and the second by assumption that the tree is an Antlr4 parse tree, then renaming a semi-colon-separated list of paired renames. The resulting code is reconstructed and saved. `trrename` does not rename symbols in actions, nor does it rename identifiers corresponding to the grammar symbols in any support source code (but it could if the tool is extended). ### Count method declarations in a Java source file git clone https://github.com/antlr/grammars-v4.git; \ cd grammars-v4/java/java9; \ trash gen; dotnet build Generated/Test.csproj;\ trash parse examples/AllInOne8.java | trash query "greap //methodDeclaration" | trst | wc This command clones the Antlr4 grammars-v4 repo, generates a parser for the Java9 grammar, then runs the parser on [examples/AllInOne8.java](https://github.com/antlr/grammars-v4/blob/master/java/java9/examples/AllInOne8.java). The parse tree is then piped to `trquery` to find all parse tree nodes that are a `methodDeclaration` type, converts it to a simple string, and counts the result using `wc`. ### Strip a grammar of all non-essential CFG trash parse Java9.g4 | trash strip | trash text > Essential-Java9.g4 ### Split a grammar Since Antlr2, one can written a combined parser/lexer in one file, or a split parser/lexer in two files. While it's not hard to split or combine a grammar, it's tedious. For automating transformations, it's necessary because Antlr4 requires the grammars to be split when super classes are needed for different targets. trash combine ArithmeticLexer.g4 ArithmeticParser.g4 | trash text > Arithmetic.g4 This command calls [trcombine](https://github.com/kaby76/Trash/tree/main/src/trcombine) which parses two split grammar files [ArithmeticLexer.g4](https://github.com/kaby76/Trash/blob/main/_tests/combine/ArithmeticLexer.g4) and [ArithmeticParser.g4](https://github.com/kaby76/Trash/blob/main/_tests/combine/ArithmeticParser.g4), and creates a [combined grammar](https://github.com/kaby76/Trash/blob/main/_tests/combine/Arithmetic.g4) for the two. trash parse Arithmetic.g4 | trash split | trash sponge -o true This command calls [trsplit](https://github.com/kaby76/Trash/tree/main/src/trsplit) which splits the grammar into two parse tree results, one that defines ArithmeticLexer.g4 and the other that defines ArithmeticParser.g4. The tool [trsponge](https://github.com/kaby76/Trash/tree/main/src/trsponge) is similar to the [tee](https://en.wikipedia.org/wiki/Tee_(command)) in Linux: the parse tree data is split and placed in files. ## Parsing Result Sets -- the data passed between commands A *parsing result set* is a JSON serialization of an array of: * A set of parse tree nodes. * Parser information related to the parse tree nodes. * Lexer information related to the parse tree nodes. * The name of the input corresponding to the parse tree nodes. * The input text corresponding to the parse tree nodes. Most commands in Trash read and/or write parsing result sets. ## Supported grammars | Grammars | File suffix | | ---- | ---- | | Antlr4 | .g4 | | Antlr3 | .g3 | | Antlr2 | .g2 | | Bison | .y | | LBNF | .cf | | W3C EBNF | .ebnf | | ISO 14977 | .iso14977, .iso | ## Analysis ### Recursion * [Has direct/indirect recursion](https://github.com/kaby76/Trash/blob/main/doc/analysis.md#has-directindirect-recursion) ## Refactoring Trash provides a number of transformations that can help to make grammars cleaner (reformatting), more readable (reducing the length of the RHS of a rule), and more efficient (reducing the number of non-terminals) for Antlr. Some of these refactorings are very specific for Antlr due to the way the parser works, e.g., converting a prioritized chain of productions recognizing an arithmetic expression to a recursive alternate form. The refactorings implemented are: ### Raw tree editing * [Delete parse tree node](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#delete-parse-tree-node) ### Reordering * [Move start rule to top](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#move-start-rule) * [Reorder parser rules](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#reorder-parser-rules) * [Sort modes](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#sort-modes) ### Changing rules * [Remove useless parentheses](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#remove-useless-parentheses) * [Remove useless parser rules](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#remove-useless-productions) * [Rename lexer or parser symbol](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#rename) * [Unfold](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#Unfold) * [Group alts](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#group-alts) * [Ungroup alts](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#ungroup-alts) * [Upper and lower case string literals](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#upper-and-lower-case-string-literals) * [Fold](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#Fold) * Replace direct left recursion with right recursion * [Replace direct left/right recursion with Kleene operator](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#Kleene) * Replace indirect left recursion with right recursion * Replace parser rule symbols that conflict with Antlr keywords * [Replace string literals in parser with lexer symbols](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#replace-literals-in-parser-with-lexer-token-symbols) * Replace string literals in parser with lexer symbols, with lexer rule create * [Delabel removes the annoying and mostly useless labeling in an Antlr grammar](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#delabel) ### Splitting and combining * [Split combined grammars](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#splitting-and-combining-grammars) * [Combine splitted grammars](https://github.com/kaby76/Trash/blob/main/doc/refactoring.md#splitting-and-combining-grammars) ## Conversion * [Antlr3 import](https://github.com/kaby76/Trash/blob/main/doc/Import.md#antlr3) * [Antlr2 import](https://github.com/kaby76/Trash/blob/main/doc/Import.md#antlr2) * [Bison import](https://github.com/kaby76/Trash/blob/main/doc/Import.md#bison) --------- The source code for the extension is open source, free of charge, and free of ads. For the latest developments on the extension, check out my [blog](http://codinggorilla.com). # Building git clone https://github.com/kaby76/Trash cd Trash make clean; make; make install You must have the NET SDK version 10 installed to build and run. # Releases See https://github.com/kaby76/Trash/releases. If you have any questions, email me at ken.domino gmail.com