Original article: https://www.cs.rit.edu/~ats/projects/lp/doc/jay/package-summary.html

Pachetul Jay

Aceasta este pagina de start lui jay, un generator de parser LALR (1): Berkeley yacc © redirectat la C# și Java.

Priviţi:

Descriere

Rezumat de clasă

dummy clasă falsă, declanşeaza javadoc.

Descrierea pachetului jay

Aceasta este pagina de start lui jay, un generator de parser LALR (1): Berkeley yacc © redirectat la C# și Java.

Folosire

Jay citește o specificație gramatică dintr-un fișier și generează un parser LALR (1) pentru ea. Un parser constă dintr-un set de tabele de parsare și o rutină conducătoare de la un schelet care se citește de la intrarea standartă. Schelete adecvate există pentru Java și C#. Tabele si drivere sunt scrise la iesirea standartă.

jay [-ctv] [-b file-prefix] gramatica de schelet|<skeleton java -jar jay.jar [-ctv] [-b file-prefix] gramatica de schelet |<skeleton

Sunt disponibile următoarele opțiuni:

  -b fprefix de fişier schimbaă prefixul adăugat cu numele fișierului de ieșire secundar la șirul denotat prin file_prefix. Prefixul implicit este simbolul y.

  -c se ocupă de preprocesor directiv C # line care trebuie să fie încorporată în ieșire. Acest lucru este folositor doar pentru C #.

  -t se ocupă cu repararea informațiilor care trebuie să fie încorporate în ieșire. Informația propriu-zisă este controlată de fișiere schelet, distribuire depinde de pachete de rulare suplimentare. Pentru C # aceasta este o parte a sursei de descărcare, pentru Java see jay.yydebug.

  -v provoacă o descriere pentru înțelesul tuturor a parser-ului generate pentru a scrie fișierul file _prefix.output.

Dacă una variabilele de mediu dintre TMPDIR, TMP, sau TEMP este setată, șir de variabilă de mediu va fi folosită ca nume de director în cazul în care sunt create fișierele temporare.

Format de intrare

Formatul de intrare și algoritmul LALR (1) nu au fost modificate de la yacc. Ar trebui să consultaţi literatura de specialitate ce se referă la yacc, pentru detalii cu privire la scrierea și reglarea gramaticii, recuperarea de erori, strategii de acțiuni etc.

Singure diferențe sunt reprezentate de valoarea stivei, încorporarea parserului generat într-o clasă, și interfața pentru scaner. Toate acestea pot fi schimbate prin modificarea fișierelor schelet. Restul de această secțiune se bazează pe fișiere schelet distribuite cu jay.

Directiva uniunii % a fost eliminată. jay utilizează un obiect (Object sau System.Object în C #) pentru valoarea stivei. În consecință, numele în notația tag-ului <name> se referă la o clasa sau o interfaţă.

Acest lucru are implicații pentru calculaţii pe care jay generează: nici C #, şi nici Java nu permit sarcini de variabile calculate. De aceea, notația $$ se refera la un obiect fără calcul, deoarece $$ este de obicei atribuit. Dacă $$ este folosit în alte scopuri, de obicei, va trebui să utilizeze un tip explicit $<name>$, care este transformat într-un calcul la nume.

În mod similar, notația $n este rareori atribuită. De aceea, jay va genera un calcul cu excepția cazului cu notația $<>, care este utilizată pentru a preveni calculul.

jay nu emite calculuri la Object. Aceste calcule sunt de obicei inutile și această strategie evite numeroase mesaje de avertizare, dar aceasta ar putea fi o surpriză într-o situație supraîncărcare.

jay nu are noțiune de moștenire. Acest lucru poate provoca aparenţa mesajelor de avertizare nejustificate despre sarcini discutabile. Sa considerat că aceste mesaje sunt în general utile, chiar dacă unele dintre ele sunt eronate.

Generarea

Tabelele și fișierele schelet jay nu folosesc tipurile parametrizate. jay.yydebug este codat, fără tipuri parametrizate. Cu toate acestea, sursele conțin cod cu fişierele de generare din linii care în acest moment sunt comentate.

Notația <tag> poate conține paranteze imbricate unghiulare și în interiorul acestora simboluri [] goale ? în loc de alfanumerice uzuale și . $ _. Cu toate acestea, referinţe la valoarea stivei $n sunt calcule cu ajutorul tag-ului aplicabil și o distribuţie la un tip parametrizat care va provoca un avertisment necontrolat în Java.

Clasa parserului ar putea fi adnotată cu @ SuppressWarnings("necontrolat"); cu toate acestea, în timp ce acest lucru poate fi un mod de viață pentru Java 5 ce este, probabil, rău.

Fişiere Schelet

Număr binar sau sursa de descarcăre include două fișiere schelet pentru Java și unul pentru C #. Un fișier schelet controlează formatul din tabelele generate și include algoritmul parser-ului real pe care interpretează tabelele. Algoritmii sunt aceleași în toate fișierele distribuite butskeleton.tables care iniţializează diferite tabele prin citirea unui fișier de resurse în timpul de execuție. Astfel se evită o limită pe care sistemul Java impune dimensiunea segmentului de cod pentru o clasă.

Pentru a crea fișierul de resurse, generarţi parserul folosind skeleton.tables. Din sursa parserului extrageţi exact liniile care încep cu //yy și eliminaţi exact acest prefix. Fișierul rezultat ar trebui să fie localizat în același director ca și fișierul clasei de parser și ar trebui să utilizeze numele clasei de parser și sufixul .tables.

Acesta ar putea să nu fie necesar să modificați fișierele schelet, doar în cazul în care sunt comentate pe larg. Fișierele sunt orientate pe linie. Un simbol din prima coloană determină ceea ce se întâmplă într-o linie:

# marchează un comentariu și linia este ignorată. . marchează o linie care este copiată fără perioada de conducere.

t marchează o linie care este relevant pentru urmărire. În mod normal, acesta este copiată cu un t // conducător; dacă opțiunea -t este setată linia este copiată fără t conducător.

În cele din urmă, o linie cu un gol de conducere conține o comandă care duce la ieșirea unor informații în tabele și care pot folosi restul liniei ca un parametru.

actions — emit codul din acțiunile ca corpul unui comutator.

epilog — emit textul urma lui al doilea %%.

local — emit textul în %{ %} după primul %%.

prolog — emit textul în %{ %} înainte de primul%%.

tokens prefix — emit fiecare valoare simbolică ca un identificator iniţializat cu restul liniei ca un prefix.

version comment — emit un comentariu // cu restul liniei

yyCheck prefix —

yyDefRed prefix —

yyDgoto prefix —

yyGindex prefix —

yyLen prefix —

yyLhs prefix —

yyRindex prefix —

yySindex prefix —

yyTable prefix — emit corpul tabelului relevant cu restul liniei ca un prefix pentru fiecare linie de ieșire.

yyFinal prefix — emit valoare ca o inițializare cu restul liniei ca un prefix.

yyNames prefix — emit tabel ca o lista de cuvinte cu restul liniei ca un prefix pentru fiecare linie de ieşire.

yyNames-strings — emite tabel ca o listă de valori de initializare a șirului.

yyRule prefix — emit tabel ca o listă de linii cu restul liniei ca un prefix pentru fiecare linie de ieșire.

yyRule-strings — emit tabel ca o listă de valori de initializare a șirului.

Fiecare tabel este prefixat de un comentariu cu informații despre dimensiune.

Managementul clasei

Proiectarea unui fișier schelet trebuie să ia în considerare două probleme: cum să integreze parserul într-o clasă și cum să producă interfață pentru scaner.

Utilizatorul de la fișierele schelet distribuite așteaptă să furnizeze un prolog în %{%} care conține un antet de clasă și să furnizeze un epilog în urma lui al doilea %%, care închide această clasă. jay nu știe numele clasei de parser.

Interfață pentru scanerul yyInput este generată ca un membru al fiecărei clasei de parser. Acest lucru poate sau nu poate fi o alegere bună. Există trei metode: avansul nu are argumente și trebuie să returneze o valoare booleană care indică faptul că scanerul a extras cu succes un alt simbol de intrare; jetonul nu are argumente și trebuie să întoarcă simbolul curentului de intrare ca o valoare întreagă care așteaptă parserul; valoarea nu are argumente si poate returna o valoare de obiect care urmează să fie introdusă pe stare / valoare de stivă pentru simbolul de intrare. Urmărirea așteaptă de la jetonul andvalue să reprezinte funcții constante între fiecare apel pentru a avansa.

Valorile explicite de jetoane sunt generate ca constante în clasa de parser. Caractere unice în sine reprezintă, cu toate acestea, pentru ei Jay crede mai degrabă în ASCII, şi numai apoi setului de caractere Unicode. Acesta ar fi fost mai bine pentru a defini constantele în interfața scannerului, dar putem aștepta ca scanerul să pie asta în aplicare ca o clasa interioară a parserului. pj care susține acest punct de vedere, chiar dacă scanerul este în mod explicit construit folosind JLex.

Descărcări

Versiune:

1.1.1, iunie 2006.