QapDSL — декларативное описание AST и парсеров для C++

QapDSL — декларативное описание AST и парсеров для C++ QapDSL — это специализированный язык (DSL), который позволяет описывать абстрактные синтаксические деревья (AST) и правила их разбора для языков программирования, прежде всего C++. Такая формализация помогает автоматизировать построение парсеров, генерацию кода, анализ исходников и даже рефакторинг.Зачем нужен QapDSL?Компактно и наглядно описывать структуру и грамматику языка. Автоматически генерировать C++-структуры, парсеры, сериализаторы и визиторы. Ускорять эксперименты с языками, создавая прототипы компиляторов и анализаторов. Упрощать анализ и рефакторинг сложных языков, в т.ч. C++. Пример QapDSL-описанияРассмотрим, как описывается объявление класса C++ на QapDSL:t_class{ string keyword; t_sep sep0; string name; t_sep sep1; TAutoPtr parents; t_sep sep2; TAutoPtr body; t_sep sep3; { M+=go_any_str_from_vec(keyword,split("struct,class,union",",")); O+=go_auto(sep0); O+=go_str(name); O+=go_auto(sep1); O+=go_auto(parents); O+=go_auto(sep2); O+=go_auto(body); O+=go_auto(sep3); M+=go_const(";"); } }Читать дальше →

QapDSL — декларативное описание AST и парсеров для C++



QapDSL — декларативное описание AST и парсеров для C++


QapDSL — это специализированный язык (DSL), который позволяет описывать абстрактные синтаксические деревья (AST) и правила их разбора для языков программирования, прежде всего C++. Такая формализация помогает автоматизировать построение парсеров, генерацию кода, анализ исходников и даже рефакторинг.



Зачем нужен QapDSL?


  • Компактно и наглядно описывать структуру и грамматику языка.
  • Автоматически генерировать C++-структуры, парсеры, сериализаторы и визиторы.
  • Ускорять эксперименты с языками, создавая прототипы компиляторов и анализаторов.
  • Упрощать анализ и рефакторинг сложных языков, в т.ч. C++.


Пример QapDSL-описания


Рассмотрим, как описывается объявление класса C++ на QapDSL:


t_class{
  string keyword;
  t_sep sep0;
  string name;
  t_sep sep1;
  TAutoPtr parents;
  t_sep sep2;
  TAutoPtr body;
  t_sep sep3;
  {
    M+=go_any_str_from_vec(keyword,split("struct,class,union",","));
    O+=go_auto(sep0);
    O+=go_str(name);
    O+=go_auto(sep1);
    O+=go_auto(parents);
    O+=go_auto(sep2);
    O+=go_auto(body);
    O+=go_auto(sep3);
    M+=go_const(";");
  }
}

Читать дальше →