EngelsFransSpaans

Ad


OnWorks-favicon

yaccposix - Online in de cloud

Voer yaccposix uit in OnWorks gratis hostingprovider via Ubuntu Online, Fedora Online, Windows online emulator of MAC OS online emulator

Dit is de opdracht yaccposix die kan worden uitgevoerd in de gratis hostingprovider van OnWorks met behulp van een van onze meerdere gratis online werkstations zoals Ubuntu Online, Fedora Online, Windows online emulator of MAC OS online emulator

PROGRAMMA:

NAAM


yacc — nog een andere compiler-compiler (ONTWIKKELING)

KORTE INHOUD


jacc [dltv] [b bestandsvoorvoegsel] [p sym_voorvoegsel] Grammatica

PRODUCTBESCHRIJVING


De jacc hulpprogramma leest een beschrijving van een contextvrije grammatica in Grammatica en schrijf C
broncode, conform de ISO C-standaard, naar een codebestand en optioneel header
informatie in een header-bestand, in de huidige map. De gegenereerde broncode zal
niet afhankelijk zijn van ongedefinieerd, niet-gespecificeerd of door de implementatie gedefinieerd gedrag, behalve in
gevallen waarin het rechtstreeks uit de meegeleverde grammatica is gekopieerd, of in gevallen waarin:
gedocumenteerd door de uitvoering. De C-code definieert een functie en gerelateerde routines
en macro's voor een automaat die een parseeralgoritme uitvoert dat voldoet aan de vereisten in
Algoritmen.

De vorm en betekenis van de grammatica worden beschreven in de sectie UITGEBREIDE BESCHRIJVING.

De C-broncode en het headerbestand worden geproduceerd in een vorm die geschikt is als invoer voor de C
compiler (zie c99).

OPTIES


De jacc hulpprogramma zal voldoen aan het Base Definitions-volume van POSIX.1‐2008, sectie
12.2, utility Syntaxis Richtlijnen, behalve Richtlijn 9.

De volgende opties worden ondersteund:

b bestandsvoorvoegsel
Te gebruiken bestandsvoorvoegsel in plaats van y als het voorvoegsel voor alle uitvoerbestandsnamen. De code
filet y.tab.c, het kopbestand y.tab.h (gemaakt wanneer) d is opgegeven), en de
beschrijving bestand y.uitvoer (gemaakt wanneer) v is opgegeven), wordt gewijzigd in
bestandsvoorvoegsel.tab.c, bestandsvoorvoegsel.tab.h en bestandsvoorvoegsel.uitvoer, Respectievelijk.

d Schrijf het header-bestand; standaard wordt alleen het codebestand geschreven. De #define
verklaringen koppelen de tokencodes die zijn toegewezen door jacc met de door de gebruiker aangegeven
symbolische namen. Hierdoor kunnen andere bronbestanden dan y.tab.c om toegang te krijgen tot het token
codes.

l Produceer een codebestand dat er geen bevat #lijn constructies. Als deze optie
is niet aanwezig, het is niet gespecificeerd of het codebestand of het headerbestand
#lijn richtlijnen. Dit mag alleen worden gebruikt na de grammatica en de bijbehorende
acties worden volledig gedebugd.

p sym_voorvoegsel
Te gebruiken sym_voorvoegsel in plaats van yy als voorvoegsel voor alle externe namen geproduceerd door
jacc. De betrokken namen bevatten de functies Jawel() yylex(), en
yyerr(), en de variabelen Yylval, jachar en yydebug. (In de rest van
in dit gedeelte wordt naar de zes geciteerde symbolen verwezen met hun standaardnamen
alleen voor het gemak van de notatie.) Lokale namen kunnen ook worden beïnvloed door de p
optie; echter, de p optie heeft geen invloed op: #define symbolen gegenereerd door
jacc.

t Wijzig voorwaardelijke compilatierichtlijnen om compilatie van foutopsporing toe te staan
code in het codebestand. Runtime-foutopsporingsinstructies moeten altijd worden opgenomen in:
het codebestand, maar standaard voorkomen voorwaardelijke compilatierichtlijnen hun
compilatie.

v Schrijf een bestand met een beschrijving van de parser en een rapport van conflicten
gegenereerd door onduidelijkheden in de grammatica.

OPERANDEN


De volgende operand is vereist:

Grammatica Een padnaam van een bestand met instructies, hierna genoemd Grammaticavoor
waarin een parser moet worden gemaakt. Het formaat voor de grammatica wordt beschreven in de
UITGEBREIDE BESCHRIJVING sectie.

STDIN


Niet gebruikt.

INVOER FILES


Het bestand Grammatica zal een tekstbestand zijn dat is opgemaakt zoals gespecificeerd in de UITGEBREIDE BESCHRIJVING
pagina.

MILIEU VARIABELEN


De volgende omgevingsvariabelen zijn van invloed op de uitvoering van: jacc:

TAAL Geef een standaardwaarde op voor de internationaliseringsvariabelen die niet zijn ingesteld of
nul. (Zie het volume Basisdefinities van POSIX.1‐2008, sectie 8.2,
internationalisering Variabelen voor de prioriteit van internationalisering
variabelen die worden gebruikt om de waarden van landinstellingen te bepalen.)

LC_ALL Indien ingesteld op een niet-lege tekenreekswaarde, overschrijf dan de waarden van alle andere
internationaliseringsvariabelen.

LC_CTYPE Bepaal de landinstelling voor de interpretatie van reeksen bytes tekstgegevens
als tekens (bijvoorbeeld single-byte in plaats van multi-byte tekens in
argumenten en invoerbestanden).

LC_MESSAGES
Bepaal de landinstelling die moet worden gebruikt om het formaat en de inhoud van te beïnvloeden
diagnostische berichten geschreven naar standaardfout.

NLSPAT Bepaal de locatie van berichtencatalogi voor de verwerking van: LC_MESSAGES.

De TAAL en LC_* variabelen beïnvloeden de uitvoering van de jacc nut zoals vermeld. De hoofd-()
functie gedefinieerd in Jacc Bibliotheek zal bellen:

setlocale(LC_ALL, "")

en dus het programma gegenereerd door jacc worden ook beïnvloed door de inhoud van deze
variabelen tijdens runtime.

ASYNCHROON EVENEMENTEN


Standaard.

STDOUT


Niet gebruikt.

STDERR


Als verschuiving/verminderen of verminderen/verminderen conflicten worden gedetecteerd in Grammatica, jacc zal a . schrijven
rapport van die conflicten naar de standaardfout in een niet-gespecificeerd formaat.

Standaardfout wordt ook gebruikt voor diagnostische berichten.

OUTPUT FILES


Het codebestand, het headerbestand en het beschrijvingsbestand moeten tekstbestanden zijn. Alle zijn
beschreven in de volgende secties.

Code Dien in
Dit bestand bevat de C-broncode voor de Jawel() functie. Het zal bevatten:
code voor de verschillende semantische acties met macrovervanging erop uitgevoerd als
beschreven in het gedeelte UITGEBREIDE BESCHRIJVING. Het bevat ook een kopie van de #define
statements in het headerbestand. Als een %unie aangifte wordt gebruikt, de aangifte voor
YYSTYPE wordt ook in dit bestand opgenomen.

Voorvoegsel Dien in
Het header-bestand zal bevatten: #define uitspraken die de tokennummers associëren met de
symbolische namen. Hierdoor kunnen andere bronbestanden dan het codebestand toegang krijgen tot de tokencodes.
Als een %unie declaratie wordt gebruikt, de declaratie voor YYSTYPE en an extern JYSTYPE Yylval
aangifte wordt ook in dit dossier opgenomen.

Omschrijving Dien in
Het beschrijvingsbestand moet een tekstbestand zijn met een beschrijving van de statusmachine
overeenkomend met de parser, met een niet-gespecificeerd formaat. Limieten voor interne tabellen (zie
Grenzen) worden eveneens gerapporteerd, op een door de uitvoering gedefinieerde manier. (Sommige implementaties
mag dynamische toewijzingstechnieken gebruiken en heeft geen specifieke grenswaarden om te rapporteren.)

UITGEBREID PRODUCTBESCHRIJVING


De jacc commando accepteert een taal die wordt gebruikt om een ​​grammatica voor een doeltaal te definiëren
om te worden geparseerd door de tabellen en code gegenereerd door jacc. De taal die wordt geaccepteerd door jacc een
grammatica voor de doeltaal wordt hieronder beschreven met behulp van de jacc invoertaal zelf.

De input Grammatica bevat regels die de invoerstructuur van de doeltaal beschrijven en
code die moet worden aangeroepen wanneer deze regels worden herkend om de bijbehorende semantiek te bieden
actie. De uit te voeren code zal verschijnen als tekst die bedoeld is als C-
taalcode. Deze teksten mogen geen trigraphs in de C-taal bevatten. De C-taal
insluitsels worden verondersteld een correcte functie te vormen wanneer ze worden verwerkt door jacc in zijn uitvoer
bestanden. De op deze manier opgenomen code wordt uitgevoerd tijdens de herkenning van de
doel taal.

Gegeven een grammatica, de jacc hulpprogramma genereert de bestanden beschreven in de OUTPUT FILES
sectie. Het codebestand kan worden gecompileerd en gekoppeld met behulp van c99. Als de aangifte en
programmasecties van het grammaticabestand bevatten geen definities van hoofd-() yylex(), en
yyerr(), de gecompileerde uitvoer vereist koppeling met extern geleverde versies daarvan
functies. Standaardversies van hoofd-() en yyerr() worden geleverd in de jacc bibliotheek en
kan worden gekoppeld met behulp van de l y operand naar c99. De jacc bibliotheekinterfaces hoeven niet
ondersteuningsinterfaces met andere dan de standaard yy symbool voorvoegsel. De applicatie biedt:
de lexicale analysatorfunctie, yylex(); de lex hulpprogramma is speciaal ontworpen om
zo'n routine genereren.

Invoer Taal
De aanvraag zorgt ervoor dat elk specificatiebestand bestaat uit drie secties in:
bestellen: verklaringen, Grammatica reglement en programma's, gescheiden door dubbel
karakters ("%%"). De secties declaraties en programma's mogen leeg zijn. Als dat laatste is
leeg, de voorgaande "%%" markering die het scheidt van het gedeelte met regels kan worden weggelaten.

De invoer is tekst in vrije vorm volgens de structuur van de hieronder gedefinieerde grammatica.

Lexicale Structuur of de Grammatica
De , , en karakter wordt genegeerd, behalve dat de
applicatie zorgt ervoor dat ze niet voorkomen in namen of voorbehouden aan meerdere tekens
symbolen. Opmerkingen worden ingesloten in "/* ... */", en kan overal verschijnen waar een naam is
Geldig.

Namen zijn van willekeurige lengte, opgebouwd uit letters, punten (''), onderstrepingstekens ('_'), En
niet-initiële cijfers. Hoofdletters en kleine letters zijn verschillend. Conforme toepassingen
mag geen namen gebruiken die beginnen met yy or YY omdat de jacc parser gebruikt dergelijke namen. Veel van
de namen verschijnen in de uiteindelijke uitvoer van jacc, en dus moeten ze worden gekozen om te voldoen
met eventuele aanvullende regels die zijn gemaakt door de C-compiler die moeten worden gebruikt. In het bijzonder verschijnen ze
in #define statements.

Een letterlijke tekst bestaat uit een enkel teken tussen enkele aanhalingstekens. Alles van
de ontsnappingsreeksen die door de ISO C-norm voor tekenconstanten worden ondersteund, zijn:
gesteund door jacc.

De relatie met de lexicale analysator wordt hieronder in detail besproken.

De applicatie zorgt ervoor dat het NUL-teken niet wordt gebruikt in grammaticaregels of
letterlijke.

verklaringen sectie
De sectie declaraties wordt gebruikt om de symbolen te definiëren die worden gebruikt om de doeltaal te definiëren
en hun relatie met elkaar. Vooral veel van de aanvullende informatie
vereist om dubbelzinnigheden in de contextvrije grammatica voor de doeltaal op te lossen is
hier verstrekt.

Gewoonlijk jacc wijst de relatie toe tussen de symbolische namen die het genereert en hun
onderliggende numerieke waarde. De sectie declaraties maakt het mogelijk om de
toekenning van deze waarden.

Het is ook mogelijk om semantische informatie te behouden die is gekoppeld aan de tokens die momenteel zijn ingeschakeld
de parse-stack in een door de gebruiker gedefinieerde C-taal unie, als de leden van de vakbond zijn
geassocieerd met de verschillende namen in de grammatica. De sectie declaraties voorziet in:
dit ook.

De eerste groep declaratoren hieronder nemen allemaal een lijst met namen als argumenten. Die lijst kan
optioneel worden voorafgegaan door de naam van een C vakbondslid (genaamd a label hieronder) verschijnen
binnen '<' en '>'. (Als uitzondering op de typografische conventies van de rest van dit
volume van POSIX.1‐2008, in dit gevallabel> vertegenwoordigt geen metavariabele, maar de
letterlijke punthaken rond een symbool.) Het gebruik van label specificeert dat de
tokens die op deze regel worden genoemd, moeten van hetzelfde C-type zijn als het vakbondslid waarnaar wordt verwezen door:
label. Dit wordt hieronder in meer detail besproken.

Voor lijsten die worden gebruikt om tokens te definiëren, kan de eerste verschijning van een bepaald token worden gevolgd door:
een positief geheel getal (als een reeks decimale cijfers). Als dit wordt gedaan, wordt de onderliggende waarde
dat eraan is toegewezen voor lexicale doeleinden, wordt als dat nummer beschouwd.

Het volgende verklaart: naam een teken zijn:

%teken [<label>] naam [aantal] [naam [aantal]]...

If label aanwezig is, wordt het C-type voor alle tokens op deze regel als het type gedeclareerd
waarnaar wordt verwezen door label. Als een positief geheel getal, aantal, volgt een naam, die waarde zal zijn
toegewezen aan het token.

Het volgende verklaart: naam om een ​​token te zijn, en kent er voorrang aan toe:

%links [<label>] naam [aantal] [naam [aantal]]...
%Rechtsaf [<label>] naam [aantal] [naam [aantal]]...

Een of meer regels, die elk met een van deze symbolen beginnen, kunnen in deze sectie verschijnen.
Alle tokens op dezelfde regel hebben hetzelfde prioriteitsniveau en dezelfde associativiteit; de lijnen
zijn in volgorde van toenemende prioriteit of bindende kracht. %links geeft aan dat de
operatoren op die regel worden associatief gelaten, en %Rechtsaf geeft op dezelfde manier rechts aan
associatieve operatoren. Indien label aanwezig is, zal het een C-type declareren voor: naamis zoals beschreven
For %teken.

Het volgende verklaart: naam om een ​​token te zijn, en geeft aan dat dit niet kan worden gebruikt
associatief:

%niet-assoc [<label>] naam [aantal] [naam [aantal]]...

Als de parser associatief gebruik van dit token tegenkomt, rapporteert hij een fout. Indien label is
aanwezig is, moet het een C-type aangeven voor: naams zoals beschreven voor %teken.

Het volgende verklaart dat vakbondslid: naams zijn niet-terminals, en daarom is het vereist
om een ​​te hebben label veld aan het begin:

%type <label> naam...

Omdat het alleen om niet-terminals gaat, is het toewijzen van een tokennummer of het gebruik van een letterlijke
ook verboden. Als deze constructie aanwezig is, jacc voert typecontrole uit; als dit
construct niet aanwezig is, zal de ontleden-stack alleen de . bevatten int type.

Elke naam die wordt gebruikt in Grammatica niet gedefinieerd door a %teken, %links, %Rechtsafof %niet-assoc
declaratie wordt verondersteld een niet-terminaal symbool te vertegenwoordigen. De jacc nutsbedrijf zal rapporteren
een fout voor elk niet-terminalsymbool dat niet aan de linkerkant van ten minste één verschijnt
grammatica regel.

Zodra het type, de prioriteit of het tokennummer van een naam is gespecificeerd, wordt deze niet meer
veranderd. Als de eerste declaratie van een token geen tokennummer toekent, jacc zal
een tokennummer toewijzen. Zodra deze toewijzing is gemaakt, wordt het tokennummer niet gewijzigd
door expliciete opdracht.

De volgende aangevers volgen niet het vorige patroon.

Het volgende verklaart de niet-terminal naam om de ... te zijn begin symbool, wat de
grootste, meest algemene structuur beschreven door de grammaticaregels:

%begin naam

Standaard is dit de linkerkant van de eerste grammaticaregel; deze standaard kan zijn
met deze verklaring overschreven.

Het volgende verklaart de jacc waardestapel om een ​​unie te zijn van de verschillende soorten waarden
gewenst.

%unie { lichaam of unie (in C)}

Het lichaam van de vakbond mag geen ongebalanceerde accolade-voorverwerkingspenningen bevatten.

Standaard zijn de waarden die worden geretourneerd door acties (zie hieronder) en de lexicale analysator:
Van type int. De jacc hulpprogramma houdt typen bij, en het voegt overeenkomstige
namen van vakbondsleden om een ​​strikte typecontrole van de resulterende parser uit te voeren.

Als alternatief, aangezien ten minste éénlabel> construct wordt gebruikt, de unie kan worden verklaard
in een header-bestand (dat zal worden opgenomen in de sectie declaraties met behulp van a #include
binnenin construeren %{ en %}), en een typedef gebruikt om het symbool YYSTYPE te definiëren dat moet worden weergegeven
deze unie. Het effect van %unie is om de verklaring van YYSTYPE rechtstreeks te verstrekken vanuit:
de jacc invoer.

Declaraties en definities in de C-taal kunnen worden weergegeven in de bijgevoegde sectie declaraties
door de volgende merken:

%{ ... %}

Deze verklaringen worden gekopieerd naar het codebestand en hebben een globale reikwijdte binnen het dus
dat ze kunnen worden gebruikt in de regels en programmasecties. De verklaringen mogen niet bevatten:
"%}" buiten een opmerking, letterlijke tekenreeks of constante met meerdere tekens.

De toepassing zorgt ervoor dat de sectie declaraties wordt beëindigd door de token %%.

Grammatica Reglement in jacc
De sectie regels definieert de contextvrije grammatica die door de functie moet worden geaccepteerd jacc
genereert en associeert met die regels C-taalacties en extra prioriteit
informatie. De grammatica wordt hieronder beschreven en een formele definitie volgt.

De sectie regels bestaat uit een of meer grammaticaregels. Een grammaticaregel heeft de vorm:

A : LICHAAM ;

Het symbool A staat voor een niet-terminale naam, en LICHAAM vertegenwoordigt een reeks van nul of
meer naams, letterlijks en semantisch acties die dan kan worden gevolgd door optional
voorrang regerens. Alleen de namen en letterlijke namen nemen deel aan de vorming van de
Grammatica; de semantische acties en voorrangsregels worden op andere manieren gebruikt. De en
de zijn jacc interpunctie. Als er meerdere opeenvolgende grammaticaregels zijn met
dezelfde linkerkant, de ('|') kan worden gebruikt om te voorkomen dat de
linkerkant; in dit geval de verschijnt pas na de laatste regel. Het lichaam
deel kan leeg zijn (of leeg van namen en letterlijke waarden) om aan te geven dat de niet-terminal
symbool komt overeen met de lege tekenreeks.

De jacc hulpprogramma kent een uniek nummer toe aan elke regel. Regels die de verticale balk gebruiken
notatie zijn verschillende regels. Het nummer dat aan de regel is toegewezen, wordt weergegeven in de beschrijving
bestand.

De elementen waaruit een LICHAAM bestaat, zijn:

naam, letterlijk
Deze vormen de regels van de grammatica: naam is ofwel een teken of niet-terminaal;
letterlijk staat voor zichzelf (min de lexicaal vereiste aanhalingstekens).

semantisch actie
Met elke grammaticaregel kan de gebruiker acties koppelen die elke keer moeten worden uitgevoerd
de regel wordt herkend in het invoerproces. (Merk op dat het woord ``actie'' kan
verwijzen ook naar de acties van de parser - verschuiven, verminderen, enzovoort.)

Deze acties kunnen waarden retourneren en kunnen de waarden verkrijgen die zijn geretourneerd door vorige
acties. Deze waarden worden bewaard in objecten van het type YYSTYPE (zie %unie). De
resultaatwaarde van de actie wordt op de ontledingsstapel bewaard met de linker
kant van de regel, toegankelijk voor andere kortingen als onderdeel van hun rechterhand
kant. Door gebruik te maken van delabel> informatie verstrekt in de sectie aangiften, de
code gegenereerd door jacc kan strikt op type worden gecontroleerd en willekeurig bevatten;
informatie. Bovendien kan de lexicale analysator dezelfde soorten
waarden voor tokens, indien gewenst.

Een actie is een willekeurig C-statement en kan als zodanig input of output doen, call
subprogramma's en verander externe variabelen. Een actie is een of meer C-statements
ingesloten in accolades '{' en '}'. De verklaringen mogen niet bevatten:
ongebalanceerde accolade voorverwerking tokens.

Bepaalde pseudo-variabelen kunnen in de actie worden gebruikt. Dit zijn macro's voor toegang
naar datastructuren die intern bekend zijn jacc.

$$ De waarde van de actie kan worden ingesteld door deze toe te wijzen aan $$. Als type
controle is ingeschakeld en het type van de toe te wijzen waarde kan niet worden
bepaald, kan een diagnostisch bericht worden gegenereerd.

$aantal Dit verwijst naar de waarde die wordt geretourneerd door de component gespecificeerd door de
teken aantal aan de rechterkant van een regel, lezend van links naar rechts;
aantal kan nul of negatief zijn. Indien aantal nul of negatief is, is het
verwijst naar de gegevens die zijn gekoppeld aan de naam op de stapel van de parser
voorafgaand aan het meest linkse symbool van de huidige regel. (Dat is, '$ 0'
verwijst naar de naam die onmiddellijk voorafgaat aan de meest linkse naam in de
huidige regel te vinden op de stapel van de parser en "$−1" naar de
symbool naar haar links.) Als aantal verwijst naar een element voorbij de stroom
punt in de regel, of voorbij de onderkant van de stapel, is het resultaat
ongedefinieerd. Als typecontrole is ingeschakeld en het type waarde dat moet worden
toegewezen niet kan worden bepaald, kan een diagnostisch bericht worden gegenereerd.

$<label>aantal
Deze komen exact overeen met de corresponderende symbolen zonder de label
opname, maar laat strikte typecontrole toe (en sluit ongewenste
type conversies). Het effect is dat de macro wordt uitgebreid om te gebruiken label
om een ​​element uit de YYSTYPE-unie te selecteren (met gegevensnaam.tag).
Dit is vooral handig als: aantal is niet positief.

$<label>$ Dit legt de referentie het type vakbondslid op waarnaar verwezen wordt
by label. Deze constructie is van toepassing wanneer een verwijzing naar een linker
contextwaarde komt voor in de grammatica en biedt jacc met een middel
voor het selecteren van een type.

Acties kunnen overal in een regel voorkomen (niet alleen aan het einde); een actie heeft toegang
waarden die worden geretourneerd door acties aan de linkerkant, en op zijn beurt kan de waarde die wordt geretourneerd zijn
toegankelijk via acties aan de rechterkant. Een actie die in het midden van een regel verschijnt
gelijkwaardig zijn aan het vervangen van de actie door een nieuw niet-terminalsymbool en
het toevoegen van een lege regel met dat niet-terminale symbool aan de linkerkant. De
semantische actie geassocieerd met de nieuwe regel zal gelijk zijn aan het origineel
actie. Het gebruik van acties binnen regels kan conflicten veroorzaken die niet
anders bestaan.

Standaard is de waarde van een regel de waarde van het eerste element erin.
Als het eerste element geen type heeft (met name in het geval van a
letterlijk) en typecontrole is ingeschakeld door %type, zal een foutmelding ontstaan.

voorrang
Het trefwoord %prec kan worden gebruikt om het prioriteitsniveau te wijzigen dat is gekoppeld aan a
bepaalde grammaticaregel. Voorbeelden hiervan zijn in gevallen waarin een unair en binair
operator hebben dezelfde symbolische representatie, maar moeten anders worden gegeven
voorrang, of waar de behandeling van een dubbelzinnige if-else constructie is
vereist. Het gereserveerde symbool %prec kan onmiddellijk verschijnen na het lichaam van
de grammaticaregel en kan worden gevolgd door een symbolische naam of een letterlijke. Het zal
ervoor zorgen dat de prioriteit van de grammaticaregel die wordt van het volgende token
naam of letterlijk. De actie voor de regel als geheel kan volgen %prec.

Als er een programmaonderdeel volgt, zorgt de applicatie ervoor dat de grammaticaregels
beëindigd door %%.

Programma's sectie
De programma's sectie kan de definitie van de lexicale analysator bevatten yylex(), En elk
andere functies; bijvoorbeeld de acties die worden gebruikt in de acties die zijn gespecificeerd in de grammaticaregels. Het
is niet gespecificeerd of de programmasectie voorafgaat aan of volgt op de semantische acties in
het uitvoerbestand; daarom, als de toepassing macrodefinities bevat en
verklaringen die bedoeld zijn om van toepassing te zijn op de code in de semantische acties, plaatst het ze
binnen "%{ ... %}" in de sectie declaraties.

Invoer Grammatica
De volgende invoer om: jacc levert een parser op voor de invoer naar jacc. Deze formele syntaxis
heeft voorrang op de voorgaande tekstsyntaxisbeschrijving.

De lexicale structuur is minder precies gedefinieerd; Lexicale Structuur of de Grammatica definieert
meeste termen. De overeenkomst tussen de vorige voorwaarden en de tokens hieronder is als:
volgt.

IDENTIFICATIE Dit komt overeen met het concept van naam, eerder gegeven. Het omvat ook:
letterlijke zoals eerder gedefinieerd.

C_IDENTIFIER
Dit is een naam, en bovendien is het bekend dat het wordt gevolgd door een . EEN
letterlijk kan dit token niet opleveren.

NUMMER Een reeks cijfers (een niet-negatief decimaal geheel getal).

TYPE, LINKS, MARK, LCURL, RCURL
Deze komen direct overeen met: %type, %links, %%, %{ en %}.

{ ... } Dit geeft C-taal broncode aan, met de mogelijke opname van: '$'
macro's zoals eerder besproken.

/* Grammatica For de invoer naar ja. */
/* Basic inzendingen. */
/* De volgend zijn erkend by de lexicaal analysator. */

%token IDENTIFIER /* Bevat identifiers en letterlijke waarden */
%token C_IDENTIFIER /* identifier (maar niet letterlijk)
gevolgd door een :. */
%token NUMMER /* [0-9][0-9]* */

/* Gereserveerde woorden : %type=>TYPE %left=>LEFT, enzovoort */

%token LINKS RECHTS NONASSOC TOKEN PREC TYPE START UNION

%token MARK /* Het %% teken. */
%token LCURL /* Het %{ teken. */
%token RCURL /* Het %} teken. */

/* 8-bit lettertekens staan ​​voor zichzelf; */
/* tokens moeten worden gedefinieerd voor multi-byte tekens. */

%startspecificatie

%%

spec: defs MARK regels staart
;
staart: MARK
{
/* Stel in deze actie de rest van het bestand in. */
}
| /* Leeg; de tweede MARK is optioneel. */
;
defs: /* Leeg. */
| zeker niet
;
def : START IDENTIFICATIE
| UNIE
{
/* Union-definitie kopiëren naar uitvoer. */
}
| LCURL
{
/* Kopieer de C-code naar het uitvoerbestand. */
}
RCURL
| rword tag nllist
;
woord : TOKEN
| LINKS
| RECHTSAF
| NONASSOC
| TYPE
;
tag : /* Leeg: unie tag-ID optioneel. */
| '<' IDENTIFICEERDER '>'
;
nllist: nmno
| nllist nmno
;
nmno : IDENTIFIER /* Opmerking: letterlijk ongeldig met % type. */
| IDENTIFICATIENUMMER /* Opmerking: ongeldig bij %-type. */
;

/* Regelsectie */

regels: C_IDENTIFIER rbody prec
| regels regel
;
regel: C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody : /* leeg */
| rbody IDENTIFICATIE
| lichaam handelen
;
handeling : '{'
{
/* Kopieer actie, vertaal $$, enzovoort. */
}
'}'
;
prec : /* Leeg */
| PREC IDENTIFICATIE
| PREC IDENTIFIER act
| prec ';'
;

Conflicten
De parser die voor een invoergrammatica wordt geproduceerd, kan toestanden bevatten waarin conflicten optreden. De
conflicten treden op omdat de grammatica dat niet is LALR(1). Een dubbelzinnige grammatica bevat altijd
minstens een LALR(1) conflicten. De jacc hulpprogramma zal alle conflicten oplossen, met behulp van ofwel:
standaardregels of door de gebruiker opgegeven voorrangsregels.

Conflicten zijn ofwel verschuiven/verminderen van conflicten of verminderen/verminderen van conflicten. Een verschuiving/vermindering
conflict is waar, voor een gegeven staat en vooruitziend symbool, zowel een verschuivingsactie als een
verminderen actie zijn mogelijk. Een reduce/reduceer conflict is waar, voor een bepaalde staat en
vooruitblik-symbool, kortingen door twee verschillende regels zijn mogelijk.

In de onderstaande regels wordt beschreven hoe u kunt specificeren welke acties moeten worden ondernomen wanneer zich een conflict voordoet. Niet
alle shift/reduceer-conflicten kunnen op deze manier met succes worden opgelost omdat het conflict kan
te wijten zijn aan iets anders dan ambiguïteit, dus onvoorzichtig gebruik van deze faciliteiten kan leiden tot:
de taal die door de parser wordt geaccepteerd, is veel anders dan de bedoeling was. De
beschrijvingsbestand moet voldoende informatie bevatten om de oorzaak van de
conflict. Waar ambiguïteit de reden is dat ofwel de standaard of expliciete regels zouden moeten zijn:
voldoende om een ​​werkende parser te produceren.

De gedeclareerde voorrangsregels en associaties (zie verklaringen sectie) zijn gewend aan
los parseerconflicten als volgt op:

1. Aan elke grammaticaregel is een prioriteit en associativiteit gekoppeld; het is de
prioriteit en associativiteit van het laatste token of letterlijk in de hoofdtekst van de regel. Indien
de %prec trefwoord wordt gebruikt, heft het deze standaard op. Sommige grammaticaregels misschien niet
zowel voorrang als associativiteit hebben.

2. Als er een shift/reduce-conflict is, en zowel de grammaticaregel als het invoersymbool
hebben voorrang en associativiteit ermee verbonden, dan is het conflict opgelost
ten gunste van de actie (verschuiven of verminderen) die hoort bij de hogere prioriteit. Als de
voorrangen zijn hetzelfde, dan wordt de associativiteit gebruikt; links associatief impliceert
verminderen, rechts associatief impliceert verschuiving, en niet-associatief impliceert een fout in de
string die wordt geparseerd.

3. Wanneer er een shift/reduceer-conflict is dat niet kan worden opgelost door regel 2, is de shift:
gedaan. Op deze manier opgeloste conflicten worden meegeteld in de diagnostische uitvoer die wordt beschreven in
Fout Behandeling.

4. Wanneer er een reduce/reduceer-conflict is, wordt een reductie gedaan door de grammaticaregel dat:
komt eerder in de invoervolgorde voor. Op deze manier opgeloste conflicten worden meegeteld in de
diagnostische uitgang beschreven in Fout Behandeling.

Conflicten opgelost door voorrang of associatie worden niet meegeteld in de shift/reduceer
en verminderen/verminderen van conflicten gemeld door jacc op standaardfout of in de
beschrijving bestand.

Fout Behandeling
het teken fout worden gereserveerd voor foutafhandeling. De naam fout kan worden gebruikt in
Grammatica regels. Het geeft plaatsen aan waar de parser kan herstellen van een syntaxisfout. De
standaardwaarde van fout moet 256 zijn. De waarde kan worden gewijzigd met a %teken verklaring.
De lexicale analysator mag niet de waarde van . retourneren fout.

De parser zal een syntaxisfout detecteren wanneer deze zich in een staat bevindt waarin de actie is gekoppeld:
met het vooruitblik-symbool is fout. Een semantische actie kan ervoor zorgen dat de parser wordt gestart
foutafhandeling door de macro YYERROR uit te voeren. Wanneer YYERROR wordt uitgevoerd, wordt de semantische
actie geeft de controle terug aan de parser. YYERROR kan niet buiten de semantiek worden gebruikt
acties.

Wanneer de parser een syntaxisfout detecteert, roept deze normaal gesproken yyerr() met het karakter
snaar "syntaxis fout" als zijn argument. De aanroep wordt niet gedaan als de parser stil is
herstellen van een eerdere fout wanneer de fout wordt gedetecteerd. De parser wordt beschouwd als:
herstellen van een eerdere fout totdat de parser over ten minste drie is verschoven
normale invoersymbolen sinds de laatste fout is gedetecteerd of een semantische actie is uitgevoerd
de macro yerrok. De parser zal niet aanroepen yyerr() wanneer YYERROR wordt uitgevoerd.

De macrofunctie YYRECOVERING retourneert 1 als een syntaxisfout is gedetecteerd en de
parser is er nog niet volledig van hersteld. Anders wordt nul geretourneerd.

Wanneer een syntaxisfout wordt gedetecteerd door de parser, zal de parser controleren of een eerdere syntaxis
fout is gedetecteerd. Als een eerdere fout is gedetecteerd en als er geen normale invoersymbolen zijn
zijn verschoven sinds de vorige fout werd gedetecteerd, controleert de parser of de
vooruitblik-symbool is een eindmarkering (zie Interface naar de Lexicale Analyzer). Als dat zo is,
parser wordt geretourneerd met een waarde die niet nul is. Anders zal het vooruitblik-symbool zijn
verwijderd en de normale ontleding wordt hervat.

Wanneer YYERROR wordt uitgevoerd of wanneer de parser een syntaxisfout detecteert en geen eerdere fout
is gedetecteerd, of er is ten minste één normaal invoersymbool verschoven sinds de vorige
fout is gedetecteerd, springt de parser één toestand tegelijk terug totdat de ontleden-stack is
leeg of de huidige staat laat een verschuiving toe fout. Als de parser de parse leegt
stack, zal het terugkeren met een waarde die niet nul is. Anders zal het verschuiven fout en
hervat vervolgens de normale ontleding. Als de parser een vooruitblik-symbool leest voordat de fout was
gedetecteerd, zal dat symbool nog steeds het vooruitziende symbool zijn wanneer het ontleden wordt hervat.

de macro yerrok in een semantische actie zal ervoor zorgen dat de parser doet alsof hij volledig heeft
hersteld van eerdere fouten. de macro yyclearin zal ervoor zorgen dat de parser wordt weggegooid
het huidige vooruitblik-token. Als het huidige vooruitblik-token nog niet is gelezen,
yyclearin heeft geen effect.

De macro YYACCEPT zorgt ervoor dat de parser terugkeert met de waarde nul. De macro YYABORT
zal ervoor zorgen dat de parser terugkeert met een waarde die niet nul is.

Interface naar de Lexicale Analyzer
De yylex() functie is een functie met gehele waarde die a . retourneert teken aantal
vertegenwoordigt het soort token dat wordt gelezen. Als er een waarde is gekoppeld aan het token
geretourneerd door yylex() (zie de bespreking van label hierboven), wordt het toegewezen aan de
externe variabele Yylval.

Als de parser en yylex() niet eens over deze token nummers, betrouwbare communicatie
daartussen kan niet plaatsvinden. Voor (single-byte karakter) letterlijke waarden is het token gewoon de
numerieke waarde van het teken in de huidige tekenset. De nummers voor andere tokens
kan ofwel worden gekozen door jacc, of gekozen door de gebruiker. In beide gevallen is de #define bouwen
van C wordt gebruikt om yylex() om deze getallen symbolisch terug te geven. De #define verklaringen
worden in het codebestand geplaatst en het headerbestand als dat bestand wordt gevraagd. de set van
tekens toegestaan ​​door jacc in een identifier groter is dan toegestaan ​​door C. Token
namen die dergelijke tekens bevatten, worden niet opgenomen in de #define verklaringen.

Als de tokennummers worden gekozen door jacc, zullen de tokens anders dan letterlijke worden toegewezen
getallen groter dan 256, hoewel er geen volgorde wordt geïmpliceerd. Een token kan expliciet worden toegewezen
een nummer door zijn eerste verschijning in de aangiftesectie te volgen met een nummer.
Namen en literalen die niet op deze manier zijn gedefinieerd, behouden hun standaarddefinitie. Alle tokennummers
toegewezen door jacc moet uniek zijn en verschillend van de tokennummers die worden gebruikt voor letterlijke en
door de gebruiker toegewezen tokens. Als dubbele tokennummers conflicten veroorzaken bij het genereren van parsers,
jacc zal een fout melden; anders is het niet gespecificeerd of de tokentoewijzing is
geaccepteerd of er is een fout gemeld.

Het einde van de invoer wordt gemarkeerd door een speciaal token genaamd de eindmarkering, die een token heeft
getal dat nul of negatief is. (Deze waarden zijn ongeldig voor andere token.) Alles
lexicale analysatoren zullen nul of negatief retourneren als een tokengetal bij het bereiken van het einde van
hun inbreng. Als de tokens tot, maar exclusief, de endmarker een structuur vormen die
overeenkomt met het startsymbool, zal de parser de invoer accepteren. Als de eindmarkering wordt gezien in
elke andere context, wordt dit als een fout beschouwd.

Voltooien de Programma
Naast Jawel() en yylex(), De functies yyerr() en hoofd-() zijn vereist om
een compleet programma maken. De applicatie kan leveren: hoofd-() en yyerr(), of die
routines kunnen worden verkregen uit de jacc bibliotheek.

Jacc Bibliotheek
De volgende functies verschijnen alleen in de jacc bibliotheek toegankelijk via de l y
operand naar c99; ze kunnen daarom opnieuw worden gedefinieerd door een conforme toepassing:

int hoofd-(komen te vervallen)
Deze functie roept Jawel() en sluit af met een niet-gespecificeerde waarde. Andere acties
binnen deze functie zijn niet gespecificeerd.

int yyerr(const verkolen *s)
Deze functie schrijft het NUL-beëindigde argument naar de standaardfout, gevolgd door
een .

De volgorde van de l y en l l operanden gegeven aan c99 is aanzienlijk; de aanvraag zal
ofwel zorgen voor zijn eigen hoofd-() functioneren of ervoor zorgen dat l y voorafgaat l l.

Debugging de parser
De parser gegenereerd door jacc moet diagnostische voorzieningen hebben die optioneel kunnen worden
ingeschakeld tijdens het compileren of tijdens runtime (indien ingeschakeld tijdens het compileren). De
compilatie van de runtime-foutopsporingscode staat onder controle van YYDEBUG, een preprocessor
symbool. Als YYDEBUG een waarde heeft die niet nul is, moet de foutopsporingscode worden opgenomen. Als het is
waarde nul is, wordt de code niet opgenomen.

In parsers waarin de foutopsporingscode is opgenomen, wordt de externe int yydebug kan zijn
gebruikt om foutopsporing in (met een waarde niet-nul) en uit (nulwaarde) tijdens runtime in te schakelen. De
beginwaarde van yydebug nul zal zijn.

. t is opgegeven, moet het codebestand zo worden gebouwd dat, als YYDEBUG nog niet is
gedefinieerd tijdens het compileren (met behulp van de c99 D YYDEBUG optie, bijvoorbeeld), YYDEBUG zal
expliciet worden ingesteld op 1. Wanneer t niet is gespecificeerd, wordt het codebestand zo opgebouwd dat,
als YYDEBUG nog niet is gedefinieerd, wordt deze expliciet op nul gezet.

Het formaat van de foutopsporingsuitvoer is niet gespecificeerd, maar bevat op zijn minst voldoende informatie
om de verschuivings- en reductieacties te bepalen, en de invoersymbolen. Het biedt ook
informatie over foutherstel.

Algoritmen
De parser geconstrueerd door jacc implementeert een LALR(1) parseeralgoritme zoals gedocumenteerd in
de literatuur. Het is niet gespecificeerd of de parser tabelgestuurd of direct gecodeerd is.

Een parser gegenereerd door jacc zal nooit een invoersymbool vragen van yylex() terwijl in een
staat waar de enige andere acties dan de foutactie reducties zijn door een enkele regel.

De literatuur van de parseertheorie definieert deze concepten.

Grenzen
De jacc hulpprogramma kan meerdere interne tabellen hebben. De minimale maxima voor deze tabellen
worden weergegeven in de volgende tabel. De exacte betekenis van deze waarden is implementatie-
bepaald. De implementatie zal de relatie tussen deze waarden en tussen
ze en eventuele foutmeldingen die de implementatie kan genereren als deze op is
ruimte voor elke interne structuur. Een implementatie kan groepen van deze bronnen combineren
in een enkele pool, zolang het totaal beschikbaar voor de gebruiker niet onder de som komt
van de maten die in deze sectie worden gespecificeerd.

Tabel: Intern Grenzen in jacc

┌───────────┬─────────┬─────────────────────────── ─────┐
Minimum
BegrenzingmaximaalOmschrijving
├───────────┼─────────┼─────────────────────────── ─────┤
│{NTERMS} │ 126 │ Aantal tokens. │
│{NNONTERM} │ 200 │ Aantal niet-terminals. │
│{NPROD} │ 300 │ Aantal regels. │
│{NSTATES} │ 600 │ Aantal staten. │
│{MEMSIZE} │ 5200 │ Lengte van regels. het totaal
│ │ │ lengte, in namen (penningen en │
│ │ │ non-terminals), van alle │
│ │ │ regels van de grammatica. de
│ │ │ linkerkant wordt meegeteld voor │
│ │ │ elke regel, zelfs als dat niet zo is │
│ │ │ expliciet herhaald, zoals │
│ │ │ gespecificeerd in Grammatica Reglement in
│ │ jacc.
│{ACTSIZE} │ 4000 │ Aantal acties. ``Acties''
│ │ │ hier (en in de beschrijving │
│ │ │ bestand) verwijzen naar parseracties │
│ │ │ (verschuiven, verminderen, enzovoort) niet │
│ │ │ naar semantische acties gedefinieerd in │
│ │ Grammatica Reglement in jacc.
└───────────┴─────────┴─────────────────────────── ─────┘

EXIT STATUS


De volgende exit-waarden worden geretourneerd:

0 Succesvolle afronding.

>0 Er is een fout opgetreden.

GEVOLGEN OF FOUTEN


Als er fouten worden aangetroffen, wordt de run afgebroken en jacc uitgangen met een niet-nul status.
Gedeeltelijke codebestanden en headerbestanden kunnen worden geproduceerd. De beknopte informatie in de
beschrijvingsbestand wordt altijd geproduceerd als de v vlag is aanwezig.

De volgend secties zijn informatief.

TOEPASSING GEBRUIK


Historische implementaties ervaren naamconflicten op de namen yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.h en y.uitvoer indien meer dan één exemplaar van jacc loopt in een
enkele map tegelijk. De b optie is toegevoegd om dit probleem op te lossen. De
gerelateerd probleem van het toestaan ​​van meerdere jacc parsers die in hetzelfde bestand moesten worden geplaatst, was
geadresseerd door een toe te voegen p optie om de eerder hardgecodeerde yy variabel voorvoegsel.

De beschrijving van de p optie specificeert de minimale set functie- en variabelenamen
die conflicten veroorzaken wanneer meerdere parsers aan elkaar worden gekoppeld. YYSTYPE hoeft niet te zijn
veranderd. In plaats daarvan kan de programmeur b om de header-bestanden voor verschillende parsers te geven
verschillende namen, en dan het bestand met de yylex() voor een bepaalde parser kan de . bevatten
header voor die parser. Namen zoals yyclearr hoeven niet te worden gewijzigd omdat ze
worden alleen gebruikt in de acties; ze hebben geen koppeling. Het is mogelijk dat een
implementatie heeft andere namen, ofwel interne voor het implementeren van dingen zoals:
yyclearr, of het verstrekken van niet-standaard functies waarmee het wil veranderen p.

Unaire operatoren die hetzelfde teken zijn als een binaire operator hebben over het algemeen hun
voorrang aangepast. Dit wordt afgehandeld door de %prec adviessymbool geassocieerd met de
bepaalde grammaticaregel die die unaire operator definieert. (Zien Grammatica Reglement in jacc.)
Toepassingen zijn niet verplicht om deze operator te gebruiken voor unaire operatoren, maar de grammatica
die het niet nodig hebben, zijn zeldzaam.

Voorbeelden


Toegang tot de jacc bibliotheek wordt verkregen met bibliotheekzoekoperanden om c99. Om de . te gebruiken
jacc bibliotheek hoofd-

c99 y.tab.c l y

Beide lex bibliotheek en de jacc bibliotheek bevat hoofd-(). Om toegang te krijgen tot de jacc hoofd-

c99 y.tab.c lex.jj.c l y l l

Dit zorgt ervoor dat de jacc bibliotheek wordt eerst doorzocht, zodat zijn hoofd-() is gebruikt.

Het historische jacc bibliotheken hebben twee eenvoudige functies die normaal gecodeerd zijn:
door de applicatieprogrammeur. Deze functies zijn vergelijkbaar met de volgende code:

#include
int hoofd(leegte)
{
extern int yyparse();

setlocale(LC_ALL, "");

/* Als de volgende parser er een is die door lex is gemaakt, is de
applicatie moet voorzichtig zijn om ervoor te zorgen dat LC_CTYPE
en LC_COLLATE zijn ingesteld op de POSIX-landinstelling. */
(ongeldig) yyparse();
retour (0);
}

# omvat

int yyerror(const char *msg)
{
(void) fprintf(stderr, "%s\n", msg);
retour (0);
}

BEWEEGREDENEN


De referenties in verwezen Documenten kan nuttig zijn bij het construeren van de parser
generator. Het artikel van DeRemer en Pennello waarnaar wordt verwezen (samen met de werken die het bevat)
references) beschrijft een techniek om parsers te genereren die voldoen aan dit volume van
POSIX.1‐2008. Het werk op dit gebied wordt nog steeds gedaan, dus uitvoerders moeten overleggen
huidige literatuur voordat u nieuwe implementaties uitvoert. Het originele Knuth-artikel is de
theoretische basis voor dit soort parser, maar de tabellen die het genereert zijn onpraktisch
groot voor redelijke grammatica's en mag niet worden gebruikt. De ``equivalent aan'' formulering is
opzettelijk om ervoor te zorgen dat de beste tafels die zijn LALR(1) kan worden gegenereerd.

Er is verwarring geweest tussen de klasse van grammatica's, de algoritmen die nodig zijn om te genereren
parsers en de algoritmen die nodig zijn om de talen te ontleden. Ze zijn allemaal redelijk
orthogonaal. In het bijzonder een parsergenerator die het volledige bereik van LR(1)
grammatica's hoeven geen complexere tabel te genereren dan een die accepteert SLR(1) (een
relatief zwakke klasse van LR-grammatica's) voor een grammatica die toevallig is SLR(1). Zo'n
implementatie hoeft de zaak ook niet te erkennen; tabelcompressie kan de . opleveren SLR(1)
tabel (of een nog kleiner dan dat) zonder te herkennen dat de grammatica is SLR(1). De
snelheid van een LR(1) parser voor elke klasse is meer afhankelijk van de tabelweergave en
compressie (of de codegeneratie als een directe parser wordt gegenereerd) dan bij de klasse
grammatica die de tabelgenerator afhandelt.

De snelheid van de parsergenerator is enigszins afhankelijk van de grammaticale klasse ervan
handvatten. De oorspronkelijke Knuth-artikelalgoritmen voor het construeren van LR-parsers waren echter:
door de auteur beoordeeld als onpraktisch traag op dat moment. Hoewel volledige LR meer is
complex dan LALR(1), naarmate computersnelheden en algoritmen verbeteren, wordt het verschil (in termen van)
acceptabele uitvoeringstijd van de wandklok) wordt steeds minder belangrijk.

Potentiële auteurs worden gewaarschuwd dat het artikel van DeRemer en Pennello waarnaar wordt verwezen
eerder geciteerd identificeert een bug (een te grote vereenvoudiging van de berekening van LALR(1)
lookahead sets) in sommige van de LALR(1) algoritme-statements die eraan voorafgingen tot
publicatie. Ze moeten de tijd nemen om dat papier op te zoeken, evenals de huidige relevante
werk, vooral dat van Aho.

De b optie is toegevoegd om een ​​draagbare methode te bieden voor het toestaan jacc om aan te werken
meerdere afzonderlijke parsers in dezelfde map. Als een map er meer dan één bevat
jacc grammatica, en beide grammatica's worden tegelijkertijd geconstrueerd (door bijvoorbeeld a
parallel maken programma), conflictresultaten. Hoewel de oplossing niet de historische praktijk is,
het corrigeert een bekende tekortkoming in historische implementaties. Overeenkomstige wijzigingen waren:
gemaakt naar alle secties die naar de bestandsnamen verwijzen y.tab.c (nu ``het codebestand''),
y.tab.h (nu ``het header-bestand''), en y.uitvoer (nu ``het beschrijvingsbestand'').

De grammatica voor jacc invoer is gebaseerd op System V-documentatie. De tekstuele beschrijving
laat daar zien dat de ';' is vereist aan het einde van de regel. De grammatica en de
uitvoering vereisen dit niet. (Het gebruik van C_IDENTIFIER zorgt ervoor dat er een reductie optreedt in
de juiste plek.)

Ook in die implementatie, de constructies zoals %teken kan worden beëindigd door een
, maar dit is niet toegestaan ​​door de grammatica. De trefwoorden zoals %teken wel
verschijnen ook in hoofdletters, wat wederom niet wordt besproken. Op de meeste plaatsen waar '%' is gebruikt,
kan worden vervangen, en er zijn alternatieve spellingen voor sommige symbolen
(bijvoorbeeld, %LINKS kan zijn "%<" of "\<").

historisch,label> kan alle tekens bevatten behalve '>', inclusief witruimte, in de
implementatie. Echter, aangezien de label moet verwijzen naar een lid van de ISO C-standaardvakbond, in
praktijkconforme implementaties hoeven alleen de set tekens voor ISO C . te ondersteunen
standaard identifiers in deze context.

Van sommige historische implementaties is bekend dat ze acties accepteren die worden beëindigd door een
punt uit. Historische implementaties laten vaak toe: '$' bij namen. Een conforme implementatie
hoeft geen van beide gedragingen te ondersteunen.

Beslissen wanneer te gebruiken %prec illustreert de moeilijkheid bij het specificeren van het gedrag van jacc.
Er kunnen zich situaties voordoen waarin de Grammatica is strikt genomen niet fout, en toch
jacc kan het niet eenduidig ​​interpreteren. De oplossing van dubbelzinnigheden in de grammatica kan
in veel gevallen worden opgelost door aanvullende informatie te verstrekken, zoals het gebruik van %type or
%unie verklaringen. Het is vaak gemakkelijker en levert meestal een kleinere parser op om te nemen
dit alternatief wanneer het gepast is.

De grootte en uitvoeringstijd van een programma dat is geproduceerd zonder de runtime-foutopsporingscode is:
meestal kleiner en iets sneller in historische implementaties.

Statistiekberichten van verschillende historische implementaties omvatten de volgende soorten:
informatie:

n/512 aansluitingen, n/300 niet-terminals
n/600 grammaticaregels, n/1500 staten
n verschuiven/verminderen, n gemelde conflicten verminderen/verminderen
n/350 gebruikte werksets
Geheugen: toestanden, enz. n/15000, parseerder n/ 15000
n/600 verschillende vooruitbliksets
n extra sluitingen
n verschuivingen, n uitzonderingen
n ga naar inzendingen
n items opgeslagen door ga naar standaard
Gebruikte optimalisatieruimte: invoer n/15000, uitgang n/ 15000
n tabelinvoer, n nul
Maximale spreiding: n, Maximale afwijking: n

Het rapport van interne tabellen in het beschrijvingsbestand wordt door de implementatie gedefinieerd
omdat alle aspecten van deze limieten ook implementatiegedefinieerd zijn. Sommige implementaties
mogen dynamische allocatietechnieken gebruiken en hebben geen specifieke grenswaarden om te rapporteren.

Het formaat van de y.uitvoer bestand is niet gegeven omdat de specificatie van het formaat niet was
gezien om de draagbaarheid van applicaties te verbeteren. De vermelding is in de eerste plaats bedoeld om mensen te helpen
gebruikers begrijpen en debuggen de parser; gebruik van y.uitvoer door een conform applicatiescript
ongebruikelijk zou zijn. Bovendien hebben implementaties geen consistente output opgeleverd en
populair formaat was duidelijk. Het formaat dat door de implementatie is geselecteerd, moet menselijk zijn.
leesbaar, naast de eis dat het een tekstbestand is.

Standaardfoutrapporten worden niet specifiek beschreven omdat ze zelden van nut zijn om:
conforme applicaties en er was geen reden om implementaties te beperken.

Sommige implementaties herkennen "={" gelijk aan '{' omdat het in historisch voorkomt
documentatie. Deze constructie werd al lang geleden als achterhaald erkend en gedocumenteerd
1978, in de genoemde Jac: Nog Nog een Compiler-compiler. Dit volume van POSIX.1 (2008)
ervoor gekozen om het als verouderd te laten en het weg te laten.

Multi-byte-tekens moeten worden herkend door de lexicale analysator en worden geretourneerd als tokens.
Ze mogen niet worden geretourneerd als letterlijke tekens van meerdere bytes. de token fout dat wordt gebruikt
voor foutherstel wordt normaal gesproken de waarde 256 toegewezen in de historische implementatie.
De tokenwaarde 256, die in veel multibyte-tekensets wordt gebruikt, is dus niet:
beschikbaar voor gebruik als de waarde van een door de gebruiker gedefinieerd token.

TOEKOMST ROUTEBESCHRIJVING


Geen.

Gebruik yaccposix online met onworks.net-services


Gratis servers en werkstations

Windows- en Linux-apps downloaden

  • 1
    itop - ITSM CMDB OpenSource
    itop - ITSM CMDB OpenSource
    IT Operations Portal: een volledig open
    source, ITIL, webgebaseerde service
    managementtool inclusief een volledig
    aanpasbare CMDB, een helpdesksysteem en
    een documentenman...
    Download itop - ITSM CMDB OpenSource
  • 2
    Clementine
    Clementine
    Clementine is een multi-platform muziek
    speler en bibliotheekorganisator geïnspireerd door
    Amarok 1.4. Het heeft een snelle en
    eenvoudig te gebruiken interface, en stelt u in staat om
    zoek en...
    Clementine downloaden
  • 3
    XISMuS
    XISMuS
    LET OP: Cumulatieve update 2.4.3 heeft
    vrijgelaten!! De update werkt voor iedereen
    vorige 2.xx-versie. Als upgraden
    vanaf versie v1.xx, download en
    i ...
    XISMuS downloaden
  • 4
    facetracknoir
    facetracknoir
    Modulair headtracking-programma dat
    ondersteunt meerdere face-trackers, filters
    en spelprotocollen. Tussen de trackers
    zijn de SM FaceAPI, AIC Inertial Head
    Volger...
    Facetracknoir downloaden
  • 5
    PHP QR-code
    PHP QR-code
    PHP QR-code is open source (LGPL)
    bibliotheek voor het genereren van QR-code,
    2-dimensionale streepjescode. Gebaseerd op
    libqrencode C bibliotheek, biedt API voor
    QR-codebalk maken...
    PHP QR-code downloaden
  • 6
    freeciv
    freeciv
    Freeciv is een gratis turn-based spel
    strategiespel voor meerdere spelers, waarin elk
    speler wordt de leider van een
    beschaving, vechtend om de
    uiteindelijke doel: worden...
    Gratis civ downloaden
  • Meer "

Linux-commando's

Ad