Version 3 has been the biggest chapter yet for the NLP++ extension for Visual Studio Code. What started as a way to compile and run analyzers has grown into a complete development environment for the NLP++ language — with the kind of code intelligence you’d expect from a first-class programming language. Here’s the full tour of what changed, and why it matters for the way you build analyzers.
NLP++ is now a first-class language in VS Code
The headline of the recent 3.5 through 3.9 releases: NLP++ pass files (.nlp / .pat) now get the same editor smarts that mainstream languages enjoy. Everything below was built specifically for how NLP++ analyzers are actually structured — passes, rules, regions, functions, and the knowledge base.
Navigate your analyzer like code (3.5.0)
- Outline & breadcrumbs — every pass file gets a structural outline of its regions, rules, and
@DECLfunctions, so you can jump around a long pass at a glance. - Go to Definition — Ctrl-click a rule, function, or knowledge-base concept and land on its declaration. It works across passes and reaches into
.kbbconcept definitions, not just the file you’re in. - Find All References and occurrence highlighting — see everywhere a rule or concept is used across the whole analyzer.
- Rename Symbol — safely rename a rule, function, or concept across every pass at once.
- Workspace Symbol search (Ctrl+T) — jump to any rule, function, or concept in the analyzer by name.
- Hover documentation — hover a built-in function, keyword, node accessor, or
@regionmarker for an inline explanation.
Catch mistakes without leaving the editor (3.5.0)
Diagnostics now surface problems as inline squiggles and in the Problems panel. That includes a structural linter (unbalanced brackets, unterminated comments) and real errors from the engine: when you compile or analyze, the analyzer’s err.log is parsed and each error is mapped back to the exact pass or dictionary file and line that caused it.
Write faster with IntelliSense (3.6.0) and signature help (3.7.0)
Context-aware autocomplete knows where your cursor is. Type @ and it suggests region markers; inside a code region it offers built-in functions, keywords, node accessors, and your own @DECL functions; inside a rules region it offers rule-element modifiers (opt, star, plus, trig…), concepts, and rule names from across the analyzer.
Signature help then shows a function’s parameters as you fill in the arguments, highlighting the one you’re on. Your own functions show their full parameter list, resolved across passes.
Read and understand code more easily (3.8.0, 3.9.0)
- Code folding — collapse whole regions (
@RULES,@CODE,@DECL…) and individual multi-line rules, making long pass files far easier to scan. - Semantic highlighting — identifiers are now colored by what they are: a built-in function, one of your functions, a knowledge-base concept, a rule, or a node accessor each gets its own color, on top of the existing syntax highlighting.
- Quick fixes — misspell a function call like
pnvarr(...)and the editor offers a one-click “Replace withpnvar.” It only appears when there’s a genuinely close match, so it stays out of your way otherwise.
Under the hood, all of this is built on a small, pure analysis engine that reuses the same tokenizer and region parser as the formatter — and it ships with an automated test suite, so the behavior stays solid release to release.
Compile once, run anywhere: compiled analyzers & cloud distribution
Version 3 opened with a major capability in 3.0.0: the ability to compile analyzers and the knowledge base to a native C++ library. The payoff is twofold — faster execution, and the ability to ship analyzers to customers without exposing your NLP++ source.
From there it got more flexible and easier to use:
- Granular compile targets and run modes (3.1.10) — compile the analyzer, the KB, or both, and cycle the run-mode between Interpreted, Compiled, and Compiled-KB right from the status bar.
- Deploy a stand-alone analyzer (3.4.3–3.4.5) — export a runnable, stripped-down compiled analyzer to its own folder, including the lazy dictionary files and any Python-pass scripts it needs, while leaving the
.nlpsource behind. The deployed folder opens and runs as a real analyzer. - Cloud compile by default (3.4.6) — perhaps the biggest quality-of-life change: compiling now uses a hosted cloud service out of the box. You can build a compiled analyzer with no local C++ toolchain and no configuration at all. Prefer to build locally with CMake? Flip one setting.
A real formatter for NLP++ (3.3.0)
NLP++ pass files got a proper Format Document (Shift+Alt+F, or format-on-save) and Format Selection. The formatter is region-aware: it reflows @RULES blocks one element per line with an aligned, auto-numbered comment column, and re-indents code regions with tabs and Allman braces, while leaving header/preamble regions untouched.
Just as important is how safe it is. The engine is built on a lossless tokenizer, so strings and comments can never be corrupted, and a region is only reformatted when doing so provably doesn’t change what a rule matches. It was verified idempotent and lossless across a corpus of more than 11,000 real .nlp files — and along the way it fixed a latent bug that had been silently dropping an attribute bracket on rewrite nodes in thousands of rules.
Better help, testing, and everyday workflow (3.2.0)
- In-extension Help system — a Help view in the sidebar with markdown pages (Quick Start, Compiling, Regression Testing, Lazy Loading) and a browsable NLP++ reference for functions and variables.
- Built-in regression-test runner — run regression tests and “bless” golden files natively, streaming
PASS/FAIL/MISSINGresults into the Logging view with no terminal and no Python dependency. A test icon and right-click actions let you scope a run to any file or folder. - Create Claude Prompt to Build an Analyzer — generates a ready-to-use prompt pre-filled with your machine’s engine, example, and library paths.
Reliability, transparency, and polish
- A rock-solid updater (3.2.26–3.2.29) — a series of fixes ended the recurring “stuck on unzipping” hangs (the real culprit: a zip library that stalled on large engine libraries, now replaced by the OS-native extractor), made partial installs self-healing, and made the Stop button actually stop.
- Anonymous, opt-out telemetry (3.4.0) — optional usage data (feature counts and metadata only) to help prioritize work. It never sends file contents, source, names, paths, or analyzed text, and it respects both VS Code’s global telemetry setting and a dedicated
nlp.telemetry.enableswitch. - Smaller niceties — lazy-loaded KB and dictionary files now show their load times in the log (3.4.2), the Help view gained a “copy file path” action (3.4.1), and several rule-reformatting edge cases around numbered comments were fixed (3.2.31–3.2.32).
Version 3 at a glance
- 3.0.0 — Compile analyzers and the KB to native C++ libraries.
- 3.1.10 — Compile the KB separately; three run modes.
- 3.2.0 — In-extension Help system and native regression-test runner.
- 3.3.0 — Lossless, region-aware NLP++ formatter.
- 3.4.0 — Anonymous, opt-out telemetry.
- 3.4.3–3.4.6 — Deploy stand-alone compiled analyzers; cloud compile by default.
- 3.5.0 — Language intelligence: outline, hover, go-to-definition, references, rename, workspace symbols, diagnostics.
- 3.6.0 — Context-aware IntelliSense completion.
- 3.7.0 — Signature help.
- 3.8.0 — Code folding.
- 3.9.0 — Semantic highlighting and quick fixes.
Get it
Install or update the NLP extension by dehilster from the Visual Studio Code Marketplace, or search for “NLP++” in the Extensions view. If you’re building analyzers with NLP++, Version 3 turns VS Code into a genuine home for the work — from your first rule to a compiled analyzer shipped to a customer.
Happy analyzing.
![]()
