How valkmjolnir/nasal-interpreter works
Nasal is a C++ interpreter for an ECMAScript-like scripting language, intended for standalone scripting and FlightGear-related debugging. Its principal workflow takes a script from the CLI through lexing, parsing, import linking, AST optimization and bytecode generation, then executes it in a VM or debugger. The repository also provides an interactive REPL, native libraries, formatting and linting tools, loadable modules, and a web evaluation interface. The main workflow is explicit in src/main.cpp; unsampled subsystem wiring is shown only where documented or evident from the available files.
Main entry points: main.cpp CLI entry · vm.cpp Virtual machine · compilation.cpp Compiled program · lexer.cpp Lexer
Components 21
Language pipeline
- Lexer
src/lexer/lexer.cpp - Parser
src/parse/parse.cpp - Import linker
src/parse/linker.cpp - AST optimizer
src/ast/optimizer.cpp - Bytecode generator
src/code/codegen.cpp - Compiled program
src/code/compilation.cpp
Execution runtime
- Virtual machine
src/vm/vm.cpp - Debugger
src/dbg/dbg.cpp - Garbage collector
src/vm/gc.cpp - Native registry
src/natives/registry.cpp
User interfaces
- CLI entry
src/main.cpp - Interactive REPL
src/repl/repl.cpp - Web server
nasal-web-app/server.js - Web client
nasal-web-app/public/repl.js - Web evaluation API
src/web/web.cpp
Libraries and tools
- Native libraries
src/natives - Loadable modules
module - Source formatter
src/tools/format/main.cpp - Source linter
src/tools/linter/main.cpp
Other components
- CLI user
- Browser user
Connections 22
- CLI user → CLI entry: invokes
- CLI entry → Lexer: scans source
- Lexer → Parser: provides tokens
- Parser → Import linker: provides AST
- Import linker → AST optimizer: provides linked AST
- AST optimizer → Bytecode generator: provides optimized AST
- Bytecode generator → Compiled program: emits bytecode
- CLI entry → Virtual machine: runs program
- CLI entry → Debugger: runs debug session
- Virtual machine → Compiled program: executes bytecode
- Debugger → Compiled program: debugs bytecode
- Virtual machine → Garbage collector: allocates and collects
- Virtual machine → Native registry: uses native functions
- Native registry → Native libraries: registers builtins
- CLI entry → Interactive REPL: starts REPL
- Browser user → Web client: submits code
- Web client → Web server: sends evaluation
- Web server → Web evaluation API: calls native API
- Web evaluation API → Virtual machine: evaluates code
- CLI user → Source formatter: formats source
- CLI user → Source linter: checks source
- Native libraries → Loadable modules: supports extensions