Semestrální práce z předmětu 36PJ
Interpretace SQL
Oldřich Nič

ABSTRACT

This article covering how to solve interpretation of subset of SQL language with help of Java programming language.

1. ÚKOL

Navrhněte program pro interpretaci podmnožiny jazyka SQL. Sestrojte lexikální, syntaktický a sémantický analyzátor spolu s interpretem.

2. ÚVOD

Tento článek popisuje způsob, jak řešit interpretaci části jazyka SQL použitím programovacího jazyka Java.

3. ROZBOR

3.1 JAZYK SQL

Z rozsáhlého standardu jazyka, jehož úplná interpretace je náročná i v jeho dřívějších verzích, si vybereme takovou podmnožinu, která umožní alespoň základní operace s databázovými údaji, tedy vytváření a rušení tabulek, úpravu dat - vkládání, editaci a mazání - a prohlížení již existujících údajů. K tomu nám postačí šest příkazů.

Každý z příkazů má ještě mnoho parametrů, z nichž jen některé budeme implementovat. Jejich kompletní seznam (ve formě RBNF) poskytne následující rozbor.

Je namístě vysvětlení, proč jsme si vybrali jen malou část jazyka, která, použitá v běžném prostředí, je nedostatečná. Syntaktická a sémantická analýza úplného SQL totiž není žádný problém, postup je v podstatě při dobrém návrhu automatický. Interpretace takových jazykových konstrukcí je však ve vztahu k datovým strukturám v programu náročná, jak myšlenkově, tak časově. Pokud bychom chtěli projekt dále rozvinout, bylo by dobré prostudovat postupy, kterými se tvoří databáze SQL v operačních prostředí se systémem souborů. Myslím však, že jako cvičný příklad nebo začátek větší práce jde o dobrý základ.

Jako realizační jsme si vybrali jazyk Java, umožňuje totiž elegantně rozdělit problém do logických částí - tříd s metodami.

3.2 RBNF

V následujících odstavcích je uvedena syntaxe jednotlivých používaných příkazů našeho SQL (tučně jsou označena klíčová slova). Význam není blíže popsán, předpokládáme, že je obecně znám.

Zbývá ještě specifikovat význam označení výraz v klauzuli WHERE:

3.3 GRAMATIKA

Gramatiku uvedeme jako soupis pravidel, neterminály jsou uvedeny tučně, výstupní symboly italikou. Počáteční symbol je S, gramatika je již transformována na LL(1).

S -> CREATE CREATE TABLE jméno_tabulky jméno_tabulky (CT)
S -> DELETE DELETE FROM jméno_tabulky jméno_tabulky W
S -> DROP DROP TABLE jméno_tabulky jméno_tabulky
S -> INSERT INSERT INTO jméno_tabulky jméno_tabulky (C) VALUES (V)
S -> SELECT SELECT CS FROM jméno_tabulky jméno_tabulky W
S -> UPDATE UPDATE jméno_tabulky jméno_tabulky SET CE W

CT -> jméno_sloupce jméno_sloupce typ_sloupce typ_sloupce CT'
CT' -> µ | , CT

C -> jméno_sloupce jméno_sloupce C'
C' -> µ | , C

CS -> * | C

CE -> jméno_sloupce jméno_sloupce=hodnota hodnota CE'
CE' -> µ | , CE

V -> hodnota hodnota V'
V' -> µ | , V

W -> WHERE E | µ

E -> TE'
E' -> OR TE' OR | µ
T -> FT'
T' -> AND FT' AND | µ
F -> (E) | EE binární_operátor EE binární_operátor
EE -> jméno_sloupce jméno_sloupce | hodnota hodnota

Gramatika není optimální, ale je z ní dobře patrný význam jednotlivých neterminálů. Bližší popis terminálů nebudeme uvádět, snad je jejich význam je zřejmý.

3.4 LEXIKÁLNÍ ANALYZÁTOR

Použili jsme obvykle sestrojený lexikální analyzátor. Rozpoznává klíčová slova, identifikátory, reálná čísla zapsaná v desítkové soustavě podle zvyklostí jazyka Java, řetězce (ty jsou podle SQL označeny jednoduchými uvozovkami), logické operátory (rovná se, nerovná se, je větší, je větší nebo rovno, je menší, je menší nebo rovno, AND, OR) a další znaky (čárka, levá a pravá závorka, hvězdička). Nejvíce napoví obrázek příslušného automatu:

.
Obrázek 1

3.5 SYNTAKTICKÝ A SÉMANTICKÝ ANALYZÁTOR

Syntaktický a sémantický analyzátor je realizován společně formou rekurzivní sestupu. Jejich implementace odpovídá výše uvedené překladové gramatice. Gramatika není atributová, není to nutné. Jediná sémantická analýza spočívá ve zjištění, zda je počet uvedených sloupců v klauzuli INSERT roven počtu dále uvedených hodnot. Kontrola dodržení např. odpovídajících typů je možná až při otevření tabulky z disku, proto je celá problematika ponechána na posledním článku programu - manipulaci se soubory. Zajištění nutných informací probíhá formou překladové gramatiky.

4. REALIZACE

4.1 PŘEHLED

Následující obrázek podává přehled o struktuře programu. Každá logická část je realizována jako samostatná třída, třídy jsou přitom na sobě závislé - např. třída virtuálního počítače potřebuje ke své činnosti třídu přístupu na disk, syntaktický analyzátor zase lexikální analyzátor.

.
Obrázek 2

Určení částí je následující:

4.2 STRUKTURA SOUBORŮ TABULEK

Každá tabulka je realizována formou souboru na disku. Struktura jednotlivých tabulek je jednoduchá, pro lepší kontrolu při ladění programu a snadnost prohlížení v běžných textových editorech - data jsou tedy textová.

jméno_sloupce typ_sloupce ---tabulátor--- jméno_sloupce typ_sloupce ---tabulátor--- ...
hodnota ---tabulátor--- hodnota ---tabulátor--- ...
hodnota ---tabulátor--- hodnota ---tabulátor--- ...
...

5. ZÁVĚR

Podařilo se nám realizovat interpret podmnožiny jazyka SQL pomocí programovací jazyka Java. Program je tak přenositelný na všechny platformy, pro které existuje Java VM.

Náš program trpí nedostatkem možnosti reálného použití, bližší zamyšlení nad problematikou je uvedeno v části 3.1. Přesto se jedná o dobrý základ pro další rozšíření.

6. LITERATURA

[1] K. Müller: Programovací jazyky, Vydavatelství ČVUT, 2002
[2] B. Melichar: Jazyky a překlady, Vydavatelství ČVUT, 1999
[3] P. Herout: Učebnice jazyka Java, Kopp, 2000