Skip to main content

Module preprocessor

Module preprocessor 

Source
Expand description

C-Style Preprocessor fuer OMG IDL 4.2.

IDL erbt vom C-Preprocessor — und Vendor-IDL-Files (RTI, OpenSplice) nutzen #include, #define, #ifdef, #pragma regelmaessig. Damit der Parser solche Files konsumieren kann, sitzt der Preprocessor VOR dem Lexer und expandiert die Directives zu reinem IDL-Source.

§Scope

  • #include "rel/path.idl" und #include <abs/path.idl>: text-basierte Inklusion via Resolver-Trait
  • #define MACRO value (object-like) und #define NAME(p1, p2) body (function-like) inkl. #-Stringize und ##-Token-Paste (Spec §7.2.5 + ISO 14882 §16.3.2/§16.3.3)
  • #ifdef / #ifndef / #if / #elif / #else / #endif: konditionelle Kompilation mit Expression-Eval (defined, &&, ||, !, numerische Literale)
  • #pragma <args>: stripped (nicht im Output) — Vendor-Pragmas wie RTI’s #pragma keylist werden als spezielle AST-Nodes erfasst
  • #undef: Macro entfernen

Nicht supported:

  • Recursive Macro-Expansion (eine Pass)
  • Variadic-Macros (__VA_ARGS__)
  • #error, #warning, #line (geparst, aber nicht funktional)
  • Volle C-PP-Arithmetik in #if (Vergleiche, Bitops, Ternary)

§Source-Map

SourceMap mappt jede Position im expandierten Output auf (file_id, byte_offset_im_original). Damit Diagnostiken nach Parsing auf die richtige Original-Datei und -Zeile zeigen.

§Beispiel

use zerodds_idl::preprocessor::{Preprocessor, MemoryResolver};

let mut resolver = MemoryResolver::new();
resolver.add("Foo.idl", "struct Foo { long x; };");

let pp = Preprocessor::new(resolver);
let result = pp.process("main.idl", r#"
    #include "Foo.idl"
    #define MAX 100
    struct Bar { long limit; };
"#).expect("preprocess");

assert!(result.expanded.contains("struct Foo"));
assert!(result.expanded.contains("struct Bar"));
assert!(!result.expanded.contains("#define"));

Structs§

FileId
Stable Identifier fuer eine Datei (lokal innerhalb einer SourceMap).
MemoryResolver
In-Memory-Resolver fuer Tests und CLI-Tools, die Source ohne Filesystem-Zugriff verwalten.
PragmaDdsXtopics
#pragma dds_xtopics version="1.3" (XTypes 1.3 §7.3.1.1.1) — erlaubt einer IDL-Datei zu markieren, gegen welche XTypes-Spec- Version sie geschrieben wurde. Der Compiler-Frontend kann dann vendor-Erweiterungen mit/ohne Version-Match validieren.
PragmaKeylist
#pragma keylist Foo a b c — Cyclone/OpenSplice-Konvention.
PragmaPrefix
#pragma prefix "<prefix>" — CORBA Part 1 §14.7.5.
Preprocessor
Top-Level-Preprocessor.
ProcessedSource
Resultat eines Preprocessor-Laufs.
ResolveError
Resolver-Fehler. Fehlende Datei, IO-Fehler, etc.
SourceLocation
Originale Quell-Position nach Lookup.
SourceMap
Source-Map.

Enums§

Include
Beschreibt einen Include-Request.
OpenSplicePragma
OpenSplice-Legacy-spezifische Pragmas (#pragma DCPS_DATA_TYPE, #pragma DCPS_DATA_KEY, #pragma cats, #pragma genequality).
PreprocessError
Top-Level-Preprocessor-Fehler.

Traits§

Resolver
Trait fuer Include-File-Resolution.