Ero sivun ”Yacc” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[katsottu versio][katsottu versio]
Poistettu sisältö Lisätty sisältö
desimaalilukujen lisääminen ei ole triviaalia ja vaatisi tyyppijärjestelmän, joten jääköön pois
Pelastettu 2 lähde(ttä) ja merkitty 0 kuolleeksi.) #IABot (v2.0.9.5
 
Rivi 4: Rivi 4:
Franklin DeRemer esitteli käyttökelpoisen LALR-parserin väitöskirjassaan vuonna 1969.<ref>https://web.archive.org/web/20130819012838/http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TR-065.pdf </ref>
Franklin DeRemer esitteli käyttökelpoisen LALR-parserin väitöskirjassaan vuonna 1969.<ref>https://web.archive.org/web/20130819012838/http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TR-065.pdf </ref>


Yaccin kehitti [[Stephen Johnson]] [[Bell Labs]]illa. [[Dennis Ritchie]] oli kirjoittanut [[B (ohjelmointikieli)|B-kielen]] kääntäjän, mutta Johnson halusi lisätä siihen XOR-operaattorin, mikä osoittautui monimutkaiseksi. [[Alfred Aho|Al Aho]] kertoi Knuthin keksineen julkaisussaan paremman tavan ja Johnson ja Aho päättivät kirjoittaa B:n syntaksin formaalisti, mikä vei kaksi päivää. 50 säännön kieliopin kääntäminen vei 20 minuuttia koneaikaa. Myöhemmin Johnson sai nopeutettua ohjelmaa 10000-kertaisesti.<ref>{{Verkkoviite|osoite=https://web.archive.org/web/20130131031011/http://www.techworld.com.au/article/252319/a-z_programming_languages_yacc/|nimeke=The A-Z of Programming Languages: YACC - a-z of programming languages - Operating Systems - Techworld|julkaisu=web.archive.org|ajankohta=2013-01-31|viitattu=2024-01-02}} </ref>
Yaccin kehitti [[Stephen Johnson]] [[Bell Labs]]illa. [[Dennis Ritchie]] oli kirjoittanut [[B (ohjelmointikieli)|B-kielen]] kääntäjän, mutta Johnson halusi lisätä siihen XOR-operaattorin, mikä osoittautui monimutkaiseksi. [[Alfred Aho|Al Aho]] kertoi Knuthin keksineen julkaisussaan paremman tavan ja Johnson ja Aho päättivät kirjoittaa B:n syntaksin formaalisti, mikä vei kaksi päivää. 50 säännön kieliopin kääntäminen vei 20 minuuttia koneaikaa. Myöhemmin Johnson sai nopeutettua ohjelmaa 10000-kertaisesti.<ref>{{Verkkoviite|osoite=http://www.techworld.com.au/article/252319/a-z_programming_languages_yacc/|nimeke=The A-Z of Programming Languages: YACC - a-z of programming languages - Operating Systems - Techworld|julkaisu=web.archive.org|ajankohta=2013-01-31|viitattu=2024-01-02|arkisto=https://web.archive.org/web/20130131031011/http://www.techworld.com.au/article/252319/a-z_programming_languages_yacc/|arkistoitu=2013-01-31}}</ref>
Alan Snyder käänsi yaccin uudelle [[C (ohjelmointikieli)|C-ohjelmointikielelle]].<ref>Dennis, M. Ritchie, THE DEVELOPMENT OF THE C PROGRAMMING LANGUAGE § 14.11 S U C C E S S O R S [https://dl.acm.org/doi/pdf/10.1145/234286.1057834]</ref>
Alan Snyder käänsi yaccin uudelle [[C (ohjelmointikieli)|C-ohjelmointikielelle]].<ref>Dennis, M. Ritchie, THE DEVELOPMENT OF THE C PROGRAMMING LANGUAGE § 14.11 S U C C E S S O R S [https://dl.acm.org/doi/pdf/10.1145/234286.1057834]</ref>
Yaccin virallinen kuvaus julkaistiin 1975.<ref>Johnson, Stephen C. (1975). Yacc: Yet Another Compiler-Compiler (Technical report). Murray Hill, New Jersey: AT&T Bell Laboratories. [https://web.archive.org/web/20090306123410/http://www2.informatik.uni-erlangen.de/Lehre/WS200304/Compilerbau/Uebungen/yacc.pdf] </ref>
Yaccin virallinen kuvaus julkaistiin 1975.<ref>Johnson, Stephen C. (1975). Yacc: Yet Another Compiler-Compiler (Technical report). Murray Hill, New Jersey: AT&T Bell Laboratories. [https://web.archive.org/web/20090306123410/http://www2.informatik.uni-erlangen.de/Lehre/WS200304/Compilerbau/Uebungen/yacc.pdf] </ref>


Yacc on [[POSIX]]-standardissa määritelty [[Unix-työkaluohjelmat|Unix-käyttöjärjestelmien]] ohjelma.
Yacc on [[POSIX]]-standardissa määritelty [[Unix-työkaluohjelmat|Unix-käyttöjärjestelmien]] ohjelma.
Siitä on [[GNU-projekti]]in vapaa avoimen lähdekoodin toteutus GNU Bison, jonka kirjoitti alun perin Robert Corbett UCB:llä väitöskirjaansa varten.<ref>{{Verkkoviite|osoite=https://web.archive.org/web/20170608112235/http://www.dtic.mil/docs/citations/ADA611756|nimeke=Static Semantics and Compiler Error Recovery|julkaisu=web.archive.org|ajankohta=2017-06-08|viitattu=2024-01-02}} </ref>
Siitä on [[GNU-projekti]]in vapaa avoimen lähdekoodin toteutus GNU Bison, jonka kirjoitti alun perin Robert Corbett UCB:llä väitöskirjaansa varten.<ref>{{Verkkoviite|osoite=http://www.dtic.mil/docs/citations/ADA611756|nimeke=Static Semantics and Compiler Error Recovery|julkaisu=web.archive.org|ajankohta=2017-06-08|viitattu=2024-01-02|arkisto=https://web.archive.org/web/20170608112235/http://www.dtic.mil/docs/citations/ADA611756|arkistoitu=2017-06-08}}</ref>
[[Richard Stallman]] teki siitä Yacc-yhteensopivan.<ref>{{Verkkoviite|osoite=http://git.savannah.gnu.org/cgit/bison.git/tree/AUTHORS|nimeke=AUTHORS - bison.git - GNU bison (git mirror)|julkaisu=git.savannah.gnu.org|viitattu=2024-01-02}} </ref>
[[Richard Stallman]] teki siitä Yacc-yhteensopivan.<ref>{{Verkkoviite|osoite=http://git.savannah.gnu.org/cgit/bison.git/tree/AUTHORS|nimeke=AUTHORS - bison.git - GNU bison (git mirror)|julkaisu=git.savannah.gnu.org|viitattu=2024-01-02}} </ref>
Vuonna 1990 Corbett julkaisi toisenkin version, joka tunnetaan nykyisin nimellä Berkeley Yacc (byacc), josta tuli myöhemmin suosituin Yaccin versio nopeuden, yhteensopivuuden, bugittomuuden ja public domain -lisenssin ansiosta.<ref>{{Verkkoviite|osoite=https://invisible-island.net/byacc/|nimeke=BYACC – Berkeley Yacc – generate LALR(1) parsers|julkaisu=invisible-island.net|viitattu=2024-01-02}} </ref>
Vuonna 1990 Corbett julkaisi toisenkin version, joka tunnetaan nykyisin nimellä Berkeley Yacc (byacc), josta tuli myöhemmin suosituin Yaccin versio nopeuden, yhteensopivuuden, bugittomuuden ja public domain -lisenssin ansiosta.<ref>{{Verkkoviite|osoite=https://invisible-island.net/byacc/|nimeke=BYACC – Berkeley Yacc – generate LALR(1) parsers|julkaisu=invisible-island.net|viitattu=2024-01-02}} </ref>

Nykyinen versio 24. tammikuuta 2024 kello 16.29

Yacc (Yet Another Compiler-Compiler) on ohjelma, joka generoi yhteydettömän kieliopin sääntöjen mukaan LALR-jäsentimen (look-ahead, left-to-right, rightmost derivation parser).

Noam Chomsky julkaisi kontekstittomien kielioppien kuvauksen 1957. Niiden hyödyllisyyden tajuaminen johti siihen että Algol 60 -raportista julkaistiin uusi painos, jossa kielioppi kuvattiin BNF-notaatiolla. Donald Knuth oli keksinyt LR-parserin 1965.[1] Franklin DeRemer esitteli käyttökelpoisen LALR-parserin väitöskirjassaan vuonna 1969.[2]

Yaccin kehitti Stephen Johnson Bell Labsilla. Dennis Ritchie oli kirjoittanut B-kielen kääntäjän, mutta Johnson halusi lisätä siihen XOR-operaattorin, mikä osoittautui monimutkaiseksi. Al Aho kertoi Knuthin keksineen julkaisussaan paremman tavan ja Johnson ja Aho päättivät kirjoittaa B:n syntaksin formaalisti, mikä vei kaksi päivää. 50 säännön kieliopin kääntäminen vei 20 minuuttia koneaikaa. Myöhemmin Johnson sai nopeutettua ohjelmaa 10000-kertaisesti.[3] Alan Snyder käänsi yaccin uudelle C-ohjelmointikielelle.[4] Yaccin virallinen kuvaus julkaistiin 1975.[5]

Yacc on POSIX-standardissa määritelty Unix-käyttöjärjestelmien ohjelma. Siitä on GNU-projektiin vapaa avoimen lähdekoodin toteutus GNU Bison, jonka kirjoitti alun perin Robert Corbett UCB:llä väitöskirjaansa varten.[6] Richard Stallman teki siitä Yacc-yhteensopivan.[7] Vuonna 1990 Corbett julkaisi toisenkin version, joka tunnetaan nykyisin nimellä Berkeley Yacc (byacc), josta tuli myöhemmin suosituin Yaccin versio nopeuden, yhteensopivuuden, bugittomuuden ja public domain -lisenssin ansiosta.[8]

Yaccin säännöt kirjoitetaan Backus–Naur-muotoa muistuttavalla kielellä.

Ohjelma generoi tiedoston y.tab.c, jonka voi kääntää C-kääntäjällä. Ohjelmaan on lisäksi toteuttava leksikaalinen analysaattori nimellä yylex(void), virheenkäsittelyrutiini yyerror(char*) ja pääohjelma. Leksikaalisen analysaattorin voi luoda Lex-ohjelmalla.[9][10]

Seuraava esimerkki toteuttaa triviaalin nelilaskimen, joka osaa operaattorien presedenssijärjestyksen ja assosiatiivisuuden vasemmalle, sulkulausekkeet ja miinuksen luvun etumerkkinä.

%{
#include <stdio.h>
%}

%token NUMBER
%left '+' '-'
%left '*' '/'

%%

input:
     | input line
     ;

line: '\n'
    | X '\n' { printf("result = %d\n", $$); }
    ;

X   : X '+' X { $$ = $1 + $3; }
    | X '-' X { $$ = $1 - $3; }
    | X '*' X { $$ = $1 * $3; }
    | X '/' X { $$ = $1 / $3; }
    | '-' NUMBER { $$ = -$2; }
    | '(' X ')' { $$ = $2; }
    | NUMBER { $$ = $1; }

%%

int main(int argc, char **argv) {
  yyparse();
  return 0;
}

int yyerror(char *s) {
  fprintf(stderr, "Error: %s\n", s);
  return 0;
}

/* lexical analyzer */
#include <ctype.h>
yylex() {
  int c;
  while ((c = getchar()) == ' ' || c == '\t') ;
  if (isdigit(c)) {
    ungetc(c, stdin);
    scanf("%d", &yylval);
    return NUMBER;
  }
  if (c == EOF) return 0;
  return c; // everything else is a token
}
  1. Isoaho, LR-jäsennyksen toiminta ja käyttökohteet § 3.1 LR-jäsennyksen historiasta, URN:NBN:fi:jyu-201805132553.pdf
  2. https://web.archive.org/web/20130819012838/http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TR-065.pdf
  3. The A-Z of Programming Languages: YACC - a-z of programming languages - Operating Systems - Techworld web.archive.org. 31.1.2013. Arkistoitu 31.1.2013. Viitattu 2.1.2024.
  4. Dennis, M. Ritchie, THE DEVELOPMENT OF THE C PROGRAMMING LANGUAGE § 14.11 S U C C E S S O R S [1]
  5. Johnson, Stephen C. (1975). Yacc: Yet Another Compiler-Compiler (Technical report). Murray Hill, New Jersey: AT&T Bell Laboratories. [2]
  6. Static Semantics and Compiler Error Recovery web.archive.org. 8.6.2017. Arkistoitu 8.6.2017. Viitattu 2.1.2024.
  7. AUTHORS - bison.git - GNU bison (git mirror) git.savannah.gnu.org. Viitattu 2.1.2024.
  8. BYACC – Berkeley Yacc – generate LALR(1) parsers invisible-island.net. Viitattu 2.1.2024.
  9. yacc - man pages section 1: User Commands docs.oracle.com. Viitattu 2.1.2024.
  10. Plan 9 /sys/man/1/yacc 9p.io. Viitattu 2.1.2024.