Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プログラミング言語作ってみた

Avatar for onesis777 onesis777
October 15, 2026

 プログラミング言語作ってみた

第7回 LT大会「涼しゅうなってきたけぇ、そろそろLTするかぁ!」(https://okayama-revengers.connpass.com/event/397974/)で使ったスライドです。

Avatar for onesis777

onesis777

October 15, 2026

Other Decks in Programming

Transcript

  1. vectorへの入力 AClang: a = iread[5] C++に変換したコード: auto a = [&]{

    std::vector<long long> _v(5); for (long long& _x : _v) std::cin >> _x; return _v; }();
  2. rep文 ( = for i in 0 .. N) AClang:

    C++: rep i, n for (long long i = 0; i < n; i++) { std::cout << i << "\n"; out i end }
  3. AClangのコード n = iread rep i, n a = iread[n]

    if i % 2 == 0 rsort a alice += a[i] alice, bob = 0, 0 else bob += a[i] end end out alice - bob
  4. 生成されたC++ auto [alice, bob] = std::make_tuple(0, 0); int main(void) {

    for (long long i = 0; i < n; i++) { auto n = []{ long long n; std::cin >> n; return n; }(); if (((static_cast<long long>(i) % static_cast<long long>(2)) == 0)) { auto a = [&]{ std::vector<long long> _v(n); alice += a[i]; } else { bob += a[i]; for (long long& _x : _v) std::cin >> _x; return _v; }(); std::sort(a.rbegin(), a.rend()); } } std::cout << std::boolalpha << (alice - bob) << "\n"; return 0; }
  5. しくみ Pythonエンジン(AClang.py) 1.AClang.ac DSLソースコード コード 読み込み 2.構文解析 ソースコードと文法ルール から構文木(AST)を生成 AST

    3.Transformer ASTの巡回とC++コード生 成 結合 ルール 読み込み AClang.lark LALR文法ルール 4.C++テンプレート ヘッダー、高速I/O、ヘル パー関数 出力 書き出し 5.AClang.cpp 競技プログラミング用の生 成されたC++コード
  6. ASTとは + 左図: 1 + 2 * 3 を構文解析した構文木 1

    * 人間が書いたソースコードを、コンパイラが意味を理解し やすくするために木のような階層構造に変換したデータ →コードの構造を把握する! 2 3
  7. AClang.lark (文法の一部) ?start : cmd+ ?cmd : while_stmt ?expression :

    logical_or ?logical_or : logical_or "||" logical_and -> log_or | logical_and ?logical_and : logical_and "&&" comparison -> log_and | comparison while_stmt: "while" expression [":"] block "end" 文法を定義することで、 AClangとして有効な書き方 を決める!
  8. Pythonエンジン (Transformer) class AClangTransformer(Transformer): def while_stmt(self, items): while_cond = items[0]

    block_code = items[1] return f"""while ({while_cond}) {{ {block_code} }}""" # C++のコードに変換!
  9. C++ テンプレート #include <iostream> struct Init { Init() { std::ios::sync_with_stdio(0);

    std::cin.tie(0); } }init; template <typename T> bool chmax(T &a, const T& b) { if (a < b) { a = b; return true; } return false; }