Migrating from JavaCC / JavaCC21¶
CongoCC reads current CongoCC syntax only; it does not accept legacy JavaCC grammars. Moving an existing grammar over is a two-part job: convert the syntax, then adjust for the structural differences. The exhaustive old-to-new mapping is in Appendix: Legacy Mapping; this chapter is the workflow.
Step 1: convert the syntax¶
CongoCC itself has no converter. Use the syntax converter included with recent JavaCC 21 builds to modernize the grammar’s surface syntax:
$ java -jar javacc-full.jar convert OldGrammar.jj
This handles the mechanical changes — the options { … } block becoming
top-level settings, void Foo() : {} { … } becoming Foo : … ;,
LOOKAHEAD(…) becoming SCAN / =>||, and so on.
Step 2: build with CongoCC and fix what remains¶
Generate the converted grammar with CongoCC and work through what conversion does not cover. The recurring items are:
Imports and package references in any embedded code and injections.
Two packages. Tree building always generates a parser package and a separate node package; code cannot go in the default (unnamed) package. Set
PARSER_PACKAGE(andNODE_PACKAGEif you want something other than the default….ast).No ``XXXConstants`` interface. Token kinds are now the
TokenTypeenum; replace integer-constant references accordingly (Generated API).The base node class lives in the node package.
Hand edits to generated files must move into
INJECTstatements (Code Injection), since regeneration overwrites the output.
Step 3: reconcile behavior¶
Once it builds, confirm it behaves as before:
If the old grammar depended on JavaCC’s original lookahead quirks, set
LEGACY_GLITCHY_LOOKAHEAD = true;to reproduce them; otherwise prefer to fix the affected choice points properly withSCAN/=>||.Re-run your corpus through the test harness and compare results against the old parser.
Expect the tree shape to differ: tree building is on by default, tokens are nodes, and smart node creation suppresses trivial wrappers. Adjust with
#descriptors and the tree settings (Tree Building) until the tree matches what your application expects.
Coming from JavaCC 21¶
JavaCC 21 grammars are much closer to CongoCC, since CongoCC descends from it.
The main adjustments are the package-layout and XXXConstants changes above,
plus possibly LEGACY_GLITCHY_LOOKAHEAD; most grammars need little more.