S-udtryk

Udtrykket S-udtryk eller sexp (forkortelse for "Symbolisk udtryk" [1]  - engelsk  symbolsk udtryk ) henviser til en aftale om, hvordan man skriver semi-strukturerede data i en menneskelig læsbar tekstform. Symbolske udtryk bygges primært ud fra symboler og lister. S-udtryk er bedst kendt for deres brug i Lisp -familien af ​​programmeringssprog . S-udtryk bruges også i Lisp-afledte sprog, såsom DSSSL , og markup i kommunikationsprotokoller, såsom John McCarthys IMAP og CBCL . Detaljerne for syntaks og understøttede datatyper er forskellige fra sprog til sprog, men et fællestræk er brugen af ​​S-udtryk som præfiksnotation ved hjælp af parenteser (kendt som Cambridge Polish notation ).

S-udtryk bruges i Lisp til både kode og data (se McCarthy "Rekursive symbolske udtryksfunktioner" ). S-udtryk var oprindeligt kun beregnet til at repræsentere data, som M-udtryk skulle manipulere , men den første implementering af Lisp var en S- udtryksfortolker , som M-udtryk var beregnet til at blive oversat til, og Lisp-programmører blev hurtigt vant til at bruge S -udtryk som data. , og for koden.

S-udtryk kan enten være enkelte objekter (atomer) såsom tal, Symbol (Lisp) , inklusive specialtegn nilog t, eller prikpar , i formen (x . y). Længere lister over indlejrede prikpar, såsom (1 . (2 . (3 . nil))), kan skrives på den mere velkendte måde, som (1 2 3). Indlejrede lister kan også skrives som S-udtryk: ((молоко сок) (мёд мармелад)). S-udtryk er uafhængige af mellemrum og linjeskift, mellemrum bruges kun som afgrænsning mellem atomer.

Eksempel: en simpel grammatik i form af et S-udtryk [2] :

((( S ) ( NP ) ( VP )) (( VP ) ( V )) (( VP ) ( V ) ( NP )) (( V ) døde ) (( V ) ansat ) (( NP ) sygeplejersker ) ( ( NP ) patienter ) (( NP ) Medicenter ) (( NP ) Dr. Chan ))

Programkode kan også skrives som et S-udtryk (normalt ved hjælp af præfiksnotation). Et lille stykke syntaktisk sukker til at skrive Lisp-programmer er, at et almindeligt brugt udtryk (quote x)kan forkortes'x

Fælles Lisp eksempel :

( defun factorial ( x ) ( if ( nul x ) 1 ( * x ( factorial ( - x 1 )))))

Eksempel på skema :

( definer ( faktorial x ) ( hvis ( nul? x ) 1 ( * x ( faktoriel ( - x 1 )))))

S-udtryk i Lisp læses ved hjælp af READ-funktionen. Denne funktion læser den tekstlige repræsentation af S-udtrykket og returnerer Lisp-dataene. PRINT-funktionen kan bruges til at udskrive et S-udtryk. Hvad PRINT returnerer kan læses ved hjælp af READ-funktionen, forudsat at alle outputdataobjekter har en I/O-repræsentation. Lisp har denne repræsentation for tal, strenge, tegn, lister og mange flere datatyper. Programkode kan repræsenteres som et pænt formateret (temmelig trykt) S-udtryk ved hjælp af PPRINT-funktionen.

Lisp-programmer er gyldige S-udtryk, men ikke alle S-udtryk er gyldige Lisp-programmer. (1.0 + 3.1) er et gyldigt S-udtryk, men ikke et gyldigt Lisp-program, bruger Lisp præfiksnotation, så det flydende tal (1.0) kan ikke genkendes som en operation (det første element i udtrykket).

Standardisering

I maj 1997 foreslog Ronald Rivest Internet Draft 3] en ny RFC Projektet definerede en syntaks baseret på Lisps S-udtryk, men beregnet til generel datalagring og -udveksling svarende til XML , snarere end til programmering. Den blev aldrig godkendt som RFC, men er siden blevet citeret og brugt af andre RFC'er (f.eks . RFC 2693 ) og en række andre publikationer. [4] Det var oprindeligt beregnet til brug i SPKI .

Rivest-formatet definerer et S-udtryk som enten en oktet-streng (en række af bytes ) eller en endelig liste over andre S-udtryk. Den beskriver tre udvekslingsformater for udtryk med denne struktur. En af dem, "avanceret transport", er ret fleksibel med hensyn til formatering og ligner syntaktisk udtryk i Lisp-stil, men er ikke identisk. Den udvidede transportrepræsentation tillader for eksempel oktetstrenge at blive repræsenteret ordret (længden af ​​strengen, derefter et kolon og hele strengen "som den er"), hvilket undgår tegn, hexadecimal eller base64- repræsentation, en oktetstreng kan være placeres direkte som et "token".", hvis det opfylder visse betingelser. Rivests tokens adskiller sig fra Lisps tokens ved, at de kun eksisterer for bekvemmelighed og æstetik, og behandles på samme måde som andre strenge, snarere end at have en specifik syntaktisk betydning. Et andet udvekslingsformat, beregnet til at være mere kompakt, lettere at parse og unikt for ethvert abstrakt S-udtryk, er den "kanoniske notation", som kun tillader ordret strenge og ikke tillader mellemrum som formateringselementer uden for strenge. Endelig er der den "grundlæggende transportrepræsentation", som enten er den kanoniske form eller de samme Base64-kodede elementer omgivet af parenteser , hvor sidstnævnte tjener som en sikker transport for kanonisk-kodede S-udtryk i et system, der tillader modifikation af hvidt mellemrum (f.eks. et postsystem, der har 80 linjer brede linjer overlejret på noget længere).

Dette format er ikke blevet udbredt til brug uden for SPKI. Rivest, på sin S-udtryk-webside, giver C -kildekoden til en parser og generator, der teoretisk kunne bruges i andre programmer, selvom licenseringen af ​​disse programmer ikke er klar. Der er dog ingen begrænsninger for uafhængige implementeringer af dette format. En gratis implementering kan findes på sexpr.sf.net og leon.bottou.org/projects/minilisp .

Se også

Noter

  1. McCarthy, 1960 .
  2. Gazdar / MelisH, Natural Language Processing in Lisp
  3. Arkiveret kopi (link ikke tilgængeligt) . Hentet 5. februar 2010. Arkiveret fra originalen 1. december 2008. 
  4. rivest sexp - Google Scholar

Litteratur