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.