Paketa Jay

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

Kjo është faqja kryesore e gjeneratorit të parazgjedhur LALR (1): Berkeley yacc © retargeted për C # dhe Java.

Perdorimi

jay lexon një specifikim gramatikor nga një skedar dhe gjeneron një parser LALR (1) për të. Një parser përbëhet nga një grup tabelash analitike dhe një rutinë shoferi nga një skelet që lexohet nga hyrja standarde. Ekzistojnë skelet të përshtatshëm për Java dhe C #. Tabelat dhe shoferi janë shkruar në dalje standarde.

  jay [-ctv] [-b file-prefix] skelet i gramatikës | <skelet
  java -jar jay.jar [-ctv] [-b skedar-prefiks] skelet i gramatikës | <skelet

Opsionet e mëposhtme janë në dispozicion:

-b prefiksi i skedarit ndryshon prefiksin e parapaguar te emrat e skedarit të prodhimit të mesëm në vargun e shënuar me file_prefix. Prefiksi i parazgjedhur është karakteri y.
-c rregullon direktivat C preprocessor #line të përfshihen në prodhim. Kjo është e dobishme vetëm për C #.
-t rregullon që debugging informacion të përfshihet në output. Informacioni aktual kontrollohet nga dosjet e skeletit; ashtu siç shpërndahet, varet nga pakot shtesë të kohës së runtimeve. Për C # kjo është pjesë e shkarkimit të burimit, për Java shiko jay.yydebug.
-v shkakton një përshkrim të lexueshëm të njeriut të parserit të gjeneruar për t’u shkruar në skedarin file_prefix.output.

Nëse një nga variablat e mjedisit TMPDIR, TMP ose TEMP është caktuar, vargu nga ndryshuesi i mjedisit do të përdoret si emri i dosjes ku krijohen skedarët e përkohshëm.

Formati i hyrjes

Formati i hyrjes dhe algoritmi LALR (1) nuk janë ndryshuar nga yacc. Duhet të konsultoheni me literaturën e gjerë në yacc për detaje mbi shkrimin dhe debugimin e gramatikës, rimëkëmbjen e gabimeve, strategjitë për veprime etj.

Dallimet e vetme janë rafti i vlerave, futja e parserit të gjeneruar në një klasë dhe ndërfaqja e skanerit. Të gjitha këto mund të ndryshohen duke modifikuar skemat e skeletit. Pjesa tjetër e këtij seksioni bazohet në skelet skelet të shpërndara me Jay.

Direktiva e sindikatës% është hequr. jay përdor objektin (ose System.Object në C #) për raft vlerash. Rrjedhimisht, emri në etiketën e shënimit <emër> i referohet një klase ose një ndërfaqeje.

Kjo ka implikime për hedhjet që gjeneron jay: As C # as Java nuk lejojnë leje për ndryshoret e hedhura. Prandaj, notimi $$ i referohet një objekti pa hedhur sepse $ zakonisht është caktuar. Nëse $ është përdorur për qëllime të tjera, zakonisht do të duhet të përdorë një tip eksplicit $ <emër> $ i cili shndërrohet në një emër të hedhur në emër.

Në mënyrë të ngjashme, nota $ n është caktuar rrallë. Prandaj, jay do të gjenerojë një hedhur nëse notacioni $ <> n është përdorur për të parandaluar hedhjen.

jay nuk lëshon hedh në Object. Këto hedhje zakonisht janë të panevojshme dhe kjo strategji shmang mesazhe të shumta paralajmëruese, por kjo mund të shkaktojë një surprizë në një situatë mbingarkimi.

jay nuk ka nocion trashëgimi. Kjo mund të çojë në mesazhe paralajmëruese të pajustifikuara që ankohen për detyra të diskutueshme. U ndjenë se këto mesazhe janë në përgjithësi të dobishme edhe nëse disa prej tyre janë të gabuara.

Gjeneriket

Tabelat dhe skelet skedarët e jay nuk përdorin parametrized lloje. jay.yydebug është koduar pa lloje parametrized; megjithatë, burimet përmbajnë kodin me gjenerikë në linjat që në këtë pikë janë komentuar.

Notimi <tag> mund të përmbajë kllapa të mbyllur të këndeve dhe brenda tyre personazhet [] bosh? , përveç alfanumerikave të zakonshme dhe. $ _. Megjithatë, referencat për grumbullin e vlerës $ n janë hedhur duke përdorur tagun e aplikueshëm dhe një hedhur në një tip parametrized do të nxjerrë një paralajmërim të pakontrolluar në Java.

Klasa e analistit mund të annotated with @SuppressWarnings (“uncontrolled”); megjithatë, përderisa kjo mund të jetë një mënyrë jete për Java 5, ndoshta është e.

Skelet të skedarëve

Shkarkimi binar ose burimi përfshin dy skelete për Java dhe një për C #. Një skelet skelet kontrollon formatin e tabelave të gjeneruara dhe përfshin algoritmin aktual të analizuesit që interpreton tabelat. Algoritmet janë të njëjta në të gjitha dosjet e shpërndara, por skeleton.tables fillon tabelat e ndryshme duke lexuar një skedar burimi në kohën e ekzekutimit; kjo shmang një limit që sistemi Java imponon në madhësinë e segmentit të kodit për një klasë.

Për të krijuar skedarin e burimeve, gjeneroni parser duke përdorur skeleton.tables. Nga burimi i analistit nxjerrin pikërisht linjat që fillojnë me // yy dhe heqin saktësisht atë prefiks. Dosja që rezulton duhet të jetë e vendosur në të njëjtin dosje si skedari i klasës i analizuesit dhe duhet të përdorë emrin e klasës së analizës dhe tabelën e prapashtesave.

Nuk duhet të jetë e domosdoshme për të ndryshuar skemat e skeletit, por vetëm në rast se komentohen gjerësisht. Dosjet janë të orientuara nga linja. Një karakter në kolonën e parë përcakton se çfarë ndodh me një vijë: # shënon një koment dhe linja injorohet. . shënon një vijë që kopjohet pa periudhën udhëheqëse.

t shënon një linjë që është e rëndësishme për gjurmimin. Normalisht është kopjuar me një udhëheqës // t; nëse opsioni -t është vendosur, linja kopjohet pa t kryesor.

Së fundi, një linjë me një boshë kryesore përmban një komandë që rezulton në nxjerrjen e disa informacioneve të tabelës dhe që mund të përdorin pjesën tjetër të linjës si një parametër.

veprimet emetojnë kodin nga veprimet si trup i një switch.
epilog lëshojnë tekstin pas dytë %%.
lokale lëshojnë tekstin brenda% {%} pas %% parë.
prologi lëshoni tekstin brenda% {%} para se të filloni %%.
shenjat e parave emetojnë secilën vlerë shenjë si një identifikues të inicializuar me pjesën e mbetur të linjës si një prefiks.
version koment lëshoni një // koment me pjesën e mbetur të linjës.
yyCheck prefiksin
prefiksin yyDefRed
prefiksin yyDgoto
Prefix yyGindex
Prefix yyLen
prefiksin yyLhs
Prefix yyRindex
prefiksin yySindex
Prefiksi yyTable lëshon trupin e tabelës përkatëse me pjesën e mbetur të linjës si një prefiks për secilin linjë të prodhimit.
Prefiksi yyFinal lëshon vlerën si një initializer me pjesën e mbetur të linjës si një prefiks.
Prefiksi yyNames nxjerr tabelën si një listë me fjalët me pjesën e mbetur të linjës si një prefiks për secilin linjë të prodhimit.
yyNames-strings lëshojnë tabelën si një listë të initializers string.
Prefiksi yyRule lëshon tabelën si një listë të linjave me pjesën e mbetur të vijës si një prefiks për secilin linjë të prodhimit.
yyRule-strings lëshojnë tabelën si një listë të initializers string.
Secila tabelë prefiksihet nga një koment me informacionin e dimensionit.

Menaxhimi i Klases

Dizajni i skedarit skelet duhet të marrë në konsideratë dy probleme: si ta futni parser në një klasë dhe si të ndërfaqeni skanerin.

Dosjet e skeletit të shpërndarjes presin që përdoruesi të furnizojë një prolog brenda% {%} që përmban një header të klasës dhe të furnizojë një epilog pas tjetrit %% që mbyll këtë klasë. jay nuk e njeh emrin e klasës së analistit.

Ndërfaqja e yyInput skanerit gjenerohet si një anëtar i çdo klase të analizës; kjo mund ose nuk mund të jetë një zgjedhje e mirë. Ekzistojnë tri metoda: avancimi nuk ka argumente dhe duhet të kthejë një vlerë boolean që tregon se skaneri ka nxjerrë me sukses një simbol tjetër të hyrjes; shenjë nuk ka argumente dhe duhet të kthejë simbolin aktual të futjes si një vlerë e plotë që parser pret; vlera nuk ka argumente dhe mund të kthejë një vlerë objekti për tu vendosur në shtyllën e gjendjes / vlerës për simbolin e hyrjes. Gjurmimi pret që shenjën dhe vlerën të jenë funksione të vazhdueshme midis çdo thirrjeje për të avancuar.

Vlerat eksplicite token krijohen si konstante në klasën e analizës. Shkronjat e vetme përfaqësojnë vetveten; megjithatë, për ata jay beson në ASCII dhe jo në setin e karaktereve Unicode. Mund të kishte qenë më mirë për të përcaktuar konstantet në skanerin, por pritet që skaneri të zbatohet si një klasë e brendshme e analizës. pj mbështet këtë pikëpamje edhe nëse skanuesi është ndërtuar në mënyrë eksplicite duke përdorur JLex.

Shkarkime: