
Dedicado a mi padre Mikhail Tereshkov, quien me inculcó un gusto por la ingeniería
XD Pascal es un pequeño compilador de autohospedación integrable para un dialecto de lenguaje Pascal. Se agradecen cualquier comentario, sugerencia o informes de errores. No dude en comunicarse con el autor en Github o por correo electrónico [email protected]. Disfrutar.

Escriba el símbolo del sistema:
xdpw <file.pas>
El archivo fuente debe especificarse con su extensión (.pas).
XD Pascal es similar a Delphi 6/7 y Free Pascal con los siguientes cambios:
Text es equivalente al file . Se puede usar tanto para texto como para archivos sin tipoExtended es equivalente al DoubleHigh y Low para matrices abiertas. La longitud de la matriz abierta debe pasar explícitamente a una subrutina ProgramOrUnit = [("program" | "unit") Ident ";"]
["interface"] [UsesClause] Block "." .
UsesClause = "uses" Ident {"," Ident} ";" .
Block = { Declarations } (CompoundStatement | "end") .
Declarations = DeclarationSection ["implementation" DeclarationSection] .
DeclarationSection = LabelDeclarations |
ConstDeclarations |
TypeDeclarations |
VarDeclarations |
ProcFuncDeclarations .
Initializer = ConstExpression |
StringLiteral |
"(" Initializer {"," Initializer} ")" |
"(" Ident ":" Initializer {";" Ident ":" Initializer} ")" |
SetConstructor .
LabelDeclarations = "label" Ident {"," Ident} ";"
ConstDeclarations = (UntypedConstDeclaration | TypedConstDeclaration)
{";" (UntypedConstDeclaration | TypedConstDeclaration)} .
UntypedConstDeclaration = "const" Ident "=" ConstExpression .
TypedConstDeclaration = "const" Ident ":" Type "=" Initializer .
TypeDeclarations = "type" Ident "=" Type ";" {Ident "=" Type ";"} .
VarDeclarations = "var" IdentList ":" Type ["=" Initializer] ";"
{IdentList ":" Type ["=" Initializer] ";"} .
ProcFuncDeclarations = ("procedure" | "function") Ident
[Receiver] [FormalParams] [":" TypeIdent]
[CallModifier] ";" [(Directive | Block) ";"] .
Receiver = "for" Ident ":" TypeIdent .
CallModifier = "stdcall" | "cdecl" .
Directive = "forward" | "external" ConstExpression .
ActualParams = "(" [ (Expression | Designator) |
{"," (Expression | Designator)} ] ")" .
FormalParams = "(" FormalParamList {";" FormalParamList} ")" .
FormalParamList = ["const" | "var"] IdentList [":" ["array" "of"] TypeIdent]
["=" ConstExpression] .
IdentList = Ident {"," Ident} .
Type = "(" Ident {"," Ident} ")" |
"^" TypeIdent |
["packed"] "array" "[" Type {"," Type} "]" "of" Type |
["packed"] "record" Fields "end" |
["packed"] "interface" FixedFields "end" |
["packed"] "set" "of" Type |
["packed"] "string" [ "[" ConstExpression "]" ] |
["packed"] "file" ["of" Type] |
ConstExpression ".." ConstExpression |
("procedure" | "function") [FormalParams] [":" TypeIdent] [CallModifier] |
Ident .
Fields = FixedFields
["case" [Ident ":"] Type "of"
ConstExpression {"," ConstExpression} ":" "(" Fields ")"
{";" ConstExpression {"," ConstExpression} ":" "(" Fields ")"}] [";"] .
FixedFields = IdentList ":" Type {";" IdentList ":" Type} .
TypeIdent = "string" | "file" | Ident .
Designator = BasicDesignator {Selector} .
BasicDesignator = Ident |
Ident [ActualParams] |
Ident "(" Expression ")" .
Selector = "^" |
"[" Expression {"," Expression} "]" |
"." Ident |
"(" ActualParams ")".
Statement = [Label ":"] [ (Designator | Ident) ":=" Expression |
(Designator | Ident) [ActualParams] {Selector} |
CompoundStatement |
IfStatement |
CaseStatement |
WhileStatement |
RepeatStatement |
ForStatement |
GotoStatement |
WithStatement ] .
Label = Ident .
StatementList = Statement {";" Statement} .
CompoundStatement = "begin" StatementList "end" .
IfStatement = "if" Expression "then" Statement ["else" Statement] .
CaseStatement = "case" Expression "of" CaseElement {";" CaseElement}
[";"] ["else" StatementList] [";"] "end" .
WhileStatement = "while" Expression "do" Statement .
RepeatStatement = "repeat" StatementList "until" Expression .
ForStatement = "for" Ident ":=" Expression ("to" | "downto") Expression "do" Statement.
GotoStatement = "goto" Label .
WithStatement = "with" Designator {"," Designator} "do" Statement .
CaseElement = CaseLabel {"," CaseLabel} ":" Statement .
CaseLabel = ConstExpression [".." ConstExpression] .
ConstExpression = Expression .
Expression = SimpleExpression [("="|"<>"|"<"|"<="|">"|">="|"in") SimpleExpression] .
SimpleExpression = ["+"|"-"] Term {("+"|"-"|"or"|"xor") Term}.
Term = Factor {("*"|"/"|"div"|"mod"|"shl"|"shr"|"and") Factor}.
Factor = (Designator | Ident) [ActualParams] {Selector} |
Designator |
"@" Designator |
Number |
CharLiteral |
StringLiteral |
"(" Expression ")" |
"not" Factor |
SetConstructor |
"nil" |
Ident "(" Expression ")" {Selector} .
SetConstructor = "[" [Expression [".." Expression]
{"," Expression [".." Expression]}] "]" .
Ident = (Letter | "_") {Letter | "_" | Digit}.
Number = "$" HexDigit {HexDigit} |
Digit {Digit} ["." {Digit}] ["e" ["+" | "-"] Digit {Digit}] .
CharLiteral = "'" (Character | "'" "'") "'" |
"#" Number .
StringLiteral = "'" {Character | "'" "'"} "'".
El compilador se basa en un analizador de descenso recursivo. Construye directamente un ejecutable de Windows PE sin usar ningún ensamblador o enlazador externo.
$APPTYPE - Establecer el tipo de aplicación. Ejemplos: {$APPTYPE GUI} , {$APPTYPE CONSOLE}$UNITPATH - Establecer ruta de búsqueda de unidades adicionales. Ejemplo: {$UNITPATH ..units} Se realizan algunas optimizaciones simples de mirilla:
Los siguientes identificadores se implementan como parte del compilador. Sus nombres no son palabras reservadas y el usuario puede redefinir localmente.
procedure Inc ( var x: Integer);
procedure Dec ( var x: Integer);
procedure Read ([ var F: file ;] var x1 { ; var xi } );
procedure Write ([ var F: file ;] x1[:w[:d]] { ; xi[:w[:d]] } );
procedure ReadLn ([ var F: file ;] var x1 { ; var xi } );
procedure WriteLn ([ var F: file ;] x1[:w[:d]] { ; xi[:w[:d]] } );
procedure New ( var P: Pointer);
procedure Dispose ( var P: Pointer);
procedure Break ;
procedure Continue ;
procedure Exit ;
procedure Halt [( const error: Integer)];
function SizeOf ( var x | T): Integer;
function Ord (x: T): Integer;
function Chr (x: Integer): Char;
function Low ( var x: T | T): T;
function High ( var x: T | T): T;
function Pred (x: T): T;
function Succ (x: T): T;
function Round (x: Real): Integer;
function Abs (x: T): T;
function Sqr (x: T): T;
function Sin (x: Real): Real;
function Cos (x: Real): Real;
function Arctan (x: Real): Real;
function Exp (x: Real): Real;
function Ln (x: Real): Real;
function SqRt (x: Real): Real; function Timer : Integer;
procedure GetMem ( var P: Pointer; Size: Integer);
procedure FreeMem ( var P: Pointer);
procedure Randomize ;
function Random : Real;
procedure Assign ( var F: file ; const Name : string);
procedure Rewrite ( var F: file [; BlockSize: Integer]);
procedure Reset ( var F: file [; BlockSize: Integer]);
procedure Close ( var F: file );
procedure BlockRead ( var F: file ; var Buf; Len: Integer; var LenRead: Integer);
procedure BlockWrite ( var F: file ; var Buf; Len: Integer);
procedure Seek ( var F: file ; Pos: Integer);
function FileSize ( var F: file ): Integer;
function FilePos ( var F: file ): Integer;
function EOF ( var F: file ): Boolean;
function IOResult : Integer;
function Length ( const s: string): Integer;
procedure Move ( var Source; var Dest; Count: Integer);
function Copy ( const S: string; Index, Count: Integer): string;
procedure FillChar ( var Data; Count: Integer; Value : Char);
function ParamCount : Integer;
function ParamStr (Index: Integer): string;
procedure Val ( const s: string; var Number: Real; var Code: Integer);
procedure Str (Number: Real; var s: string[; DecPlaces: Integer]);
procedure IVal ( const s: string; var Number: Integer; var Code: Integer);
procedure IStr (Number: Integer; var s: string);
function UpCase (ch: Char): Char; function IntToStr (n: Integer): string;
function StrToInt ( const s: string): Integer;
function FloatToStr (x: Real): string;
function FloatToStrF (x: Real; Format: TFloatFormat; Precision, Digits: Integer): string;
function StrToFloat ( const s: string): Real;
function StrToPChar ( const s: string): PChar;
function PCharToStr (p: PChar): string;
function StrToPWideChar ( const s: string): PWideChar;
function PWideCharToStr (p: PWideChar): string;factor.pas - demostración de factorización enteralineq.pas - solucionador de ecuaciones lineales. Utiliza la unidad gauss.pas . Requiere eq.txt , eqerr.txt o archivo de datos similarlife.pas - El juego de la vidasort.pas - Demo de clasificación de matrizfft.pas - Demo de transformación rápida de Fourierinserr.pas - Demo de estimación de errores del sistema de navegación inercial. Utiliza la unidad kalman.paslist.pas - Demo de operaciones de lista vinculadamap.pas - Operaciones de la lista heterogénea y la demostración de la función de mapas. Demuestra métodos e interfaces de Pascalgui.pas - Demo de la aplicación GUI. Utiliza la unidad windows.pasraytracer.pas - Raytracer Demo. Demuestra métodos e interfaces de Pascal XD. Equivalente a raytracer.go 
Se sabe que el antivirus del defensor de Windows da resultados falsos positivos en algunos programas compilados con XD Pascal.