Preprocessor
Inbyggd C++-omimplementation av OTP:s epp för den fastlåsta
maint-29-källkoden. Boost.Parser hanterar teckenregler; delad kompilatormetadata
tillhandahåller operatorprioritet. Expanderade token görs aldrig om till
källtext.
PreprocessorSession returnerar expanderade former (inklusive implicita
-file-attribut), strukturerad diagnostik och oföränderliga ögonblicksbilder av
funktioner per form; features() exponerar sessionens slutliga tillstånd för
parsern. Detta är ett internt gränssnitt, inte ett publikt stegformat.
DirectiveReader är det äldre API:t för enbart syntax.
Beteende som stöds
- Objektmakron och makron överlagrade på aritet, rå substitution, nästlade block-/fun-argument, strängifiering med OTP:s kanoniska tokenstavning, omdefiniering, avdefiniering och diagnostik för beroendecykler.
- Nästling av villkor med överhoppade effekter och fel, diagnostik vid EOF.
-include/-include_lib, sökvägshuvuden med miljövariabler, skyddad rekursion.?MODULE,?BASE_MODULE(och_STRING-formerna),?FILE,?LINE,?FUNCTION_NAME/?FUNCTION_ARITY,?FEATURE_AVAILABLE/?FEATURE_ENABLED,?OTP_RELEASE(29) och?MACHINE('BEAM', endast för källkodskompatibilitet).- Utvärdering av guards i
-if/-elifmed godtyckliga heltal och OTP:s katalog över guard-BIF:ar; inga godtyckliga anrop körs. - Funktioner i OTP 29.1:
maybe_expr(aktiverad som standard, styrmaybe/else) ochcompr_assign(experimentell, avstängd). Initialtallväljer båda;-feature(all, ...)i källkod är ogiltigt, som i epp. Andra namn är fel.
Kompatibilitetspolicyer
- Uppslag av inkluderingar: den aktuella filens katalog, arbetskatalogen, sedan
include-sökvägar i API-ordning. CLI:n vänder ordningen på upprepade
-Iför att matchaerlc. Absoluta sökvägar kringgår sökningen.include_libprovar vanliga sökvägar och sedan explicit angivna applikationskataloger; ingen kodserver och ingen gissning av versioner. - Sökvägshuvuden
$VARanvänder en injicerad resolver; ej satta variabler förblir literala. Operander till inkluderingar makroexpanderas inte. Filer avkodas som UTF-8 eller deklarerad Latin-1; värdens sökvägsregler gäller oavsett mål-CPU. - Inkluderingar delar tillstånd för makron/funktioner/modul; varje fil äger sin villkorsstack och logiska filmappning.
- Villkor validerar alla grenar före kortslutande utvärdering. Ogiltig syntax är ett fel; obundna variabler, icke-booleska resultat och undantag vid utvärdering ger falskt. Åtkomst till record-fält/index i villkor misslyckas; en record-åtkomst i en kortsluten gren som inte väljs är giltig.
- Record-konstruktion i ett villkor får en kontrollerad diagnostik
(
record construction requires record expansion); epp i OTP 29.1 kraschar där. - Initialvärden för
-Där literala termer normaliserade till token, inklusive binaries och externa funs somerl_parse:tokens/1inte kan representera. self()är en stabil syntetisk pid ochnode()ärnonode@nohost.- Ett LF direkt efter en inkluderings avslutande punkt flyttar fram den
returnerade
-file-raden; mellanslag, kommentar och CRLF följer OTP:sscan_dotpå ett tecken.
Gränser och diagnostik
Standardvärden (konfigurerbara via PreprocessorLimits): 256 expansionsnivåer
och 1 000 000 producerade token per form, inkluderingsdjup 64, uttrycksnästling
256, samt fasta gränser på 4 194 240 bitar för heltal (OTP:s gräns på
64-bitarsvärdar) och 1 000 000 bitar för bitstring-värden. Uttömning är en
resursdiagnostik, aldrig ett tyst falskt villkor.
Diagnostik bär en stabil kategori, allvarlighetsgrad, fysiska intervall, valfria logiska koordinater och relaterade intervall för makron/inkluderingar. Varningar får inget att misslyckas; fel låser fast misslyckandet medan återhämtningen fortsätter vid nästa formgräns.
Tester
Goldens för token (semantic/*.erl.tokens) registrerar epp:s tokensorter,
avkodade värden (flyttal som binary64-bitar) och diagnostikens ordning;
formuleringen behöver inte vara densamma som i OTP.
Lokala fragment semantic/headers/*.hrl ersätter tidigare kopierade
OTP-headerfiler. preprocessor_workflow täcker verkliga inkluderingsträd,
alternativens ordning, miljö, Latin-1 och villkorsfall via CLI:n.
Clause