右上➚

プログラミングに関するメモをのこしていきます

コンパイラ

C++ のテンプレートの実装

C++ のテンプレートがなぜ必要で,どんな構文・種類のものがあるかについては前回までにまとめました。 というわけで次は C++ ではテンプレートという機能を使用するとどんなバイナリが生成されるのかについて見ていきます。 C++ のテンプレートの強力さとか…

Rust のパーサコンビネータライブラリ combine を使う時の tips

Rust のパーサコンビネータライブラリの一つである Marwes/combine: A parser combinator library for Rust を使ってみています. 詳しい使い方はきちんとしたドキュメントがあるのでそちらを参照してください. ざっくりいうと Haskell の parsec: Monadic …

C++ でパーサコンビネータを書きました

C++ で構文解析といえば,Boost.Spirit や yacc系などが有名ですが,どうにも使うの辛かったので作りました. 2016/05/01 追記 いろいろ更新しました.肯定先読み以外はプリミティブも実装し終わっているかと思います. ドキュメントはまだ無いのですが,す…

Rust における return文の LLVM IR 表現について

if 文が値を返す return 文を持つ 以上のような特徴を持つ言語はどういう感じでコンパイルされるのか知りたくて,Rust について調べてみました. Rust では以下の様なことが出来ます. fn f() { let x = if cond { return None; } else { 1 }; ... } Scala …

Type Erasure による Visitor パターンの実装

プログラミングしていて,木構造をうまく扱いたいという状況は結構良くあると思います. 代数的データ型とパターンマッチを持つ言語であればとても美しく完結に表現できる木構造ですが,オブジェクト指向言語でやろうと思うと結構たいへんです. 典型的には …

コンパイラ内部の AST 表現について

コンパイラは大体,ソースコードを構文解析し,AST を作り,意味解析,コード生成という流れで実装されると思います. さて,AST は単純に書くと type expr = | Int of int | Add of expr * expr | Apply of expr * expr list | ... みたいな感じに書けると…

Boost.Spirit.X3 で簡易電卓を実装 1

agtn.hatenablog.com agtn.hatenablog.com 引き続き,Boost.Spirit.X3 です. 今回は,前回までの知識をつかって,簡易電卓を実装してみます. 仕様 今回定義する電卓は, + - * / の 4 つの演算と単項の - をサポートします. また,整数型のみを扱うものと…

Boost.Spirit.X3 の練習 2

Boost.Spirit.X3 の練習1 - プログラミングのメモ帳➚に引き続き,Boost.Spirit.X3 のお勉強メモです. セマンティックアクション 構文解析にはセマンティックアクションというのがつきものです. yacc や parsec など有名な構文解析のためのツール/ライブラ…

Boost.Spirit.X3 の練習1

Boost.Spirit.X3 の練習1 Boost.Spirit.X3 という C++ のための パーサコンビネータライブラリを使ってみています. Boost.Spirit というと, C++ の黒魔術の塊みたいなイメージがあります. ちなみに Boost.Spirit.Qi が安定版のパーサコンビネータライブラ…