Selaajan toiminta ================= Selaaja luo tekstialkioita saamastaan tavuvirrasta, jotka se toimittaa jäsentäjälle. Tekstialkiot erotellaan tyhjillä merkeillä ja kommenteilla, joita saa olla kahden alkion välissä kuinka paljon tahansa sekä toisilla tekstialkioilla. Selaaja pyrkii aina pisimpään mahdolliseen tekstialkioon. Täten esim. "abc123":stä tulee vain yksi alkio: <IDENTIFIER>. Sen sijaan "abc 123" synnyttää kaksi eri alkiota: <IDENTIFIER> ja <UNSIGNEDINT>. Ja edelleen "abc*123" synnyttää kolme eri alkiota: <IDENTIFIER> <ASTERISK> ja <UNSIGNEDINT>. Kts. kohta Tunnisteet. Toisaalta "abc-123":sta tulee <IDENTIFIER> <SIGNEDINT>, koska <SIGNEDINT> on määritelty ennen viiva-merkkiä <DASH> ja se voi myös alkaa viivalla. Eli esiintymisjärjestyksellä on myös väliä. Tyhjämerkit (whitespace) ------------------------ välilyönti tabulaattori rivinvaihdot: NL, CR, CR+NL Kommentit --------- REM Rivikommentti, jossa REM-sanan oltava rivin alussa (Oraclessa REM missä kohtaa tahansa rivillä, poistaa koko rivin, mutta esim. CREATE TABLE -lauseen keskellä ei saa olla REM-kommenttia.) -- Rivikommentti mistä sarakkeesta tahansa rivin loppuun /* Monirivinen kommentti. /* Sisäkkäisten kommenttien on oltava myös ehjiä */ muuten kommentin loppu voi jäädä huomaamatta Kommenttien sisällä saa olla mitä merkkejä tahansa. */ Tunnetut merkit --------------- SQL-92:sta: " ' % & ( ) * + , - . / : ; < = > ? _ | Oraclesta lisäksi: # $ Muista merkeistä syntyy virheilmoitus ja selaaminen keskeytyy. (Haluttaessa merkkejä voidaan lisätä tiedostoon SQLParser.jjt:hen) Varatut sanat ------------- kts. tiedostosta SQLParser.jjt kohdista /* Varatut sanat */ ja /* Tietotyypit */ Tunnisteet ja literaalit ------------------------ UNSIGNEDINT: yksi tai useampi numeromerkki peräkkäin SIGNEDINT: (+|-) <UNSIGNEDINT> IDENTIFIER: alkaa kirjaimella (A-Z, a-z), jonka jälkeen seuraavia merkkejä: _ # $ kirjain numero QUOTEDSTRING: lainausmerkkien välistä otettu merkkijono, jossa lainausmerkkipari muutettu yhdeksi lainausmerkiksi. BITSTRINGLITERAL: b'00101101' HEXSTRINGLITERAL: x'3f4da0' NATIONALCHARSTRINGLITERAL: n'qwer1234' CHARSTRINGLITERAL: 'qwer1234' ***************************************************************************** Jäsentäjän toiminta =================== Hyväksytyt lauseet ----------------- SQL-lauseen kaksi ensimmäistä sanaa riittävät erottelemaan tunnistettavat lauseet. Muut lauseet ohitetaan ilman tarkistuksia selaamalla lauseen loppuun etsien lauseen päättävä puolipiste tai kauttaviiva. Tunnistetut tietotyypit ----------------------- Tietotyypit yhdistetty yhdeksi pötköksi, jolloin jäsentäjä tunnistaa vähän ylimääräisiäkin yhdistelmiä. INTERVAL-tyyppi on erikseen. [xx] - tarkoittaa, että xx on valinnainen. a | b - tarkoittaa vaihtoehtoa: joko a tai b merkinnät sanojen perässä kertovat mistä tietotyyppi on peräisin: ei mitään = SQL-92 1 = Oracle7 2 = Oracle7:ssä tukena muille järjestelmille 3 = joku muu (esmes. DB2) [ NATIONAL ] BIT CHARACTER CHAR NCHAR DATE DEC DECIMAL DOUBLE PRECISION FLOAT GRAPHIC /* 3 */ INT INTEGER LONG /* 1 */ MLSLABEL /* 1 */ NUMERIC NUMBER /* 1 */ RAW /* 1 */ LONG RAW /* 1 */ REAL ROWID /* 1 */ SMALLINT TIME TIME WITH TIME ZONE TIMESTAMP VARCHAR LONG VARCHAR /* 2 */ VARCHAR2 /* 1 */ VARGRAPHIC /* 3 */ LONG VARGRAPHIC /* 3 */ [ VARYING ] [(int [, [+|-]int])] [ CHARACTER SET <nimi> ] // tätä ei tallenneta ja INTERVAL-tyyppi: INTERVAL ja joko NonSecondDatetimeField [ "(" <UNSIGNEDINT> ")" ] (1) TO ( NonSecondDatetimeField | SECOND [ "(" <UNSIGNEDINT> ")" ] (2) ) tai (1) tai (2) missä NonSecondDatetimeField = ( YEAR | MONTH | DAY | HOUR | MINUTE ) Tunnisteet ---------- _<charset> <tunniste> tunnisteen edessä voi SQL-92:n mukaan määritellä siinä käytettävän merkistön nimen alaviivalla varustettuna. Oraclessa tätä ei tueta. Ei tallenneta. <tunniste> on joko yksi selaajan antama <IDENTIFIER> -alkio tai mahdollisesti useampi <QUOTEDSTRING> -alkio esim. "tavu" "-" "viiva", jotka jäsentäjä yhdistää merkkijonoksi "tavu-viiva" standardin mukaan. Hyväksytyt nimet ---------------- Sarakenimi on mikä tahansa hyväksytty tunniste. Standardin mukaan osa nimistä mm. taulun nimi ja arvojoukon nimi, voivat koostua kolmesta pisteellä erotetusta osasta. Näinollen seuraavat nimet ovat mahdollisia: taulunimi schema.taulunimi catalog.schema.taulunimi taulunimeksi hyväksytään mikä tahansa tunniste. scheman ja catalogin (standardin nimityksiä) vastattava <IDENTIFIER> tyyppiä. Edelleen standardin mukaan pisteiden ja sanojen välissä ei saa olla tyhjää. Tästä säännöstä poiketaan, koska muutoin kieliopin laadinta hankaloituisi suuresti. Näistä nimistä jäsentäjä unohtaa alkuosan ja välittää vain taulunimen eteenpäin. Oletusarvo ---------- Oletusarvomäärittelyssa DEFAULT-sanan jälkeen on oltava jokin seuraavavista: kokonaislukuvakio esim. -32768 merkkijonovakio esim. 'heittomerkit oltava' bittivakio esim. b'00101101' hexalukuvakio esim. x'3f4da0' "national" merkkijonovakio esim. n'qwer1234' NULL, USER, CURRENT_USER, SESSION_USER, SYSTEM_USER CURRENT_DATE, CURRENT_TIME ["(" <UNSIGNEDINT> ")"], CURRENT_TIMESTAMP ["(" <UNSIGNEDINT> ")"] Käytännössä jäsentäjä hyväksyy arvoksi myös minkä tahansa <IDENTIFIER> -alkion sisällön. Jäsennyspuu =========== Kieliopin produktioiden yhteyteen on lisätty jäsennyspuun luontiin liittyviä määrittelyitä, jotka käännetään JJTree-esikääntäjällä jäsennyspuunluontikoodiksi. "#nimi"-tyyliset määrittelyt kertovat minkä niminen solmu luodaan kyseisessä kohdassa. Solmun vaikutusalue on sitä edeltävä määrittely. Esim. void Abc() #OmaNode : {} { .. } pitää koko metodin sisällään ja ( Term() | Factor() ) #OmaNode sulkujen väliin jäävän osan. jjtThis-muuttujalla viitataan solmuun jonka vaikutusalueella ollaan. SQLString-solmu on erikoisuus. Se kerää kaikki tekstialkiot vaikutusalueeltaan ja yhdistää ne välilyönneillä yhdeksi merkkijonoksi. Lisää jäsennyspuusta JJTree-dokumenteista.