EnglezăFrancezăSpaniolă

Ad


Favicon OnWorks

yaccposix - Online în cloud

Rulați yaccposix în furnizorul de găzduire gratuit OnWorks prin Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

Aceasta este comanda yaccposix care poate fi rulată în furnizorul de găzduire gratuit OnWorks folosind una dintre multiplele noastre stații de lucru online gratuite, cum ar fi Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

PROGRAM:

NUME


yacc — încă un alt compilator al compilatorului (DEZVOLTARE)

REZUMAT


yacc [−dltv] [−b prefix_fișier] [−p prefix_sym] gramatică

DESCRIERE


yacc utilitarul va citi o descriere a unei gramatici fără context în gramatică si scrie C
cod sursă, conform standardului ISO C, unui fișier de cod și, opțional, antet
informații într-un fișier antet, în directorul curent. Codul sursă generat trebuie
nu depinde de niciun comportament nedefinit, nespecificat sau definit de implementare, cu excepția cazului în
cazurile în care este copiat direct din gramatica furnizată sau în cazurile care sunt
documentate de implementare. Codul C definește o funcție și rutine aferente
și macrocomenzi pentru un automat care execută un algoritm de analiză care îndeplinește cerințele din
Algoritmi.

Forma și semnificația gramaticii sunt descrise în secțiunea DESCRIERE EXTINSĂ.

Codul sursă C și fișierul antet vor fi produse într-o formă adecvată ca intrare pentru C
compilator (vezi c99).

OPŢIUNI


yacc utilitatea trebuie să se conformeze volumului Definiții de bază din POSIX.1-2008, Secțiune
12.2, Utilitate Sintaxă Instrucțiuni, cu excepția Ghidului 9.

Următoarele opțiuni vor fi acceptate:

−b prefix_fișier
Utilizare prefix_fișier în loc de y ca prefix pentru toate numele de fișiere de ieșire. Codul
fişier y.tab.c, fișierul antet y.tab.h (creat când −d este specificat), iar
fişier de descriere y.ieşire (creat când −v este specificat), se schimbă în
prefix_fișier.tab.c, prefix_fișier.tab.h, și prefix_fișier.ieșire, respectiv.

−d Scrieți fișierul antet; implicit este scris doar fișierul de cod. The #defini
instrucțiunile asociază codurile de simbol atribuite de yacc cu utilizatorul declarat
nume de simboluri. Acest lucru permite alte fișiere sursă decât y.tab.c pentru a accesa jetonul
coduri.

−l Produceți un fișier de cod care nu conține niciunul #linia constructe. Dacă această opțiune
nu este prezent, nu este specificat dacă fișierul cod sau fișierul antet conține
#linia directive. Acest lucru ar trebui să fie folosit numai după gramatică și cele asociate
acțiunile sunt complet depanate.

−p prefix_sym
Utilizare prefix_sym în loc de yy ca prefix pentru toate denumirile externe produse de
yacc. Numele afectate includ funcțiile yyparse, yylex(), și
yeroare(), și variabilele yylval, yychar, și yydebug. (În restul
în această secțiune, cele șase simboluri citate sunt referite folosind numele lor implicite
numai ca o comoditate notațională.) Numele locale pot fi, de asemenea, afectate de −p
opțiune; Însă −p opțiunea nu va afecta #defini simboluri generate de
yacc.

−t Modificați directivele de compilare condiționată pentru a permite compilarea depanării
cod în fișierul de cod. Declarațiile de depanare în timpul execuției vor fi întotdeauna conținute în
fișierul cod, dar implicit directivele de compilare condiționată le împiedică
compilare.

−v Scrieți un fișier care să conțină o descriere a parserului și un raport al conflictelor
generate de ambiguităţile din gramatică.

OPERANDE


Este necesar următorul operand:

gramatică O cale a unui fișier care conține instrucțiuni, denumit în continuare gramatică, Pentru
care urmează să fie creat un parser. Formatul pentru gramatică este descris în
secțiunea DESCRIERE EXTINSĂ.

Stdin


Nefolosit.

INTRARE DOSARE


Fișierul gramatică va fi un fișier text formatat așa cum este specificat în DESCRIEREA EXTINSĂ
secţiune.

MEDIUL VARIABILE


Următoarele variabile de mediu vor afecta execuția yacc:

LIMBA Furnizați o valoare implicită pentru variabilele de internaționalizare care sunt nesetate sau
nul. (A se vedea volumul Definiții de bază din POSIX.1‐2008, Secțiune 8.2,
Internaționalizare Variabile pentru prioritatea internaţionalizării
variabile utilizate pentru a determina valorile categoriilor locale.)

LC_ALL Dacă este setată la o valoare șir nevid, suprascrieți valorile tuturor celorlalte
variabile de internaţionalizare.

LC_CTYPE Determinați locația pentru interpretarea secvențelor de octeți de date text
ca caractere (de exemplu, caractere pe un singur octet, spre deosebire de caractere pe mai mulți octeți în
argumente și fișiere de intrare).

LC_MESSAGES
Determinați locația care ar trebui utilizată pentru a afecta formatul și conținutul
mesaje de diagnostic scrise la eroare standard.

NLSPATH Determinați locația cataloagelor de mesaje pentru procesarea LC_MESSAGES.

LIMBA și LC_* variabilele afectează execuția yacc utilitate asa cum s-a spus. The principal()
functie definita in Yacc Bibliotecă va suna:

setlocale(LC_ALL, "")

si astfel programul generat de yacc vor fi afectate și de conținutul acestora
variabile în timpul execuției.

ASINCRON EVENIMENTE


Implicit.

Stdout


Nefolosit.

Stderr


Dacă sunt detectate conflicte de schimbare/reducere sau reducere/reducere în gramatică, yacc va scrie a
raportați aceste conflicte la eroarea standard într-un format nespecificat.

Eroarea standard va fi folosită și pentru mesajele de diagnosticare.

REZULTATE DOSARE


Fișierul de cod, fișierul antet și fișierul de descriere vor fi fișiere text. Toti sunt
descrise în secțiunile următoare.

Cod Fișier
Acest fișier va conține codul sursă C pentru yyparse() funcția. Acesta trebuie să conțină
cod pentru diferitele acțiuni semantice cu substituție macro efectuată asupra lor ca
descrise în secțiunea DESCRIERE EXTINSĂ. De asemenea, trebuie să conțină o copie a #defini
declarații din fișierul antet. În cazul în care o %uniune declarație este folosită declarația pentru
YYSTYPE va fi de asemenea inclus în acest fișier.

Antet Fișier
Fișierul antet trebuie să conțină #defini declarații care asociază numerele de simbol cu
nume de simboluri. Acest lucru permite fișierelor sursă, altele decât fișierul de cod, să acceseze codurile token.
În cazul în care o %uniune este utilizată declarația, declarația pentru YYSTYPE și an extern YYSTYPE yylval
declarația va fi inclusă și în acest dosar.

Descriere Fișier
Fișierul de descriere va fi un fișier text care conține o descriere a mașinii de stări
corespunzător parserului, folosind un format nespecificat. Limitele pentru tabelele interne (vezi
limite) se raportează, de asemenea, într-o manieră definită de implementare. (Unele implementări
poate folosi tehnici de alocare dinamică și nu are valori limită specifice de raportat.)

EXTENDED DESCRIERE


yacc comanda acceptă o limbă care este folosită pentru a defini o gramatică pentru o limbă țintă
pentru a fi analizat de tabelele și codul generat de yacc. Limbajul acceptat de yacc ca o
gramatica pentru limba țintă este descrisă mai jos folosind yacc limba de intrare în sine.

Intrarea gramatică include reguli care descriu structura de intrare a limbii țintă și
cod care trebuie invocat atunci când aceste reguli sunt recunoscute pentru a furniza semantica asociată
acțiune. Codul care urmează să fie executat va apărea ca corpuri de text care sunt destinate a fi C-
codul limbii. Aceste corpuri de text nu trebuie să conțină trigrafe în limba C. Limbajul C
se presupune că incluziunile formează o funcție corectă atunci când sunt procesate de yacc în ieșirea sa
fișiere. Codul inclus în acest mod va fi executat în timpul recunoașterii
limbă țintă.

Având în vedere o gramatică, yacc utilitarul generează fișierele descrise în FIȘIERE DE IEȘIRE
secțiune. Fișierul de cod poate fi compilat și legat folosind c99. Dacă declaraţia şi
secțiunile de programe ale fișierului de gramatică nu au inclus definiții ale principal, yylex(), și
yeroare(), ieșirea compilată necesită conectarea cu versiuni ale acestora furnizate extern
funcții. Versiunile implicite ale principal() și yeroare() sunt furnizate în yacc bibliotecă și
pot fi conectate utilizând −l y operand la c99. yacc interfețele bibliotecii nu trebuie
suportă interfețe cu altele decât cele implicite yy prefix de simbol. Aplicația oferă
funcția de analizor lexical, yylex(); cel Lex utilitatea este special concepută pentru
generează o astfel de rutină.

Intrare Limbă
Aplicația trebuie să se asigure că fiecare fișier de specificații constă din trei secțiuni în
Ordin: declarații, gramatică norme, și programe, separate prin dublu
personaje („%%”). Secțiunile declarații și programe pot fi goale. Dacă acesta din urmă este
gol, precedentul „%%” marcajul care îl separă de secțiunea de reguli poate fi omis.

Introducerea este text în formă liberă, urmând structura gramaticii definită mai jos.

Lexical Structure of il Gramatică
The , , și caracterul va fi ignorat, cu excepția faptului că
aplicația trebuie să se asigure că acestea nu apar în nume sau mai multe caractere rezervate
simboluri. Comentariile vor fi incluse în „/* ... */", și poate apărea oriunde este un nume
valabil.

Numele sunt de lungime arbitrară, formate din litere, puncte ('.'), subliniere ('_'), Şi
cifre non-inițiale. Literele mari și mici sunt distincte. Aplicații conforme
nu vor folosi nume care încep în yy or YY din moment ce yacc parserul folosește astfel de nume. Multe
numele apar în rezultatul final al yacc, și astfel ar trebui alese pentru a se conforma
cu orice reguli suplimentare create de compilatorul C pentru a fi utilizate. În special ele apar
in #defini declarații.

Un literal trebuie să fie alcătuit dintr-un singur caracter cuprins între ghilimele simple. Toate
secvențele de escape acceptate pentru constantele de caractere de standardul ISO C trebuie să fie
susținută de yacc.

Relația cu analizatorul lexical este discutată în detaliu mai jos.

Aplicația trebuie să se asigure că caracterul NUL nu este utilizat în regulile gramaticale sau
literali.

declaraţii Secțiune
Secțiunea declarații este folosită pentru a defini simbolurile folosite pentru a defini limba țintă
și relația lor unul cu celălalt. În special, multe dintre informațiile suplimentare
necesar pentru a rezolva ambiguitățile din gramatica fără context pentru limba țintă este
furnizate aici.

Obișnuit yacc atribuie relaţia dintre denumirile simbolice pe care le generează şi ale acestora
valoarea numerică subiacentă. Secțiunea declarații face posibilă controlul
atribuirea acestor valori.

De asemenea, este posibil să păstrați informații semantice asociate cu token-urile activate în prezent
stiva de analiză într-un limbaj C definit de utilizator uniune, dacă membrii sindicatului sunt
asociate cu diferitele nume din gramatică. Secțiunea declarații prevede
si asta.

Primul grup de declaratori de mai jos iau toți o listă de nume drept argumente. Această listă poate
opțional să fie precedat de numele unui membru de sindicat C (numit a etichetă mai jos) apărând
în „<” și '>'. (Ca o excepție de la convențiile tipografice din restul acestui
volumul POSIX.1‐2008, în spețăetichetă> nu reprezintă o metavariabilă, ci
paranteze unghiulare literale care înconjoară un simbol.) Utilizarea etichetă precizează că
jetoanele numite pe această linie trebuie să fie de același tip C ca și membrul uniunii la care face referire
etichetă. Acest lucru este discutat mai detaliat mai jos.

Pentru listele utilizate pentru definirea token-urilor, prima apariție a unui anumit token poate fi urmată de
un număr întreg pozitiv (ca un șir de cifre zecimale). Dacă se face acest lucru, valoarea de bază
care i se atribuie în scopuri lexicale va fi considerat numărul respectiv.

Următorul declară nume a fi un simbol:

%jeton [<etichetă>] nume [număr] [nume [număr]]...

If etichetă este prezent, tipul C pentru toate jetoanele de pe această linie va fi declarat a fi tipul
la care se face referire etichetă. Dacă un număr întreg pozitiv, număr, urmează a nume, acea valoare va fi
atribuit jetonului.

Următorul declară nume să fie un simbol și îi atribuie prioritate:

%stânga [<etichetă>] nume [număr] [nume [număr]]...
%dreapta [<etichetă>] nume [număr] [nume [număr]]...

Una sau mai multe linii, fiecare începând cu unul dintre aceste simboluri, pot apărea în această secțiune.
Toate jetoanele de pe aceeași linie au același nivel de precedență și asociativitate; liniile
sunt în ordinea creșterii priorității sau a forței de legare. %stânga denotă faptul că
operatorii de pe acea linie sunt lăsați asociativi și %dreapta în mod similar denotă dreptate
operatori asociativi. Dacă etichetă este prezent, va declara un tip C pentru numeeste așa cum este descris
pentru %jeton.

Următorul declară nume să fie un simbol și indică faptul că acesta nu poate fi folosit
asociat:

%nonassoc [<etichetă>] nume [număr] [nume [număr]]...

Dacă analizatorul întâmpină utilizarea asociativă a acestui token, raportează o eroare. Dacă etichetă is
prezent, va declara un tip C pentru numeeste așa cum este descris pentru %jeton.

Următoarea declară acel membru de sindicat numes sunt non-terminale și, prin urmare, este necesar
să ai a etichetă câmp la începutul său:

%tip <etichetă> nume...

Deoarece se ocupă numai de non-terminale, alocarea unui număr de simbol sau utilizarea unui literal este
de asemenea interzis. Dacă acest construct este prezent, yacc va efectua verificarea tipului; dacă aceasta
constructul nu este prezent, stiva de analiză va conține numai int tip.

Fiecare nume folosit în gramatică nedefinit de a %jeton, %stânga, %dreapta, Sau %nonassoc
se presupune că declarația reprezintă un simbol non-terminal. The yacc utilitatea va raporta
o eroare pentru orice simbol non-terminal care nu apare în partea stângă a cel puțin unuia
regula gramaticală.

Odată ce tipul, precedența sau numărul indicativ al unui nume este specificat, acesta nu va mai fi
schimbat. Dacă prima declarație a unui jeton nu atribuie un număr de jeton, yacc trebuie
atribuiți un număr indicativ. Odată ce această atribuire este făcută, numărul jetonului nu va fi schimbat
prin atribuire explicită.

Următorii declaratori nu urmează modelul anterior.

Următorul declară non-terminal nume a fi Începe simbol, care reprezintă
cea mai mare, cea mai generală structură descrisă de regulile gramaticale:

%start nume

În mod implicit, este partea stângă a primei reguli gramaticale; această implicită poate fi
anulată cu această declarație.

Următoarele declară yacc stiva de valori să fie o uniune a diferitelor tipuri de valori
dorit.

%uniune { corp of uniune (in C)}}

Corpul uniunii nu trebuie să conțină jetoane de preprocesare dezechilibrate pentru bretele.

În mod implicit, valorile returnate de acțiuni (vezi mai jos) și analizorul lexical vor fi
de tip int. yacc utilitarul ține evidența tipurilor și va introduce corespunzătoare
nume de membri ai uniunii pentru a efectua verificarea strictă de tip a parserului rezultat.

Alternativ, având în vedere că cel puțin unuletichetă> este folosit construct, uniunea poate fi declarată
într-un fișier antet (care va fi inclus în secțiunea declarații prin utilizarea a #include
construi înăuntru %{ și %}) și a typedef folosit pentru a defini simbolul YYSTYPE de reprezentat
această unire. Efectul %uniune este de a furniza declarația YYSTYPE direct de la
il yacc intrare.

Declarațiile și definițiile în limbajul C pot apărea în secțiunea declarații, anexată
cu următoarele semne:

%{ ... %}

Aceste declarații vor fi copiate în fișierul de cod și vor avea un domeniu de aplicare global în cadrul acestuia
că acestea pot fi folosite în secțiunile de reguli și programe. Declarațiile nu trebuie să conțină
„%}” în afara unui comentariu, literal șir sau constantă cu mai multe caractere.

Aplicația trebuie să se asigure că secțiunea declarații este încheiată prin simbol %%.

Gramatică Reguli in yacc
Secțiunea de reguli definește gramatica fără context care trebuie acceptată de funcție yacc
generează și asociază cu acele reguli acțiuni în limbaj C și prioritate suplimentară
informație. Gramatica este descrisă mai jos și urmează o definiție formală.

Secțiunea de reguli este compusă din una sau mai multe reguli gramaticale. O regulă gramaticală are forma:

A : CHIRURGIE PLASTICĂ ;

Simbolul A reprezintă un nume non-terminal și CHIRURGIE PLASTICĂ reprezintă o succesiune de zero sau
mai mult numes, literals, i semantică acțiunes care pot fi apoi urmate de opțional
precedenta pronunțas. Doar numele și literalele participă la formarea
gramatică; acţiunile semantice şi regulile de precedenţă sunt folosite în alte moduri. The și
cel sunt yacc punctuaţie. Dacă există mai multe reguli gramaticale succesive cu
aceeași parte din stânga, cel ('|') poate fi folosit pentru a evita rescrierea
partea stângă; în acest caz cel apare numai după ultima regulă. Corpul
partea poate fi goală (sau goală de nume și literale) pentru a indica faptul că non-terminal
simbolul se potrivește cu șirul gol.

yacc utilitatea atribuie un număr unic fiecărei reguli. Reguli folosind bara verticală
notația sunt reguli distincte. Numărul atribuit regulii apare în descriere
fișier.

Elementele care compun un CORP sunt:

nume, literal
Acestea formează regulile gramaticale: nume este fie un semn sau un neterminal;
literal reprezintă el însuși (mai puțin ghilimelele cerute lexical).

semantică acțiune
Cu fiecare regulă gramaticală, utilizatorul poate asocia acțiuni care trebuie efectuate de fiecare dată
regula este recunoscută în procesul de intrare. (Rețineți că cuvântul „acțiune” poate
se referă, de asemenea, la acțiunile parserului - deplasare, reducere și așa mai departe.)

Aceste acțiuni pot returna valori și pot obține valorile returnate de precedente
actiuni. Aceste valori sunt păstrate în obiecte de tip YYSTYPE (vezi %uniune).
valoarea rezultatului acțiunii va fi păstrată pe stiva de analiză cu mâna stângă
parte a regulii, pentru a fi accesate prin alte reduceri ca parte a mâinii lor drepte
latură. Prin folosireaetichetă> informatiile furnizate in sectiunea declaratii, the
cod generat de yacc poate fi strict verificat de tip și conține arbitrare
informație. În plus, analizatorul lexical poate oferi aceleași tipuri de
valori pentru jetoane, dacă se dorește.

O acțiune este o instrucțiune C arbitrară și, ca atare, poate face intrare sau ieșire, apel
subprograme și modificarea variabilelor externe. O acțiune este una sau mai multe instrucțiuni C
închise între bretele '{' și '}'. Declarațiile nu trebuie să conțină
jetoane de preprocesare neechilibrate.

Anumite pseudo-variabile pot fi folosite în acțiune. Acestea sunt macrocomenzi pentru acces
la structurile de date cunoscute intern de yacc.

$$ Valoarea acțiunii poate fi setată prin atribuirea acesteia la $$. Dacă tip
verificarea este activată și tipul valorii de atribuit nu poate fi
determinat, poate fi generat un mesaj de diagnosticare.

$număr Aceasta se referă la valoarea returnată de componenta specificată de
semn număr în partea dreaptă a unei reguli, citind de la stânga la dreapta;
număr poate fi zero sau negativ. Dacă număr este zero sau negativ, ea
se referă la datele asociate cu numele de pe stiva analizatorului
precedând simbolul din stânga al regulii curente. (Acesta este, „0 $”
se referă la numele care precede numele cel mai din stânga din
regula curentă care se găsește pe stiva parserului și „$−1” se referă la
simbol pentru ei stânga.) Dacă număr se referă la un element trecut de curent
punct în regulă, sau dincolo de partea de jos a stivei, rezultatul este
nedefinit. Dacă verificarea tipului este activată și tipul valorii care urmează să fie
atribuit nu poate fi determinat, poate fi generat un mesaj de diagnosticare.

$<etichetă>număr
Acestea corespund exact simbolurilor corespunzătoare fără etichetă
includerea, dar permite verificarea strictă a tipului (și exclude utilizarea nedorită
conversii de tip). Efectul este că macro-ul este extins pentru utilizare etichetă
pentru a selecta un element din uniunea YYSTYPE (folosind dataname.tag).
Acest lucru este deosebit de util dacă număr nu este pozitiv.

$<etichetă>$ Aceasta impune referinței tipul de membru de sindicat referit
by etichetă. Această construcție este aplicabilă atunci când o referire la o stângă
valoarea contextului apare în gramatică și oferă yacc cu un mijloc
pentru selectarea unui tip.

Acțiunile pot apărea oriunde într-o regulă (nu doar la sfârșit); o acțiune poate accesa
valorile returnate de acțiunile din stânga sa și, la rândul lor, valoarea pe care o returnează poate fi
accesat prin acțiuni în dreptul său. O acțiune care apare în mijlocul unei reguli
echivalează cu înlocuirea acțiunii cu un nou simbol neterminal și
adăugând o regulă goală cu acel simbol non-terminal în partea stângă. The
acțiunea semantică asociată cu noua regulă va fi echivalentă cu cea originală
acțiune. Folosirea acțiunilor în cadrul regulilor ar putea introduce conflicte care nu ar fi
altfel exista.

În mod implicit, valoarea unei reguli va fi valoarea primului element din ea.
Dacă primul element nu are un tip (în special în cazul a
literal) și verificarea tipului este activată de %tip, va rezulta un mesaj de eroare.

precedenta
Cuvântul cheie %prec poate fi folosit pentru a schimba nivelul de prioritate asociat cu a
o anumită regulă gramaticală. Exemple în acest sens sunt în cazurile în care un unar și binar
operatorul are aceeași reprezentare simbolică, dar trebuie să fie dat diferit
precedențe sau în cazul în care este tratarea unei construcții ambigue if-else
necesar. Simbolul rezervat %prec poate apărea imediat după corpul de
regula gramaticală și poate fi urmată de un nume simbol sau de un literal. Va fi
face ca precedența regulii gramaticale să devină cea a următorului simbol
nume sau literal. Acțiunea pentru regulă în ansamblu poate urma %prec.

Dacă urmează o secțiune de program, aplicația se asigură că regulile gramaticale sunt
terminat de %%.

Programe Secțiune
programe secțiunea poate include definiția analizorului lexical yylex(), și orice
alte funcții; de exemplu, cele folosite în acțiunile specificate în regulile gramaticale. Aceasta
nu este specificat dacă secțiunea de programe precede sau urmează acțiunile semantice din
fișierul de ieșire; prin urmare, dacă aplicația conține definiții macro și
declarațiile destinate să se aplice codului în acțiunile semantice, le va plasa
în „%{ ... %}" în secțiunea declarații.

Intrare Gramatică
Următoarea intrare la yacc produce un parser pentru intrarea către yacc. Această sintaxă formală
are prioritate față de descrierea sintaxei textului precedent.

Structura lexicală este definită mai puțin precis; Lexical Structure of il Gramatică definește
majoritatea termenilor. Corespondența dintre termenii anteriori și jetoanele de mai jos este ca
urmează.

IDENTIFICATOR Aceasta corespunde conceptului de nume, dat anterior. De asemenea, include
literali așa cum s-a definit anterior.

C_IDENTIFIER
Acesta este un nume și, în plus, se știe că este urmat de a . A
literal nu poate da acest simbol.

NUMĂR Un șir de cifre (un număr întreg zecimal nenegativ).

TIP, LEFT, MARCĂ, LCURL, RCURL
Acestea corespund direct cu %tip, %stânga, %%, %{, și %}.

{ ... } Aceasta indică codul sursă în limbaj C, cu posibila includere a „$”
macrocomenzi așa cum sa discutat anterior.

/* Gramatică pentru il intrare la yacc. */
/* pachet de bază intrări. */
/* următor sunt recunoscut by il lexical analizor. */

%token IDENTIFIER /* Include identificatori și literale */
%token C_IDENTIFIER /* identificator (dar nu literal)
urmat de un :. */
%token NUMBER /* [0-9][0-9]* */

/* Cuvinte rezervate: %type=>TYPE %left=>LEFT și așa mai departe */

%token STÂNGA DREAPTA NONASSOC TOKEN TIP PREC START UNION

%token MARK /* Marca %%. */
%token LCURL /* Marca %{. */
%token RCURL /* Marcajul %}. */

/* Literele de caractere de 8 biți sunt de sine stătătoare; */
Tokenurile /* trebuie definite pentru caracterele pe mai mulți octeți. */

%start spec

%%

spec: defs MARK regulile coada
;
coada : MARK
{
/* În această acțiune, configurați restul fișierului. */
}
| /* Gol; al doilea MARK este opțional. */
;
defs : /* Gol. */
| defs def
;
def : START IDENTIFIER
| UNIUNE
{
/* Copiați definiția uniunii în ieșire. */
}
| LCURL
{
/* Copiați codul C în fișierul de ieșire. */
}
RCURL
| rword tag nlist
;
rword: TOKEN
| STÂNGA
| DREAPTA
| NONASSOC
| TIP
;
tag : /* Gol: ID-ul etichetei uniune opțional. */
| '<' IDENTIFICATOR '>'
;
nlist: nmno
| nlist nmno
;
nmno : IDENTIFIER /* Notă: literal invalid cu tipul %. */
| NUMĂR IDENTIFICATOR /* Notă: nevalid cu tipul %. */
;

/* Secțiunea reguli */

reguli : C_IDENTIFIER rbody prec
| regulile regula
;
regula : C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody : /* gol */
| rbody IDENTIFIER
| rbody act
;
act : '{'
{
/* Copiați acțiunea, traduceți $$ și așa mai departe. */
}
'}'
;
prec : /* Gol */
| IDENTIFICATOR PREC
| PREC IDENTIFIER act
| prec ';'
;

Conflicte
Analizorul produs pentru o gramatică de intrare poate conține stări în care apar conflicte. The
conflictele apar pentru că gramatica nu este LALR(1). O gramatică ambiguă conține întotdeauna
cel puțin unul LALR(1) conflict. The yacc utilitatea va rezolva toate conflictele, folosind oricare dintre ele
reguli implicite sau reguli de prioritate specificate de utilizator.

Conflictele sunt fie deplasarea/reducerea conflictelor, fie reducerea/reducerea conflictelor. O schimbare/reducere
conflictul este în cazul în care, pentru o anumită stare și un simbol de anticipare, atât o acțiune de schimbare, cât și a
acțiunile de reducere sunt posibile. Un conflict de reducere/reducere este locul în care, pentru o anumită stare și
simbolul de anticipare, sunt posibile reduceri cu două reguli diferite.

Regulile de mai jos descriu cum să specificați ce acțiuni trebuie întreprinse atunci când apare un conflict. Nu
toate conflictele de schimbare/reducere pot fi rezolvate cu succes în acest fel deoarece conflictul poate
se datorează altceva decât ambiguității, astfel încât utilizarea imprudentă a acestor facilități poate provoca
limbajul acceptat de parser să fie mult diferit de cel care a fost intenționat. The
fișierul de descriere trebuie să conțină suficiente informații pentru a înțelege cauza
conflict. Unde ambiguitatea este motivul pentru care ar trebui să fie fie regulile implicite, fie cele explicite
adecvat pentru a produce un parser de lucru.

Precedentele și asociativitățile declarate (vezi declaraţii Secțiune) sunt obisnuiti sa
rezolvați conflictele de analiză după cum urmează:

1. Fiecărei reguli gramaticale i se asociază o precedență și o asociativitate; este
precedența și asociativitatea ultimului simbol sau literal din corpul regulii. Dacă
il %prec este utilizat cuvântul cheie, acesta înlocuiește acest implicit. Unele reguli gramaticale s-ar putea să nu
au deopotriva prioritate si asociativitate.

2. Dacă există un conflict de schimbare/reducere, și atât regula gramaticală, cât și simbolul de intrare
au prioritate si asociativitate asociate acestora, atunci conflictul este rezolvat
în favoarea acţiunii (deplasare sau reducere) asociată cu prioritate mai mare. Dacă
precedențele sunt aceleași, atunci se folosește asociativitatea; asociativ stânga implică
reduce, dreapta asociativă implică schimbare, iar non-asociativ implică o eroare în
șir fiind analizat.

3. Când există un conflict de schimbare/reducere care nu poate fi rezolvat prin regula 2, schimbarea este
Terminat. Conflictele rezolvate în acest fel sunt numărate în rezultatul de diagnostic descris în
Eroare Manipularea.

4. Când există un conflict de reducere/reducere, o reducere se face prin regula gramaticală care
apare mai devreme în secvența de intrare. Conflictele rezolvate în acest fel sunt numărate în
ieșire de diagnostic descrisă în Eroare Manipularea.

Conflictele rezolvate prin prioritate sau asociativitate nu vor fi luate în considerare în schimb/reducere
și reduce/reduce conflictele raportate de yacc fie pe eroare standard, fie în
fişier de descriere.

Eroare Manipularea
Jetonul eroare vor fi rezervate pentru tratarea erorilor. Numele eroare poate fi utilizat în
reguli gramaticale. Indică locurile în care analizatorul se poate recupera de la o eroare de sintaxă. The
valoarea implicită a eroare va fi 256. Valoarea sa poate fi modificată folosind a %jeton declaraţie.
Analizorul lexical nu trebuie să returneze valoarea lui eroare.

Analizorul trebuie să detecteze o eroare de sintaxă atunci când se află într-o stare în care acțiunea este asociată
cu simbolul lookahead este eroare. O acțiune semantică poate determina inițierea parserului
tratarea erorilor prin executarea macro-ului YYERROR. Când YYERROR este executat, semantica
acțiunea transmite controlul înapoi la parser. YYERROR nu poate fi folosit în afara semanticii
acțiuni.

Când parser-ul detectează o eroare de sintaxă, în mod normal apelează yeroare() cu caracterul
şir "sintaxă eroare" ca argument al acesteia. Apelul nu va fi efectuat dacă analizatorul este nemișcat
recuperarea de la o eroare anterioară atunci când eroarea este detectată. Analizorul este considerat a
se recuperează de la o eroare anterioară până când analizatorul a trecut peste cel puțin trei
simboluri normale de intrare de când a fost detectată ultima eroare sau a fost executată o acțiune semantică
macroul yyerrok. Analizorul nu va suna yeroare() când este executat YYERROR.

Funcția macro YYRECOVERING va returna 1 dacă a fost detectată o eroare de sintaxă și
parserul nu și-a revenit încă pe deplin. În caz contrar, zero va fi returnat.

Atunci când analizatorul detectează o eroare de sintaxă, analizatorul va verifica dacă o sintaxă anterioară
eroare a fost detectată. Dacă a fost detectată o eroare anterioară și dacă nu există simboluri de intrare normale
au fost mutate de când eroarea anterioară a fost detectată, analizatorul verifică dacă
Simbolul de anticipare este un indicator final (vezi interfaţă la il Lexical Analizor). Dacă este,
analizatorul va reveni cu o valoare diferită de zero. În caz contrar, simbolul anticipat va fi
aruncate și analizarea normală va relua.

Când YYERROR este executat sau când analizatorul detectează o eroare de sintaxă și nicio eroare anterioară
a fost detectat sau cel puțin un simbol de intrare normal a fost deplasat față de cel precedent
a fost detectată o eroare, parser-ul va reveni câte o stare până când stiva de analiză este
gol sau starea curentă permite o schimbare eroare. Dacă parserul golește analizatorul
stiva, va reveni cu o valoare diferită de zero. În caz contrar, se va schimba eroare și
apoi reluați analiza normală. Dacă analizatorul citește un simbol de anticipare înainte ca eroarea să fie
detectat, acel simbol va fi în continuare simbolul anticipat atunci când analizarea este reluată.

Macro-ul yyerrok într-o acțiune semantică va determina analizatorul să acționeze ca și cum ar fi pe deplin
recuperat din orice erori anterioare. Macro-ul yyclearin va determina analizatorul să renunțe
jetonul de anticipare curent. Dacă jetonul de anticipare curent nu a fost încă citit,
yyclearin nu va avea efect.

Macrocomanda YYACCEPT va face ca analizatorul să revină cu valoarea zero. Macro-ul YYABORT
va determina analizatorul să revină cu o valoare diferită de zero.

interfaţă la il Lexical Analizor
yylexFuncția () este o funcție cu valori întregi care returnează a semn număr
reprezentând tipul de token citit. Dacă există o valoare asociată cu simbolul
returnat de yylex() (vezi discuția despre etichetă de mai sus), acesta va fi atribuit
variabilă externă yylval.

Dacă analizatorul și yylex() nu sunt de acord cu aceste numere de simbol, comunicare de încredere
între ele nu poate apărea. Pentru literalele (caracter pe un singur octet), simbolul este pur și simplu
valoarea numerică a caracterului din setul de caractere curent. Numerele pentru alte jetoane
poate fi ales fie de yacc, sau alese de utilizator. În ambele cazuri, #defini construi
de C este folosit pentru a permite yylex() pentru a returna aceste numere în mod simbolic. The #defini Declarații
sunt introduse în fișierul de cod și fișierul antet dacă acel fișier este solicitat. Setul de
caractere permise de yacc într-un identificator este mai mare decât cel permis de C. Token
numele care conțin astfel de caractere nu vor fi incluse în #defini declarații.

Dacă numerele de simbol sunt alese de yacc, alte simboluri decât literalele vor fi atribuite
numere mai mari de 256, deși nu este implicată nicio ordine. Un simbol poate fi atribuit în mod explicit
un număr urmând prima apariție în secțiunea declarații cu un număr.
Numele și literalele care nu sunt definite în acest fel își păstrează definiția implicită. Toate numerele de simbol
Alocat de yacc trebuie să fie unice și distincte de numerele de simbol utilizate pentru literale și
jetoane atribuite de utilizator. Dacă numerele de simbol duplicat cauzează conflicte în generarea parserului,
yacc va raporta o eroare; în caz contrar, nu este specificat dacă alocarea jetonului este
acceptat sau se raportează o eroare.

Sfârșitul intrării este marcat de un simbol special numit marker final, care are un jeton
număr care este zero sau negativ. (Aceste valori sunt invalide pentru orice alt simbol.) Toate
analizoarele lexicale trebuie să returneze zero sau negativ ca număr indicativ la atingerea sfârșitului
intrarea lor. Dacă jetoanele până la, dar excluzând, indicatorul final formează o structură care
se potrivește cu simbolul de pornire, analizatorul va accepta intrarea. Dacă indicatorul final este văzut în
în orice alt context, va fi considerat o eroare.

Finalizând il Program
În plus față de yyparse() și yylex(), funcțiile yeroare() și principal() sunt obligați să
face un program complet. Aplicația poate furniza principal() și yeroare(), sau acelea
rutinele pot fi obținute de la yacc bibliotecă.

Yacc Bibliotecă
Următoarele funcții vor apărea numai în yacc bibliotecă accesibilă prin intermediul −l y
operand la c99; prin urmare, acestea pot fi redefinite printr-o aplicație conformă:

int principal(anula)
Această funcție va apela yyparse() și ieșiți cu o valoare nespecificată. Alte actiuni
în cadrul acestei funcţii sunt nespecificate.

int yeroare(CONST car de război *s)
Această funcție va scrie argumentul terminat cu NUL în eroarea standard, urmat de
A .

Ordinea −l y și −l l operanzii dați la c99 este semnificativă; cererea trebuie
fie oferă propriile sale principal() să funcţioneze sau să se asigure că −l y precede −l l.

Depanarea il parser
Analizorul generat de yacc trebuie să aibă facilități de diagnosticare care pot fi opționale
activat fie în timpul compilării, fie în timpul executării (dacă este activat în timpul compilării). The
compilarea codului de depanare la runtime este sub controlul YYDEBUG, un preprocesor
simbol. Dacă YYDEBUG are o valoare diferită de zero, va fi inclus codul de depanare. Daca este
valoarea este zero, codul nu va fi inclus.

În analizatorii în care a fost inclus codul de depanare, cel extern int yydebug poate fi
folosit pentru a activa depanarea (cu o valoare diferită de zero) și dezactivare (valoare zero) în timpul execuției. The
valoarea initiala a yydebug va fi zero.

Cand −t este specificat, fișierul de cod va fi construit astfel încât, dacă YYDEBUG nu este deja
definit la momentul compilarii (folosind codul c99 −D Opțiunea YYDEBUG, de exemplu), YYDEBUG va
fi setat în mod explicit la 1. Când −t nu este specificat, fișierul de cod va fi construit astfel încât,
dacă YYDEBUG nu este deja definit, acesta va fi setat în mod explicit la zero.

Formatul ieșirii de depanare este nespecificat, dar include cel puțin suficiente informații
pentru a determina acțiunile de schimbare și reducere și simbolurile de intrare. De asemenea, oferă
informații despre recuperarea erorilor.

Algoritmi
Analizorul construit de yacc pune în aplicare an LALR(1) algoritm de analiză așa cum este documentat în
literatura. Nu este specificat dacă parser-ul este condus de tabel sau codat direct.

Un parser generat de yacc nu va solicita niciodată un simbol de intrare de la yylex() în timp ce într-o
stare în care singurele acțiuni, altele decât acțiunea de eroare, sunt reduceri printr-o singură regulă.

Literatura de teorie a analizei definește aceste concepte.

limite
yacc utilitarul poate avea mai multe tabele interne. Maximele minime pentru aceste tabele
sunt prezentate în tabelul următor. Sensul exact al acestor valori este implementarea-
definit. Implementarea trebuie să definească relația dintre aceste valori și între
ele și orice mesaje de eroare pe care implementarea le poate genera în cazul în care se epuizează
spatiu pentru orice structura interna. O implementare poate combina grupuri de aceste resurse
într-un singur pool, atâta timp cât totalul disponibil utilizatorului nu scade sub suma
de dimensiunile specificate de această secțiune.

Masa: Intern limite in yacc

┌───────────┬─────────┬─────────────────────────── ─────┐
│ │ Minim │ │
LimitaMaximDescriere
├───────────┼─────────┼─────────────────────────── ─────┤
│{NTERMS} │ 126 │ Numărul de jetoane. │
│{NNONTERM} │ 200 │ Număr de non-terminale. │
│{NPROD} │ 300 │ Număr de reguli. │
│{NSTATES} │ 600 │ Număr de stări. │
│{MEMSIZE} │ 5200 │ Lungimea regulilor. Totalul │
│ │ │ lungime, în nume (jetoane și │
│ │ │ neterminale), dintre toate │
│ │ │ reguli ale gramaticii. │
│ │ │ partea stângă se numără pentru │
│ │ │ fiecare regulă, chiar dacă nu este │
│ │ │ repetat în mod explicit, ca │
│ │ │ specificat în Gramatică Reguli in
│ │ │ yacc. │
│{ACTSIZE} │ 4000 │ Număr de acțiuni. ``Acțiuni'' │
│ │ │ aici (și în descriere │
│ │ │ fișier) se referă la acțiunile parserului │
│ │ │ (schimbați, reduceți și așa mai departe) nu │
│ │ │ la acțiunile semantice definite în │
│ │ │ Gramatică Reguli in yacc. │
└───────────┴─────────┴─────────────────────────── ─────┘

EXIT STAREA


Următoarele valori de ieșire vor fi returnate:

0 Finalizare cu succes.

>0 A apărut o eroare.

CONSECINȚE OF ERORI


Dacă se întâlnesc erori, rularea este întreruptă și yacc ieșiri cu un statut diferit de zero.
Pot fi produse fișiere de cod parțial și fișiere de antet. Informațiile rezumate din
fișierul de descriere va fi întotdeauna produs dacă −v steag este prezent.

următor secțiuni sunt informativ.

APLICARE UTILIZARE


Implementările istorice experimentează conflicte de nume pe nume yacc.tmp, yacc.acte,
yacc.debug, y.tab.c, y.tab.h, și y.ieşire dacă mai mult de o copie a yacc rulează într-o
un singur director la un moment dat. The −b a fost adăugată opțiunea pentru a depăși această problemă. The
problema conexă a permiterii multiplelor yacc analizatorii care urmează să fie plasați în același fișier a fost
adresată prin adăugarea unui −p opțiunea de a suprascrie codul hard-coded anterior yy prefix variabil.

Descrierea −p opțiunea specifică setul minim de nume de funcții și variabile
care provoacă conflicte atunci când mai multe analizoare sunt conectate între ele. YYSTYPE nu trebuie să fie
schimbat. În schimb, programatorul poate folosi −b pentru a oferi fișierele de antet pentru diferiți analizatori
nume diferite și apoi fișierul cu yylex() pentru un parser dat poate include
antet pentru acel parser. Nume precum yyclearerr nu trebuie schimbate deoarece acestea
sunt folosite numai în acțiuni; nu au legătură. Este posibil ca an
implementarea are alte denumiri, fie interne pentru implementarea unor lucruri precum
yyclearerr, sau oferind funcții non-standard cu care dorește să le schimbe −p.

Operatorii unari care sunt același simbol ca un operator binar au nevoie, în general, de acestea
prioritate ajustată. Acest lucru este gestionat de %prec simbolul de consiliere asociat cu
o anumită regulă gramaticală care definește acel operator unar. (Vedea Gramatică Reguli in yacc.)
Aplicațiile nu trebuie să utilizeze acest operator pentru operatorii unari, ci pentru gramaticile
care nu o cer sunt rare.

EXEMPLE


Acces la yacc biblioteca este obținută cu operanzi de căutare în bibliotecă la c99. Pentru a utiliza
yacc bibliotecă principal():

c99 y.tab.c −l y

Amandoua Lex biblioteca si yacc biblioteca contine principal(). Pentru a accesa yacc principal():

c99 y.tab.c lex.yy.c −l y −l l

Acest lucru asigură că yacc biblioteca este căutată mai întâi, astfel încât principal() este folosit.

Istoricul yacc bibliotecile au conținut două funcții simple care sunt în mod normal codificate
de către programatorul aplicației. Aceste funcții sunt similare cu următorul cod:

#include
int principal (gol)
{
extern int yyparse();

setlocale(LC_ALL, "");

/* Dacă următorul parser este unul creat de lex, the
aplicația trebuie să fie atentă pentru a se asigura că LC_CTYPE
și LC_COLLATE sunt setate la localitatea POSIX. */
(void) yyparse();
returnare (0);
}

#include

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

FUNDAMENTARE


Referințele în Referință Documente poate fi util în construirea parserului
generator. Articolul referit la DeRemer și Pennello (împreună cu lucrările it
referințe) descrie o tehnică de generare a parserilor care se conformează acestui volum de
POSIX.1‐2008. Lucrările în acest domeniu continuă să fie făcute, așa că implementatorii ar trebui să se consulte
literatura curentă înainte de a face noi implementări. Articolul original Knuth este
baza teoretică pentru acest tip de parser, dar tabelele pe care le generează sunt impracticable
mare pentru gramatici rezonabile și nu trebuie folosit. Formularea „echivalent cu” este
intenționat să se asigure că cele mai bune mese care sunt LALR(1) poate fi generat.

A existat confuzie între clasa de gramatici, algoritmii necesari pentru a genera
analizatoare și algoritmii necesari pentru a analiza limbile. Toate sunt rezonabile
ortogonală. În special, un generator de parser care acceptă întreaga gamă de LR(1)
gramaticile nu trebuie să genereze un tabel mai complex decât unul care acceptă SLR(1) (a
clasă relativ slabă de gramatici LR) pentru o gramatică care se întâmplă să fie SLR(1). Asa un
nici implementarea nu trebuie să recunoască cazul; compresia tabelului poate produce SLR(1)
tabel (sau unul chiar mai mic decât atât) fără a recunoaște că gramatica este SLR(1).
viteza unui LR(1) analizatorul pentru orice clasă depinde mai mult de reprezentarea tabelului și
compresie (sau generarea codului dacă este generat un parser direct) decât pe clasă
de gramatică de care se ocupă generatorul de tabele.

Viteza generatorului de parser depinde oarecum de clasa de gramatică a acestuia
mânere. Cu toate acestea, algoritmii originali ai articolului Knuth pentru construirea de analizoare LR au fost
judecat de autorul său ca fiind nepractic de lent în acel moment. Deși LR complet este mai mult
complex decât LALR(1), pe măsură ce vitezele și algoritmii computerului se îmbunătățesc, diferența (în termeni
de timp acceptabil de execuție a ceasului de perete) devine din ce în ce mai puțin semnificativ.

Autorii potențiali sunt atenționați că articolul referitor la DeRemer și Pennello
citat anterior identifică o eroare (o simplificare excesivă a calculului LALR(1)
lookahead seturi) în unele dintre LALR(1) instrucțiunile algoritmului care l-au precedat
publicare. Ar trebui să-și ia timp să caute acea lucrare, precum și documentele relevante actuale
munca, în special cea a lui Aho.

−b a fost adăugată opțiunea pentru a oferi o metodă portabilă de autorizare yacc a lucra la
mai multe analizoare separate în același director. Dacă un director conține mai mult de unul
yacc gramatică și ambele gramatici sunt construite în același timp (prin, de exemplu, a
paralel face program), rezultate conflictuale. Deși soluția nu este practica istorică,
corectează o deficiență cunoscută a implementărilor istorice. Modificările corespunzătoare au fost
făcut la toate secțiunile care au făcut referire la numele fișierelor y.tab.c (acum ``fișierul de cod''),
y.tab.h (acum „fișierul antet”) și y.ieşire (acum „fișierul de descriere”).

Gramatica pentru yacc intrarea se bazează pe documentația System V. Descrierea textuală
arată acolo că ';' se cere la sfarsitul regulii. Gramatica și
implementarea nu necesită acest lucru. (Utilizarea C_IDENTIFIER determină să apară o reducere în
locul potrivit.)

De asemenea, în acea implementare, constructele precum %jeton poate fi terminat de a
, dar acest lucru nu este permis de gramatică. Cuvintele cheie precum %jeton poate să
apar și cu majuscule, ceea ce din nou nu este discutat. În majoritatea locurilor unde '%' este folosit,
poate fi înlocuit și există ortografii alternative pentru unele dintre simboluri
(de exemplu, %STÂNGA poate fi "%<" sau chiar "\<").

Din punct de vedere istoric,etichetă> poate conține orice caracter, cu excepția '>', inclusiv spațiul alb, în
implementare. Cu toate acestea, din moment ce etichetă trebuie să facă referire la un membru al sindicatului standard ISO C, în
implementările conforme cu practica trebuie să accepte doar setul de caractere pentru ISO C
identificatori standard în acest context.

Se știe că unele implementări istorice acceptă acțiuni care sunt încheiate de a
perioadă. Implementările istorice permit adesea „$” în nume. O implementare conformă
nu trebuie să susțină niciunul dintre aceste comportamente.

Decizi când să folosești %prec ilustrează dificultatea de a preciza comportamentul de yacc.
Pot exista situații în care gramatică nu este, strict vorbind, în eroare și totuși
yacc nu o poate interpreta fără ambiguitate. Rezolvarea ambiguităților din gramatică poate
în multe cazuri, poate fi rezolvată prin furnizarea de informații suplimentare, cum ar fi utilizarea %tip or
%uniune declarații. Este adesea mai ușor și, de obicei, produce un analizator mai mic de luat
această alternativă atunci când este cazul.

Mărimea și timpul de execuție a unui program produs fără codul de depanare la runtime este
de obicei mai mici și puțin mai rapide în implementările istorice.

Mesajele statistice din mai multe implementări istorice includ următoarele tipuri de
informație:

n/512 terminale, n/300 non-terminale
n/600 de reguli gramaticale, n/1500 state
n schimbare/reducere, n reduce/reduce conflictele raportate
n/350 seturi de lucru utilizate
Memorie: stări etc. n/15000, analizator n/ 15000
n/600 de seturi de anticipare distincte
n închideri suplimentare
n intrări în ture, n excepții
n du-te la intrări
n intrările salvate în mod implicit
Spațiul de optimizare utilizat: intrare n/15000, ieșire n/ 15000
n intrări în tabel, n zero
Raspandirea maxima: n, Offset maxim: n

Raportul tabelelor interne din fișierul de descriere este lăsat definit de implementare
deoarece toate aspectele acestor limite sunt, de asemenea, definite de implementare. Câteva implementări
poate utiliza tehnici de alocare dinamică și nu are valori limită specifice de raportat.

Formatul y.ieşire fișierul nu este dat deoarece specificația formatului nu a fost
văzut pentru a îmbunătăți portabilitatea aplicațiilor. Lista este destinată în primul rând să ajute oamenii
utilizatorii înțeleg și depanează analizatorul; utilizarea de y.ieşire printr-un script de aplicație conform
ar fi neobișnuit. În plus, implementările nu au produs rezultate consistente și nu
format popular era evident. Formatul selectat de implementare ar trebui să fie uman-
lizibil, pe lângă cerința ca acesta să fie un fișier text.

Rapoartele standard de eroare nu sunt descrise în mod specific, deoarece sunt rareori utile
aplicații conforme și nu exista niciun motiv pentru a restricționa implementările.

Unele implementări recunosc "={" ca echivalent cu '{' deoarece apare în istoric
documentație. Această construcție a fost recunoscută și documentată ca fiind învechită încă de mult
1978, în referința Yacc: Inca O alta Compilator-Compilator. Acest volum al POSIX.1‐2008
a ales să o lase ca învechită și să o omite.

Caracterele pe mai mulți octeți ar trebui să fie recunoscute de analizorul lexical și returnate ca simboluri.
Ele nu trebuie returnate ca caractere literale pe mai mulți octeți. Jetonul eroare care este folosit
pentru recuperarea erorilor i se atribuie în mod normal valoarea 256 în implementarea istorică.
Astfel, valoarea simbolului 256, care este utilizată în multe seturi de caractere multi-octeți, nu este
disponibil pentru utilizare ca valoare a unui token definit de utilizator.

VIITOR INSTRUCTIUNI


Nici unul.

Utilizați yaccposix online folosind serviciile onworks.net


Servere și stații de lucru gratuite

Descărcați aplicații Windows și Linux

  • 1
    itop - ITSM CMDB OpenSource
    itop - ITSM CMDB OpenSource
    Portal de operațiuni IT: o deschidere completă
    sursă, ITIL, serviciu web
    instrument de management, inclusiv un complet
    CMDB personalizabil, un sistem de asistență și
    un om cu documente...
    Descărcați itop - ITSM CMDB OpenSource
  • 2
    Clementine
    Clementine
    Clementine este o muzică multi-platformă
    jucător și organizator de bibliotecă inspirat de
    Amarok 1.4. Are un rapid și
    interfață ușor de utilizat și vă permite
    cauta si...
    Descărcați Clementine
  • 3
    XISMuS
    XISMuS
    ATENȚIE: Actualizarea cumulativă 2.4.3 are
    fost eliberat!! Actualizarea funcționează pentru orice
    versiunea anterioară 2.xx. Dacă faceți upgrade
    din versiunea v1.xx, vă rugăm să descărcați și
    i ...
    Descărcați XISMuS
  • 4
    facetracknoir
    facetracknoir
    Program modular de urmărire a capului care
    acceptă mai multe face-tracker, filtre
    și protocoale de joc. Printre urmăritori
    sunt SM FaceAPI, AIC Inertial Head
    Urmăritor ...
    Descărcați facetracknoir
  • 5
    Cod QR PHP
    Cod QR PHP
    Codul QR PHP este open source (LGPL)
    bibliotecă pentru generarea codului QR,
    Cod de bare bidimensional. Bazat pe
    libqrencode C biblioteca, oferă API pentru
    se creează codul QR barc...
    Descărcați codul QR PHP
  • 6
    freeciv
    freeciv
    Freeciv este un program gratuit pe rând
    joc de strategie multiplayer, în care fiecare
    jucătorul devine liderul unui
    civilizație, luptă pentru a obține
    Scopul final: a fi...
    Descărcați Freeciv
  • Mai mult »

Comenzi Linux

Ad