Skip to content

Instantly share code, notes, and snippets.

View sergey-shambir's full-sized avatar

Sergey Shambir sergey-shambir

  • iSpring Solutions
View GitHub Profile
@sergey-shambir
sergey-shambir / split_words.cpp
Last active March 21, 2016 14:45
функция SplitWords на базе boost::trim и boost::split.
// Используем split для разбиения текста на слова
// предикат, возвращённый функцией 'boost::is_space()', отмечает пробельные символы как разделители
// token_compress_on гарантирует склеивание нескольких пробельных символов в один
// 'boost::trim' убирает пробельные символы в начале и в конце (иначе в words окажутся пустые слова).
vector<string> SplitWords(string const& text)
{
std::string trimmed = boost::trim_copy(text);
vector<string> words;
boost::split(words, trimmed, boost::is_space(), boost::token_compress_on);
return words;
@sergey-shambir
sergey-shambir / cocos_make.cpp
Created March 22, 2016 05:27
Cocos2d-x make function
template <class T, class ...TArgs>
T *make_cc(TArgs&&... args)
{
T *ret = new (std::nothrow) T;
if (ret && ret->init(std::forward<TArgs>(args)...)) {
ret->autorelease();
return ret;
}
CC_SAFE_RELEASE(ret);
return nullptr;
@sergey-shambir
sergey-shambir / ast.md
Last active May 8, 2021 14:17
Кодирование AST

Связь AST и парсера

  • Абстрактное синтаксическое дерево (AST) содержит связанные между собой экземпляры структур данных (узлов).
  • При этом узлами AST можно представить все конструкции, допустимые в соответствующем языке программирования.

Допустим, программа состоит из последовательных инструкций. Каждая инструкция — это определение функции или вызов функции. Тогда структура AST может быть такой:

Program (struct)
 -&gt; std::vector statements
// pixels to dialog units
{
WTL::CDialogBaseUnits units(GetFont(), m_hWnd);
WTL::CSize size = units.MapDialogPixels(WTL::CSize(800, 520));
wchar_t buffer[2000];
wsprintf(buffer, L"%dx%d", size.cx, size.cy);
MessageBoxW(buffer, L"SIZE", MB_OK);
}
// map dialog units to pixels
#include <chrono>
int main()
{
// Через системные часы получаем объект типа time_point.
auto timePointBefore = std::chrono::system_clock::now();
RunSomeLongOperation();
// Получаем второй момент времени (после операции).

Варианты для проекта "Транслятор"

Чтобы выполнить проект, следует составить спецификацию языка и затем составить язык по этой спецификации. Спецификация включает в себя

  • описание ключевой парадигмы языка (императивный, структурный, процедурный, объектно-ориентированный) и краткое описание особенностей (3-4 предложения)
  • лексическая структура: алфавит, список ключевых слов, список токенов-разделителей, список операторов.
  • синтаксические и семантические особенности: как выполнена поддержка разных типов данных
  • грамматика языка в EBNF нотации, проверенная через Flex/Bison

Варианты

@sergey-shambir
sergey-shambir / grammar.y
Created April 26, 2016 18:16
Modified java grammar
/** Файл содержит основанный на Bison LALR-парсер,
способный проверить принадлежность входных данных грамматике языка.
Основано на https://github.com/bingmann/flex-bison-cpp-example/blob/master/src/parser.yy
*/
%start program
%{
#include <stdio.h>
void VerifyText(const std::wstring &text, const std::wstring expectedText)
{
const auto pair = boost::mismatch(text, expectedText);
const bool textEnded = (pair.first == text.end());
const bool expectedEnded = (pair.second == expectedText.end());
if (textEnded)
{
if (expectedEnded)
{

Хорошая замена DWORD/int для кодов ошибок при работе с API ОС

Минимальный пример выдаёт “no such file or directory”:

#include <system_error>
#include <Windows.h>

void RaiseSystemError()
{
using String = char [];
using ArrayInt = int [];
// Операции над массивом char
- получение длины
- доступ чтение/запись к элементу строки (+ проверка границ, при выходе кидать панику (или abort))
- выделение памяти под локальный массив известной длины
// Первая модель: массив статически известного размера
- выделение памяти под локальный массив: