47.3. ÐÑап ÑазбоÑа
ÐÑап ÑазбоÑа ÑазделÑеÑÑÑ Ð½Ð° две ÑаÑÑи:
РазбоÑ, алгоÑиÑм коÑоÑого опиÑан в
gram.yиscan.l, а пÑогÑаммнÑй код генеÑиÑÑеÑÑÑ Ð¸Ð½ÑÑÑÑменÑами Unix bison и flex.ÐÑеобÑазование, в пÑоÑеÑÑе коÑоÑого модиÑиÑиÑÑÑÑÑÑ Ð¸ дополнÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , полÑÑеннÑе поÑле ÑазбоÑа запÑоÑа.
47.3.1. РазбоÑ
ÐÑи ÑазбоÑе пÑовеÑÑеÑÑÑ ÑнаÑала ÑинÑакÑÐ¸Ñ ÑÑÑоки запÑоÑа (поÑÑÑпаÑÑей в виде неÑÑÑÑкÑÑÑиÑованного ÑекÑÑа). ÐÑли он пÑавилÑнÑй, ÑÑÑоиÑÑÑ Ð´ÐµÑево запÑоÑа и пеÑедаÑÑÑÑ Ð´Ð°Ð»ÑÑе, в пÑоÑивном ÑлÑÑае возвÑаÑаеÑÑÑ Ð¾Ñибка. ÐекÑиÑеÑкий и ÑинÑакÑиÑеÑкий анализ Ñеализован Ñ Ð¿Ñименением Ñ Ð¾ÑоÑо извеÑÑнÑÑ ÑÑедÑÑв Unix bison и flex.
ÐекÑиÑеÑÐºÐ°Ñ ÑÑÑÑкÑÑÑа опÑеделÑеÑÑÑ Ð² Ñайле scan.l и опиÑÑÐ²Ð°ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ, клÑÑевÑе Ñлова SQL и Ñ. д. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ найденного клÑÑевого Ñлова или иденÑиÑикаÑоÑа генеÑиÑÑеÑÑÑ Ñимвол ÑзÑка, коÑоÑÑй заÑем пеÑедаÑÑÑÑ ÑинÑакÑиÑеÑÐºÐ¾Ð¼Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑÑ.
СинÑакÑÐ¸Ñ ÑзÑка опÑеделÑн в Ñайле gram.y в виде набоÑа гÑаммаÑиÑеÑкиÑ
пÑавил и дейÑÑвий, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи ÑÑабаÑÑвании пÑавил. ÐÐ»Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð´ÐµÑева ÑазбоÑа иÑполÑзÑеÑÑÑ ÐºÐ¾Ð´ дейÑÑвий (ÑÑо дейÑÑвиÑелÑно код на C).
Файл scan.l пÑеобÑазÑеÑÑÑ Ð² пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° C scan.c Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ flex, а gram.y â в gram.c Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ bison. ÐоÑле ÑÑиÑ
пÑеобÑазований иÑполнÑемÑй код анализаÑоÑа ÑоздаÑÑÑÑ Ð¾Ð±ÑÑнÑм компилÑÑоÑом C. Ðикогда не вноÑиÑе коÑÑекÑÐ¸Ð²Ñ Ð² ÑгенеÑиÑованнÑе ÑÐ°Ð¹Ð»Ñ C, Ñак как они бÑдÑÑ Ð¿ÐµÑезапиÑÐ°Ð½Ñ Ð¿Ñи ÑледÑÑÑем вÑзове flex или bison.
ÐÑимеÑание
УпомÑнÑÑÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ компилÑÑÐ¸Ñ Ð¾Ð±ÑÑно пÑоизводÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑбоÑоÑнÑми Ñайлами Makefile, поÑÑавлÑемÑми в ÑоÑÑаве диÑÑÑибÑÑива Postgres Pro.
ÐодÑобное опиÑание bison и гÑаммаÑиÑеÑкиÑ
пÑавил в gram.y вÑÑ
Ð¾Ð´Ð¸Ñ Ð·Ð° Ñамки данной главÑ. УзнаÑÑ Ð±Ð¾Ð»ÑÑе о flex и bison можно из книг и докÑменÑаÑии. ÐзÑÑение гÑаммаÑики, опиÑанной в gram.y, ÑледÑÐµÑ Ð½Ð°ÑаÑÑ Ñо знакомÑÑва Ñ bison, инаÑе бÑÐ´ÐµÑ ÑÑÑдно понÑÑÑ, ÑÑо Ñам пÑоиÑÑ
одиÑ.
47.3.2. ÐÑеобÑазование
Ðа ÑÑой ÑÑадии деÑево ÑазбоÑа ÑоздаÑÑÑÑ ÑолÑко Ñ ÑикÑиÑованнÑми знаниÑми о ÑинÑакÑиÑеÑкой ÑÑÑÑкÑÑÑе SQL. ÐÑи его Ñоздании не пÑоÑмаÑÑиваÑÑÑÑ ÑиÑÑемнÑе каÑалоги, ÑÑо не даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð½ÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑÑ ÑеманÑÐ¸ÐºÑ Ð·Ð°Ð¿ÑоÑенной опеÑаÑии. ÐоÑле ÑÑого вÑполнÑеÑÑÑ Ð¿ÑоÑедÑÑа пÑеобÑазованиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´ÐµÑево ÑазбоÑа Ð¾Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑа и вÑполнÑÐµÑ ÑеманÑиÑеÑкий анализ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñй Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ, к каким именно ÑаблиÑам, ÑÑнкÑиÑм и опеÑаÑоÑам обÑаÑаеÑÑÑ Ð·Ð°Ð¿ÑоÑ. СÑÑÑкÑÑÑа даннÑÑ , коÑоÑÐ°Ñ ÑоздаÑÑÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑой инÑоÑмаÑии, назÑваеÑÑÑ Ð´ÐµÑевом запÑоÑа.
СинÑакÑиÑеÑкий ÑÐ°Ð·Ð±Ð¾Ñ Ð¾ÑделÑн Ð¾Ñ ÑеманÑиÑеÑкого анализа, поÑÐ¾Ð¼Ñ ÑÑо обÑаÑаÑÑÑÑ Ðº ÑиÑÑемнÑм каÑалогам можно ÑолÑко внÑÑÑи ÑÑанзакÑии, а наÑинаÑÑ ÑÑанзакÑÐ¸Ñ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле полÑÑÐµÐ½Ð¸Ñ ÑÑÑоки Ñ Ð·Ð°Ð¿ÑоÑом нежелаÑелÑно. СинÑакÑиÑеÑкого ÑазбоÑа доÑÑаÑоÑно, ÑÑÐ¾Ð±Ñ ÑаÑпознаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми (BEGIN, ROLLBACK и Ñ. д.), поÑÑÐ¾Ð¼Ñ Ð¸Ñ
можно вÑполниÑÑ Ð±ÐµÐ· далÑнейÑего анализа. УбедивÑиÑÑ, ÑÑо Ð¼Ñ Ð¸Ð¼ÐµÐµÐ¼ дело Ñ ÑобÑÑвенно запÑоÑом (напÑимеÑ, SELECT или UPDATE), можно наÑинаÑÑ ÑÑанзакÑиÑ, еÑли она еÑÑ Ð½Ðµ наÑаÑа. ТолÑко поÑле ÑÑого можно пеÑеÑ
одиÑÑ Ðº пÑоÑедÑÑе пÑеобÑазованиÑ.
ÐеÑево запÑоÑа, Ñоздаваемое пÑоÑедÑÑой пÑеобÑазованиÑ, по ÑÑÑÑкÑÑÑе во многом поÑ
оже на деÑево ÑазбоÑа, но оÑлиÑаеÑÑÑ Ð²Ð¾ многиÑ
деÑалÑÑ
. ÐапÑимеÑ, Ñзел FuncCall в деÑеве ÑазбоÑа пÑедÑÑавлÑÐµÑ Ñо, ÑÑо по ÑинÑакÑиÑÑ Ð¿Ð¾Ñ
оже на вÑзов ÑÑнкÑии. ÐÑÐ¾Ñ Ñзел Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑеобÑазован в Ñзел FuncExpr или Aggref в завиÑимоÑÑи Ð¾Ñ Ñого, какой (обÑÑной или агÑегаÑной) окажеÑÑÑ ÑÑнкÑÐ¸Ñ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм именем. ÐÑоме Ñого, в деÑево запÑоÑа добавлÑеÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑакÑиÑеÑкиÑ
ÑипаÑ
даннÑÑ
ÑÑолбÑов и ÑезÑлÑÑаÑов вÑÑажений.