Yacc
| Yacc | |
|---|---|
| Kehittäjä | Stephen Johnson |
| Kehityshistoria | |
| Vakaa versio | Unknown[1] |
| Tiedot | |
| Ohjelmointikielet | C |
| Lisenssi | Unknown |
| Aiheesta muualla | |
| Versiohallinta | |
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.[2] Franklin DeRemer esitteli käyttökelpoisen LALR-parserin väitöskirjassaan vuonna 1969.[3]
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.[4] Alan Snyder käänsi yaccin uudelle C-ohjelmointikielelle.[5] Yaccin virallinen kuvaus julkaistiin 1975.[6]
Yacc on POSIX-standardissa määritelty Unix-käyttöjärjestelmien ohjelma. Yaccille on vaihtoehtona GNU-projektiin vapaa avoimen lähdekoodin toteutus GNU Bison, jonka kirjoitti alun perin Robert Corbett UCB:llä väitöskirjaansa varten.[7][8] Richard Stallman teki siitä Yacc-yhteensopivan.[9] 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.[10]
Toiminta
[muokkaa | muokkaa wikitekstiä]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.[11][12]
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
}
Lähteet
[muokkaa | muokkaa wikitekstiä]- ↑ https://www.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/yacc. Tieto on haettu Wikidatasta.
- ↑ Isoaho, LR-jäsennyksen toiminta ja käyttökohteet § 3.1 LR-jäsennyksen historiasta, URN:NBN:fi:jyu-201805132553.pdf
- ↑ https://web.archive.org/web/20130819012838/http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TR-065.pdf
- ↑ 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.
- ↑ Dennis, M. Ritchie: THE DEVELOPMENT OF THE C PROGRAMMING LANGUAGE § 14.11 S U C C E S S O R S dl.acm.org.
- ↑ Johnson, Stephen C.: Yacc: Yet Another Compiler-Compiler (Technical report). 1975. Murray Hill, New Jersey: AT&T Bell Laboratories. Arkistoitu
- ↑ Static Semantics and Compiler Error Recovery web.archive.org. 8.6.2017. Arkistoitu 8.6.2017. Viitattu 2.1.2024.
- ↑ FreeBSD Manual Pages man.freebsd.org. Viitattu 2.1.2026. (englanniksi)
- ↑ AUTHORS - bison.git - GNU bison (git mirror) git.savannah.gnu.org. Viitattu 2.1.2024.
- ↑ BYACC – Berkeley Yacc – generate LALR(1) parsers invisible-island.net. Viitattu 2.1.2024.
- ↑ yacc - man pages section 1: User Commands docs.oracle.com. Viitattu 2.1.2024.
- ↑ Plan 9 /sys/man/1/yacc 9p.io. Viitattu 2.1.2024.