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 viaResolver-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 keylistwerden 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).
- Memory
Resolver - In-Memory-Resolver fuer Tests und CLI-Tools, die Source ohne Filesystem-Zugriff verwalten.
- Pragma
DdsXtopics #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.- Pragma
Keylist #pragma keylist Foo a b c— Cyclone/OpenSplice-Konvention.- Pragma
Prefix #pragma prefix "<prefix>"— CORBA Part 1 §14.7.5.- Preprocessor
- Top-Level-Preprocessor.
- Processed
Source - Resultat eines Preprocessor-Laufs.
- Resolve
Error - Resolver-Fehler. Fehlende Datei, IO-Fehler, etc.
- Source
Location - Originale Quell-Position nach Lookup.
- Source
Map - Source-Map.
Enums§
- Include
- Beschreibt einen Include-Request.
- Open
Splice Pragma - OpenSplice-Legacy-spezifische Pragmas (
#pragma DCPS_DATA_TYPE,#pragma DCPS_DATA_KEY,#pragma cats,#pragma genequality). - Preprocess
Error - Top-Level-Preprocessor-Fehler.
Traits§
- Resolver
- Trait fuer Include-File-Resolution.