ÐлизиÑÑÑ Ñелиз ÑзÑка NewLang Ñ Ð¿ÑинÑипиалÑной новой «ÑиÑкой», пеÑеделаннÑм ваÑианÑом пÑепÑоÑеÑÑоÑа, коÑоÑÑй позволÑÐµÑ ÑаÑÑиÑÑÑÑ ÑинÑакÑиÑа ÑзÑка Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑазлиÑнÑÑ Ð´Ð¸Ð°Ð»ÐµÐºÑов DSL за ÑÑÐµÑ Ð¼Ð°ÐºÑоÑов.
Ð, как вÑегда, иÑполÑзÑÑ Ñанее найденнÑй лайÑÑ Ð°Ðº Ð¥Ð°Ð±Ñ â Ñма палаÑа, Ñ Ð¾ÑелоÑÑ Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¾Ñ ÑиÑаÑелей обÑаÑнÑÑ ÑвÑÐ·Ñ Ð½Ð°ÑÑÐµÑ Ð¿Ñедлагаемого ниже Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð°, коÑоÑÑй планиÑÑеÑÑÑ Ðº ÑеализаÑии в новом пÑепÑоÑеÑÑоÑе NewLang.
Ð Ñем Ð¸Ð´ÐµÑ ÑеÑÑ?
DSL (ÐÑедмеÑно-оÑиенÑиÑованнÑй ÑзÑк) â ÑзÑк пÑогÑаммиÑованиÑ, ÑпеÑиализиÑованнÑй Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑной облаÑÑи пÑименениÑ. СÑиÑаеÑÑÑ, ÑÑо иÑполÑзование DSL ÑÑÑеÑÑвенно повÑÑÐ°ÐµÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð°Ð±ÑÑÑакÑноÑÑи кода, а ÑÑо позволÑÐµÑ Ð²ÐµÑÑи ÑазÑабоÑÐºÑ Ð±Ð¾Ð»ÐµÐµ бÑÑÑÑо и ÑÑÑекÑивно и ÑÑÑеÑÑвенно ÑпÑоÑÐ°ÐµÑ ÑеÑение Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð·Ð°Ð´Ð°Ñ.
УÑловно, можно вÑделиÑÑ Ð´Ð²Ð° Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° к ÑеализаÑии DSL:
- РазÑабоÑка незавиÑимÑÑ ÑÑанÑлÑÑоÑов ÑинÑакÑиÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð³ÐµÐ½ÐµÑаÑоÑов лекÑеÑов и паÑÑеÑов Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð³ÑаммаÑики Ñелевого ÑзÑка поÑÑедÑÑвом ÐÐФ и ÑегÑлÑÑнÑÑ Ð²ÑÑажений (Lex, Yacc, ANTLR и Ñ. д.) и поÑледÑÑÑей компилÑÑией полÑÑенной гÑаммаÑики в маÑиннÑй код.
- РазÑабоÑка или вÑÑÑаивание диалекÑа DSL на ÑзÑке (меÑаÑзÑке) обÑего назнаÑениÑ, в Ñом ÑиÑле за ÑÑÐµÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазлиÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек или ÑпеÑиалÑнÑÑ Ð¿Ð°ÑÑеÑов / пÑепÑоÑеÑÑоÑов.
Ðалее ÑеÑÑ Ð¿Ð¾Ð¹Ð´ÐµÑ Ð¾ вÑоÑом ваÑианÑе, а именно, о ÑеализаÑии DSL на базе ÑзÑков (меÑаÑзÑков) обÑего назнаÑÐµÐ½Ð¸Ñ Ð¸ новом ваÑианÑе ÑеализаÑии макÑоÑов в NewLang как оÑÐ½Ð¾Ð²Ñ Ð´Ð»Ñ ÑазÑабоÑки DSL.
Ðве кÑайноÑÑи
ÐавеÑно Ð¸Ð¼ÐµÐµÑ ÑмÑÑл наÑаÑÑ Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¾ двÑÑ ÐºÑайноÑÑÑÑ Ð¿Ñи ÑеализаÑии DSL на базе ÑзÑка (меÑаÑзÑка) обÑего назнаÑениÑ:
ÐгÑаниÑÐµÐ½Ð½Ð°Ñ Ð³ÑаммаÑика
ÐÑли ÑзÑк пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð³ÑаниÑен ÑобÑÑвенной ÑикÑиÑованной гÑаммаÑикой и не допÑÑÐºÐ°ÐµÑ ÐµÑ ÑаÑÑиÑениÑ, Ñо пÑи ÑеализаÑии DSL ÑазÑабоÑÑик бÑÐ´ÐµÑ Ð²ÑнÑжден иÑполÑзоваÑÑ Ñже ÑÑÑеÑÑвÑÑÑÑÑ Ð³ÑаммаÑикÑ, пÑавила запиÑи опеÑаÑий и вообÑе веÑÑ ÑинÑакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑÑаваÑÑÑÑ Ñакими же, как в ÑзÑке ÑеализаÑии. ÐапÑимеÑ, пÑи иÑполÑзовании в каÑеÑÑве базового ÑзÑка С/С++ или пÑименении ÑазлиÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек и ÑÑеймвоÑков в дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ Ð¿ÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñего назнаÑениÑ.
Ð ÑÑом ÑлÑÑае под ÑеÑмином "DSL" бÑÐ´ÐµÑ ÑкÑÑваÑÑÑÑ Ð¿ÑоÑÑо Ð½Ð°Ð±Ð¾Ñ ÑпеÑиÑиÑеÑÐºÐ¸Ñ ÑеÑминов пÑедмеÑной облаÑÑи, пеÑеопÑеделеннÑÑ Ð¼Ð°ÐºÑоÑов и/или опеÑаÑоÑов, но иÑполÑзование коÑоÑÑÑ Ð±ÑÐ´ÐµÑ Ð¾Ð³ÑаниÑено гÑаммаÑикой ÑзÑка ÑеализаÑии.
ÐеогÑаниÑÐµÐ½Ð½Ð°Ñ Ð³ÑаммаÑика
ÐÑли же ÑзÑк (меÑаÑзÑк) позволÑÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ ÑобÑÑвеннÑÑ Ð³ÑаммаÑÐ¸ÐºÑ (напÑÐ¸Ð¼ÐµÑ Ð½Ð° ÑÑовне AST), Ñо DSL Ñже не бÑÐ´ÐµÑ Ð¶ÐµÑÑко огÑанен ÑинÑакÑиÑом базового ÑзÑка пÑогÑаммиÑованиÑ, и в ÑезÑлÑÑаÑе его гÑаммаÑика Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ°ÐºÐ¾Ð¹ Ñгодно. ÐплоÑÑ Ð´Ð¾ Ñого, ÑÑо Â«Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ нового пÑоекÑа пÑидеÑÑÑ Ð¸Ð·ÑÑаÑÑ Ð½Ð¾Ð²Ñй ÑзÑк⦠». ÐÑо можно ÑделаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑпеÑиализиÑованнÑÑ Ð¼ÐµÑаÑзÑков (Lisp, ML, Haskell, Nemerle, Forth, Tcl, Rebol и пÑ.)
ÐÑÐµÐ½Ñ ÑекомендÑÑ Ð¿ÑоÑиÑаÑÑ Ð¾ меÑапÑогÑаммÑовании великолепнÑÑ ÑÑаÑÑÑ NeoCode ÐеÑапÑогÑаммиÑование: какое оно еÑÑÑ Ð¸ каким должно бÑÑÑ.
ÐÐ»Ñ Ð¾Ð±ÑÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑедлагаеÑÑÑ ÑледÑÑÑÐ°Ñ ÑеализаÑÐ¸Ñ Ð¼Ð°ÐºÑоÑов
«ÐÐµÑ Ð² миÑе ÑовеÑÑенÑÑва», и поÑле вÑпÑÑка Ñелиза NewLang 0.2 Ñ Ð¿Ð¾Ð»ÑÑил много оÑзÑвов (по болÑÑей ÑаÑÑи негаÑивнÑÑ ), по Ð¿Ð¾Ð²Ð¾Ð´Ñ Ð¿ÐµÑвого ваÑианÑа ÑеализаÑии макÑоÑов и DSL на Ð¸Ñ Ð¾Ñнове. РеÑли положиÑÑ ÑÑÐºÑ Ð½Ð° ÑеÑдÑе, ÑÑа кÑиÑика ÑаÑÑо бÑла обоÑнованной. ÐоÑÑÐ¾Ð¼Ñ Ñ ÑеÑил попÑобоваÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ пеÑеделаÑÑ Ð¼Ð°ÐºÑоÑÑ, в надежде полÑÑиÑÑ Â«Ð·Ð¾Ð»Ð¾ÑÑÑ ÑеÑединÑ» Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð¾Ð¿Ð¸ÑаннÑми вÑÑе кÑайноÑÑÑми пÑи опиÑании DSL.
ÐÑполÑзÑÐµÐ¼Ð°Ñ ÑеÑминологиÑ
ÐакÑоÑÑ Ð² NewLang, ÑÑо один или неÑколÑко ÑеÑминов, коÑоÑÑе заменÑÑÑÑÑ Ð½Ð° дÑÑгой ÑеÑмин или на ÑелÑÑ ÑинÑакÑиÑеÑкÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ (поÑледоваÑелÑноÑÑÑ Ð»ÐµÐºÑем). ÐакÑоÑÑ ÑвлÑÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно и ÑаÑÑиÑением базового ÑинÑакÑиÑа ÑзÑка, пÑи ÑеализаÑии ÑобÑÑвеннÑÑ Ð´Ð¸Ð°Ð»ÐµÐºÑов DSL, и ÑинÑакÑиÑеÑким ÑÐ°Ñ Ð°Ñом.
ÐÐ»Ð°Ð²Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ Ð¼Ð°ÐºÑоÑов в Ñом, ÑÑо они позволÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐµÑе до Ð¸Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. РаÑкÑÑÑие макÑоÑов пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ ÑабоÑÑ Ð»ÐµÐºÑеÑа, ÑÑо позволÑÐµÑ Ð¿Ð¾Ð´Ð¼ÐµÐ½ÑÑÑ Ð¸Ð¼Ð¸ лÑбÑе дÑÑгие ÑеÑÐ¼Ð¸Ð½Ñ Ð¸ даже модиÑиÑиÑоваÑÑ Ñам ÑинÑакÑÐ¸Ñ ÑзÑка.
ÐоÑÑомÑ, еÑли пеÑед именем обÑекÑа NewLang модиÑикаÑÐ¾Ñ Ð½Ðµ ÑказÑваÑÑ (\макÑоÑ, $локалÑнаÑ_пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð»Ð¸ @модÑлÑ), Ñо ÑпеÑва бÑÐ´ÐµÑ Ð¿ÑоизводиÑÑÑÑ Ð¿Ð¾Ð¸Ñк обÑекÑа ÑÑеди макÑоÑов, поÑом ÑÑеди локалÑнÑÑ Ð¿ÐµÑеменнÑÑ Ð¸ в поÑледнÑÑ Ð¾ÑеÑÐµÐ´Ñ ÑÑеди модÑлей (обÑекÑов модÑлÑ). Ðа ÑÑÐµÑ ÑÑого можно иÑполÑзоваÑÑ ÑеÑÐ¼Ð¸Ð½Ñ Ð±ÐµÐ· обÑзаÑелÑнÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑоÑов Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ Ñипов обÑекÑов.
ÐпÑеделение макÑоÑов
ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑоÑов иÑполÑзÑеÑÑÑ ÑоÑно Ñакой ÑинÑакÑиÑ, как и Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ Ð¾Ð±ÑекÑов ÑзÑка (пÑименÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Â«::=», «=» или «:=», ÑооÑвеÑÑÑвенно Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа, пÑиÑвоение нового знаÑÐµÐ½Ð¸Ñ Ñже ÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа / пÑиÑÐ²Ð¾ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑÑ Ð½Ðµ завиÑимо Ð¾Ñ ÐµÐ³Ð¾ налиÑÐ¸Ñ Ð¸Ð»Ð¸ оÑÑÑÑÑÑвиÑ).
РобÑем виде, опÑеделение макÑоÑа ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑÑÐµÑ ÑаÑÑей <Ð¸Ð¼Ñ Ð¼Ð°ÐºÑоÑа> <опеÑаÑÐ¾Ñ ÑозданиÑ/пÑиÑвоениÑ> <Ñело макÑоÑа> и завеÑÑаÑÑÐ°Ñ ÑоÑка Ñ Ð·Ð°Ð¿ÑÑой ";".
Тело макÑоÑа
Телом макÑоÑа могÑÑ Ð±ÑÑÑ ÐºÐ¾ÑÑекÑное вÑÑажение ÑзÑка, поÑледоваÑелÑноÑÑÑ Ð»ÐµÐºÑем (коÑоÑÑе заклÑÑаеÑÑÑ Ð² двойнÑе обÑаÑнÑе ÑлеÑи, Ñ.е. \\лекÑема1 лекÑема1\\) или обÑÑÐ½Ð°Ñ ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока (обÑÐ°Ð¼Ð»ÐµÐ½Ð½Ð°Ñ Ð² ÑÑойнÑе обÑаÑнÑе ÑлеÑи, Ñ.е. \\\ ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока \\\).
ÐÐ»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ
лекÑем в Ð¾Ð´Ð½Ñ (аналог опеÑаÑии ## в пÑепÑоÑеÑÑоÑе С/С++), иÑполÑзÑеÑÑÑ Ð¿Ð¾ аналогии ÑинÑакÑÐ¸Ñ ##. ÐоÑ
ожий опеÑаÑÐ¾Ñ Ð¿ÑименÑеÑÑÑ Ð¸ Ð´Ð»Ñ Ð¾Ð±ÑÐ°Ð¼Ð»ÐµÐ½Ð¸Ñ Ð»ÐµÐºÑÐµÐ¼Ñ Ð² кавÑÑки #, напÑимеÑ, \macro($arg) := \\ func_ \## \#arg(\#arg) \\;
? Ñогда вÑзов macro(arg) бÑÐ´ÐµÑ Ð¿ÑеобÑазован в func_arg ("arg")
;
ÐÐ¼Ñ Ð¼Ð°ÐºÑоÑа
Ðменем макÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð¾ÑнÑй иденÑиÑикаÑÐ¾Ñ Ñ Ð¿ÑеÑикÑом макÑоÑа "\" или поÑледоваÑелÑноÑÑÑ Ð¸Ð· неÑколÑÐºÐ¸Ñ Ð»ÐµÐºÑем. ÐÑли в каÑеÑÑве имени макÑоÑа иÑполÑзÑеÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð»ÐµÐºÑем, Ñо ÑÑеди Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ ÐºÐ°Ðº минимÑм один иденÑиÑикаÑÐ¾Ñ Ð¸ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко Ñаблонов.
Шаблон â ÑÑо ÑпеÑиалÑнÑй иденÑиÑикаÑÐ¾Ñ ÐºÐ¾ÑоÑÑй пÑи ÑопоÑÑавлении Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¼ÐµÐ½ÑÑÑÑÑ Ð»ÑбÑм одиноÑнÑм ÑеÑмином. С помоÑÑÑ Ñаблонов пÑоизводиÑÑÑ Ð¿Ð¾Ð¸Ñк по обÑазÑÑ Ð¸ замена заданнÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑей лекÑем на Ñело макÑоÑа.
ÐÐ»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñаблона в наÑале иденÑиÑикаÑоÑа нÑжно поÑÑавиÑÑ Ð·Ð½Ð°Ðº доллаÑа (ÑÑо ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð¿Ð¸Ñи имени локалÑной пеÑеменой), Ñ. е. \\одна_лекÑема\\, \\ÑелÑÑ ÑÑи лекÑемÑ\\ \\лекÑема $Ñаблон1 $Ñаблон2 \\.
ÐакÑоÑÑ ÑÑиÑаÑÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми, еÑли Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ ÑавнÑ, колиÑеÑÑво ÑлеменÑов в Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð°Ñ ÑовпадаеÑ, а иденÑиÑикаÑоÑÑ Ð¸ ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑаÑполагаÑÑÑÑ Ð½Ð° ÑÐµÑ Ð¶Ðµ ÑамÑÑ Ð¼ÐµÑÑÐ°Ñ .
ÐÑгÑменÑÑ Ð¼Ð°ÐºÑоÑов
ТеÑÐ¼Ð¸Ð½Ñ Ð¸Ð»Ð¸ ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð² имени макÑоÑа могÑÑ Ð¸Ð¼ÐµÑÑ Ð°ÑгÑменÑÑ, коÑоÑÑе ÑказÑваÑÑÑÑ Ð² кÑÑглÑÑ
ÑкобкаÑ
. ÐеÑеданнÑе аÑгÑменÑÑ Ð² Ñеле макÑоÑа запиÑÑваÑÑÑÑ Ð² меÑÑе Ð´Ð»Ñ ÑаÑкÑÑÑÐ¸Ñ ÐºÐ°Ðº Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ñной пеÑеменой, но пеÑед именем нÑжно добавиÑÑ Ð¾Ð±ÑаÑнÑй ÑлеÑ, Ñ.е. \$name
.
ÐÑоизволÑное колиÑеÑÑво паÑамеÑÑов Ñ Ð¼Ð°ÐºÑоÑа оÑмеÑаеÑÑÑ ÑÑоеÑоÑием "...", а меÑÑо Ð´Ð»Ñ Ð²ÑÑавки ÑÑÐ¸Ñ Ð°ÑгÑменÑов оÑмеÑаеÑÑÑ Ð»ÐµÐºÑемой \$.... ÐÑли Ñ Ð¼Ð°ÐºÑоÑа еÑÑÑ Ð½ÐµÑколÑко иденÑиÑикаÑоÑов Ñ Ð°ÑгÑменÑами, Ñо Ð´Ð»Ñ Ð²ÑÑавки аÑгÑменÑов из конкÑеÑного иденÑиÑикаÑоÑа иÑполÑзÑеÑÑÑ Ð»ÐµÐºÑема Ñ Ñказанием нÑжного иденÑиÑикаÑоÑа, напÑимеÑ, \$name....
ЧÑÐ¾Ð±Ñ Ð²ÑÑавиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑеалÑно пеÑеданнÑÑ Ð°ÑгÑменÑов иÑполÑзÑеÑÑÑ Ð»ÐµÐºÑема \$#, или Ñ Ñказанием нÑжного иденÑиÑикаÑоÑа, напÑимеÑ, \$#name.
ÐакÑоÑÑ ÑабоÑаÑÑ Ñ Ð»ÐµÐºÑемами, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ ÑазлиÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, в Ñом ÑиÑле и о Ñипе даннÑÑ , еÑли она Ñказана. Ðо на ÑекÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² аÑгÑменÑÐ°Ñ Ð¼Ð°ÐºÑоÑов никак не обÑабаÑÑваÑÑÑÑ Ð¸ ÑÑо одна из обÑзаÑелÑнÑÑ ÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ñеализована в бÑдÑÑем.
ÐÑимеÑÑ:
\макÑоÑ1 := 123;
\макÑоÑ2(arg) := {func( \$arg ); func2(123);};
\\макÑÐ¾Ñ Ð¸Ð·(...) лекÑем\\ := \\ call1(); call2( \$... ); call3() \\;
\ÑекÑÑовÑй_макÑÐ¾Ñ := \\\ ÑÑÑока Ð´Ð»Ñ Ð´Ð»Ñ Ð»ÐµÐºÑеÑа \\\;
# ÐбÑÑнÑе макÑоÑÑ (Ñело макÑоÑа коÑÑекÑное вÑÑажение)
\macro := replace();
\macro2($arg) := { call( \$arg ); call()};
# Ð ÑÑнкÑÐ¸Ñ Ð¿ÐµÑедаеÑÑÑ ÐºÐ¾Ð»-во аÑгÑменÑов и Ñами аÑгÑменÑÑ
\\func name1(...)\\ := name2( \$#, \$name1... );
# Тело макÑоÑов из поÑледоваÑелÑноÑÑи лекÑем
\if(...) := \\ [ \$... ] --> \\; # ÐÑÑажение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ полнÑм
\else := \\ ,[ _ ] --> \\; # ÐÑÑажение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ полнÑм
# Тело макÑоÑа из ÑекÑÑовой ÑÑÑоки (как в пÑепÑоÑеÑÑоÑе С/С++)
\macro_str := \\\ ÑÑÑока - Ñело макÑоÑа \\\; # СÑÑока Ð´Ð»Ñ Ð»ÐµÐºÑеÑа
\macro($arg) := \\\ func_ \## \#arg(\#arg)\\\; # macro(arg) -> func_arg ("arg")
Ðакие возможноÑÑи ÑÑо даеÑ?
Таким обÑазом можно опÑеделиÑÑ Ð¼Ð°ÐºÑоÑÑ Ð² ÑледÑÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°ÑиÑÑ :
â п/п ÐÐ¼Ñ Ð¼Ð°ÐºÑоÑа Тело макÑоÑа
----------------------------------------------------------------
1. \иденÑиÑикаÑÐ¾Ñ Ð²ÑÑажение
2. \иденÑиÑикаÑÐ¾Ñ \\лекÑема1 лекÑема2\\
3. \иденÑиÑикаÑÐ¾Ñ \\\ÑÑÑока Ð´Ð»Ñ Ð»ÐµÐºÑеÑа\\\
4. \\лекÑема1 лекÑема2\\ вÑÑажение
5. \\лекÑема1 лекÑема2\\ \\лекÑема1 лекÑема2\\
6. \\лекÑема1 лекÑема2\\ \\\ÑÑÑока Ð´Ð»Ñ Ð»ÐµÐºÑеÑа\\\
ÐÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· пеÑеÑиÑленнÑÑ Ð²ÑÑе комбинаÑии Ð¸Ð¼ÐµÐµÑ Ñвои ÑвойÑÑва и огÑаниÑениÑ:
ÐлаÑÑиÑеÑÐºÐ°Ñ Ð·Ð°Ð¼ÐµÐ½Ð° одного ÑеÑмина на дÑÑгой ÑеÑмин или Ñелое вÑÑажение. ÐднокÑаÑно обÑабаÑÑваеÑÑÑ Ð»ÐµÐºÑеÑом и паÑÑеÑом пÑи опÑеделении. ÐÑÑажение в Ñеле макÑоÑа должно бÑÑÑ ÐºÐ¾ÑÑекÑнÑм Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑинÑакÑиÑа и пÑи налиÑии в нем оÑибок, ÑообÑение об ÑÑом ÑоÑмиÑÑеÑÑÑ ÑÑазÑ, еÑе пÑи опÑеделении макÑоÑа.
ÐлаÑÑиÑеÑÐºÐ°Ñ Ð·Ð°Ð¼ÐµÐ½Ð° одного ÑеÑмина на поÑледоваÑелÑноÑÑи лекÑем, в Ñом ÑиÑле и не полнÑе ÑинÑакÑиÑеÑкие конÑÑÑÑкÑии. ÐднокÑаÑно обÑабаÑÑваеÑÑÑ Ð»ÐµÐºÑеÑом пÑи опÑеделении макÑоÑа. Тело макÑоÑа анализиÑÑеÑÑÑ Ð¿Ð°ÑÑеÑом пÑи его иÑполÑзовании, поÑÑÐ¾Ð¼Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñе ÑинÑакÑиÑеÑкие оÑибки бÑдÑÑ Ð·Ð°Ð¼ÐµÑÐµÐ½Ñ ÑолÑко пÑи ÑаÑкÑÑÑии макÑоÑа.
ÐлаÑÑиÑеÑÐºÐ°Ñ Ð·Ð°Ð¼ÐµÐ½Ð° одного ÑеÑмина на ÑекÑÑовÑÑ ÑÑÑокÑ, коÑоÑÐ°Ñ Ð¿Ð¾Ð´Ð°ÐµÑÑÑ Ð½Ð° Ð²Ñ Ð¾Ð´ лекÑеÑа. ÐднокÑаÑно обÑабаÑÑваеÑÑÑ Ð»ÐµÐºÑеÑом ÑолÑко Ð¸Ð¼Ñ Ð¼Ð°ÐºÑоÑа пÑи его опÑеделении, ÑÑо позволÑÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ñело макÑоÑа и изменÑÑÑ/комбиниÑоваÑÑ/модиÑиÑиÑоваÑÑ Ð»ÐµÐºÑÐµÐ¼Ñ Ð´Ð¾ Ð¸Ñ Ð¿Ð¾Ð´Ð°Ñи в анализаÑоÑ. СинÑакÑиÑеÑкие оÑибки бÑдÑÑ Ð·Ð°Ð¼ÐµÑÐµÐ½Ñ ÑолÑко пÑи ÑаÑкÑÑÑии макÑоÑа.
4, 5 и 6. Ðамена поÑледоваÑелÑноÑÑи из неÑколÑÐºÐ¸Ñ Ð»ÐµÐºÑем (Ñаблонов) на вÑÑажение, поÑледоваÑелÑноÑÑÑ Ð»ÐµÐºÑем или ÑекÑÑовÑÑ ÑÑÑÐ¾ÐºÑ ÑооÑвеÑÑÑвенно.
ÐазнаÑение и пÑимеÑÑ Ð¸ÑполÑзованиÑ
ÐакÑоÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ð¸ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ ÑинÑакÑиÑа NewLang в более пÑивÑÑнÑй ÑинÑакÑÐ¸Ñ Ð½Ð° оÑнове клÑÑевÑÑ Ñлов, Ñак как Ñакой ÑекÑÑ Ð³Ð¾Ñаздо легÑе воÑпÑинимаеÑÑÑ Ð¿Ñи поÑледÑÑÑем ÑÑении иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода.
ÐÑли пеÑед именем обÑекÑа NewLang модиÑикаÑÐ¾Ñ Ð½Ðµ Ñказан (\макÑоÑ, $локалÑнаÑ_пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð»Ð¸ @модÑлÑ), Ñо ÑпеÑва иÑеÑÑÑ Ð¸Ð¼Ñ Ð¼Ð°ÐºÑоÑа, поÑом Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ñной пеÑеменной и в поÑледнÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¸Ð¼Ñ Ð¼Ð¾Ð´ÑÐ»Ñ (обÑекÑа модÑлÑ). Ðа ÑÑÐµÑ ÑÑого полÑÑаеÑÑÑ Ð¾Ð¿ÑеделÑÑÑ ÑинÑакÑÐ¸Ñ DSL в пÑивÑÑной запиÑи без обÑзаÑелÑнÑÑ Ð¿ÑеÑикÑов Ñ ÑазнÑÑ Ñипов обÑекÑов.
ÐапÑимеÑ, запиÑÑ ÑÑловного опеÑаÑоÑа на оÑновном ÑинÑакÑиÑе NewLang:
[condition] --> {
...
} [ condition2 ] --> {
...
} [ _ ] {
...
};
# С помоÑÑÑ Ð¼Ð°ÐºÑоÑов
\if(...) := \\ [ \$... ]--> \\;
\elif(...) := \\ ,[ \$... ]--> \\;
\else := \\ ,[ _ ]--> \\;
# ÐÑевÑаÑаеÑÑÑ Ð² клаÑÑиÑеÑкÑÑ Ð·Ð°Ð¿Ð¸ÑÑ
if( condition ){
...
} elif( condition2 ) {
...
} else {
...
};
Ðли Ñикл до 5:
count:=1;
[ 1 ] <-> {
[count>5] --> {
++ 42 ++;
};
count+=1;
};
бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ð±Ð¾Ð»ÐµÐµ пÑивÑÑно Ñ Ð¸ÑполÑзованием ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¼Ð°ÐºÑоÑов:
\while(...) := \\ [ \$... ] <-> \\;
\return(...) := ++ \$... ++;
\true := 1;
count := 1;
while( true ) {
if( count > 5 ) {
return 42;
};
count += 1;
};
Удаление макÑоÑов
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑоÑа нÑжно пÑиÑвоиÑÑ ÐµÐ¼Ñ Ð¿ÑÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð»ÐµÐºÑем \macro_str := \\\\;
. Так же Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ ÑпеÑиалÑнÑй ÑинÑакÑиÑ: \\\\ name \\\\;
или \\\\ \\два ÑеÑмина\\ \\\\;
, Ñ.е. ÑказаÑÑ Ð¸Ð¼Ñ Ð¼Ð°ÐºÑоÑа Ð¼ÐµÐ¶Ð´Ñ ÑеÑÑÑÑÐ¼Ñ Ð¾Ð±ÑаÑнÑми ÑлеÑами.
ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑделÑной ÑинÑакÑиÑеÑкой конÑÑÑÑкÑии Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑоÑов вÑзвана Ñем, ÑÑо имена макÑоÑов обÑабаÑÑваÑÑÑÑ Ð»ÐµÐºÑеÑом еÑе до ÑÑапа анализа в паÑÑеÑе.
Ð Ñем пÑоÑиÑ?
- ÐазовÑй ÑинÑакÑÐ¸Ñ ÑзÑка можно ÑазбавлÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми клÑÑевÑми Ñловами и пÑевÑаÑиÑÑ ÐµÐ³Ð¾ в пÑивÑÑнÑй «keyword-based».
- ÐпÑеделение макÑоÑов ÑооÑвеÑÑÑвÑÐµÑ Ð»ÐµÐºÑике ÑзÑка, а Ñами макÑоÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº обÑÑнÑе обÑекÑÑ.
- ÐÑоÑÑоÑа анализа иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода и его оÑладки.
- ÐÑполÑзование ÑеÑминов DSL и пÑиемов меÑапÑогÑаммиÑование можно ÑделаÑÑ ÑвнÑм, напÑимеÑ, вÑегда пеÑед именем макÑоÑа ÑказÑваÑÑ Ð¿ÑеÑикÑ. Ð ÑÑом ÑлÑÑае компилÑÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñно знаÑÑ, ÑÑо ÑÑебÑеÑÑÑ Ð²ÑполниÑÑ ÑаÑкÑÑÑие макÑоÑа.
- ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо ÑинÑакÑÐ¸Ñ ÑзÑка на Ñвой ÑÑÑÐ°Ñ Ð¸ ÑиÑк можно знаÑиÑелÑно модиÑиÑиÑоваÑÑ, но ÑÑо можно ÑделаÑÑ ÑолÑко в ÑÐ°Ð¼ÐºÐ°Ñ Ð¾Ð¿ÑеделеннÑе огÑаниÑений (AST нелÑÐ·Ñ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð½Ð°Ð¿ÑÑмÑÑ), ÑÑо не позволÑеÑÑÑ Ð¾ÑÐµÐ½Ñ ÑилÑно ÑазгÑлÑÑÑÑÑ Ð¸, напÑимеÑ, обÑÑÑиÑÑ Ð¸Ð»Ð¸ подвеÑиÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑ.
- ÐеÑмоÑÑÑ Ð½Ð° оÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑие возможноÑÑи по модиÑикаÑии ÑинÑакÑиÑа, полÑÑаеÑÑÑ Ð¾ÑÐµÐ½Ñ Ð¿ÑоÑÑаÑ, бÑÑÑÑÐ°Ñ Ð¸ однознаÑÐ½Ð°Ñ ÑеализаÑиÑ. Ð ÑÑо положиÑелÑно ÑказÑваеÑÑÑ Ð½Ð° ÑкоÑоÑÑи анализа иÑÑ Ð¾Ð´Ð½Ð¸ÐºÐ¾Ð², деÑекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ обÑабоÑки возможнÑÑ Ð¾Ñибок и одновÑеменно ÑвлÑеÑÑÑ ÑазÑмнÑм компÑомиÑÑом Ð¼ÐµÐ¶Ð´Ñ ÑложноÑÑÑÑ ÑеализаÑии данного ÑÑнкÑионала и возможноÑÑÑми опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑобÑÑвеннÑÑ Ð´Ð¸Ð°Ð»ÐµÐºÑов DSL.
- ÐÑи желании еÑÑÑ ÐºÑда ÑазвиваÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи меÑапÑогÑаммиÑованиÑ. РбÑдÑÑем можно добавиÑÑ ÑопоÑÑавление Ñаблона Ñ Ð¾Ð±ÑазÑом (напÑимеÑ, на оÑнове ÑегÑлÑÑнÑÑ Ð²ÑÑажений), ÑделаÑÑ Ð¿Ð°ÑамеÑÑизаÑÐ¸Ñ ÑÑÑоки Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑии ÑинÑакÑиÑа в Ñеле макÑоÑа, в Ñом ÑиÑле и в ÑанÑайме, и много дÑÑÐ³Ð¸Ñ ÑазнÑÑ ÑпоÑобов изÑÑно вÑÑÑÑелиÑÑ Ñебе в Ð½Ð¾Ð³Ñ Ð¸Ð»Ð¸ Ð½Ð¾Ð³Ñ Ñвоего ÑоваÑиÑа.
ÐаклÑÑение
ÐÑÐ´Ñ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñен за лÑбÑÑ Ð¾Ð±ÑаÑнÑÑ ÑвÑÐ·Ñ Ð¿Ð¾ данной ÑеализаÑии макÑоÑов. Ð Ð´Ð²Ð°Ð¶Ð´Ñ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñен, еÑли кÑоме кÑиÑики бÑдÑÑ Ð²ÑÑÐºÐ°Ð·Ð°Ð½Ñ ÐµÑе и пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÐµÑ ÑлÑÑÑÐµÐ½Ð¸Ñ Ð¸ доÑабоÑкам, еÑли какой-Ñо Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð±Ñл ÑпÑÑен.
ÐовоÑÑи, обзоÑÑ Ð¿ÑодÑкÑов и конкÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Timeweb.Cloud â в наÑем Telegram-канале â©