Кіріспе

Camlp4 - бағдарламалау тілдері үшін кеңейтілетін талдағыштарды (парсерлерді) жазуға арналған бағдарламалық жүйе. Ол грамматикаларды, сондай-ақ мұндай грамматикалардың жүктелетін синтаксистік кеңейтімдерін анықтау үшін OCaml кітапханалары жиынтығын ұсынады. Camlp4 – «Caml Preprocessor and Pretty Printer» деген сөздердің аббревиатурасы және оның ең маңызды қолданыстарының бірі OCaml синтаксисіне арналған домендік ерекше кеңейтімдерді анықтау болды. Camlp4 INRIA-да жасалған ресми OCaml тарату бөлігі болды. Оның бастапқы авторы – Дэниел де Роглаудр. 2007 жылдың мамыр айында шыққан OCaml 3.10.0 нұсқасы Camlp4-тің маңызды өзгертілген және бұрынғы нұсқалармен үйлесімсіз жаңа нұсқасын енгізді. Де Роглаудр Camlp5 деп аталған бұрынғы нұсқалармен үйлесімді жеке нұсқаны қолдайды. Төмендегі барлық мысалдар Camlp5 немесе Camlp4-тің бұрынғы нұсқаларына (3.09 және одан ертерек нұсқалар) арналған. 2019 жылдың жазында шыққан 4.08 нұсқасы осы кітапхананың соңғы ресми нұсқасы болды. Қазіргі уақытта ол қолданыстан шығарылды (қолданылмайды); оның орнына PPX (PreProcessor eXtensions) кітапханаларын пайдалану ұсынылады.

Нақты және абстрактіл синтаксис

Camlp4 препроцессорлары компиляцияланған модульдер жиынтығын жүктейді, олар парсерді және әдемі басып шығару құралын анықтайды: парсер кіріс бағдарламасын ішкі өрнеуге айналдырады. Бұл ішкі өрнеу абстрактілі синтаксистік ағашты (AST) құрайды. Ол екілік форматта шығарылуы мүмкін, мысалы, тікелей OCaml компиляторларының біріне жіберілуі мүмкін немесе оны түсінікті мәтіндік бағдарламаға қайта айналдыруға болады. Конкретті синтаксис түсінігі абстрактілі синтаксистің көрсетілген форматын білдіреді. Мысалы, OCaml-дегі (1 + 2) өрнегі ((+) 1 2) немесе (((+) 1) 2) деп те жазылуы мүмкін. Айырмашылық тек нақты синтаксис деңгейінде, себебі бұл үш нұсқа да бір абстрактілі синтаксистік ағастың эквивалентті өрнеулері. OCaml үшін қайта қарастырылған синтаксис анықтамасы көрсеткендей, бір бағдарламалау тілі әртүрлі нақты синтаксистерді пайдалана алады. Олардың барлығы компилятор өңдей алатын бірегей форматтағы абстрактілі синтаксистік ағашта бірігеді. Абстрактілі синтаксистік ағаш – синтаксистік кеңейтулердің ядросы, олар шын мәнінде OCaml бағдарламалары. Грамматиканың анықтамасы OCaml-де жасалса да, анықталатын немесе кеңейтілетін парсер міндетті түрде OCaml-мен байланысты емес, сондықтан өңделіп жатқан синтаксистік ағаш OCaml-дің синтаксисі болмауы мүмкін. OCaml синтаксистік ағаштарымен жұмысты жеңілдететін бірнеше кітапханалар ұсынылады.

Қолданылу салалары

Домендік тілдер Camlp4-тің маңызды қолданылу саласы болып табылады. OCaml – интерактивті жоғарғы деңгейі мен түпнұсқа кодты компиляциялайтын мүмкіндігі бар көп парадигмалы тіл болғандықтан, оны кез келген жаңа тіл үшін артқы соңғы құрал ретінде пайдалануға болады. Дамыланушының жасауы керек жалғыз нәрсе – сұранысқа берілген домендік тілді стандартты OCaml бағдарламасына түрлендіретін Camlp4 грамматикасын жазу. C сияқты басқа да мақсатты тілдерді де қолдануға болады. Егер мақсатты тіл OCaml болса, OCaml тілінің стандартты мүмкіндіктерін пайдаланып оңай қол жеткізе алмайтын экспрессивтілікті қамтамасыз ету үшін қарапайым синтаксистік қосымшалар немесе синтаксистік қант қолданылуы мүмкін. Синтаксистік кеңейтім компиляцияланған OCaml модулімен анықталады, ол өңделетін бағдарламамен бірге camlp4o атқарылатын файлына жіберіледі. Camlp4 өзі де домендік тіл болып табылады, себебі ол синтаксистік кеңейтімдерді жасауды жеңілдететін синтаксистік кеңейтімдерді ұсынады. Бұл кеңейтімдер грамматиканы (EXTEND операторлары) және <:expr< 1 + 1 >> сияқты цитаталарды ықшам түрде анықтауға мүмкіндік береді, яғни абстрактілі синтаксистік ағаштарды нақты синтаксис арқылы құруға және өзгертуге болады.