記事
演算子の結合規則のバリエーションについて
最近RPrecという演算子の優先順位に基づいて構文解析を行うRubyのライブラリを実装しました。 その中で、演算子の優先順位と結合順位についての理解が深まりました。
演算子の優先順位 (precedence) というのは、1 + 2 * 3
が1 + (2 * 3)
と解釈されて「*
は+
よりもつよく結合する」というように言われるものです。
この優先順位はJavaScriptであればこの辺りに、Rubyであればこの辺りにまとまっています。
そして、演算子の結合規則 (associativity) というのは、左結合とか右結合とか言われるものです。
1 + 2 + 3
は(1 + 2) + 3
と解釈されるので+
は左結合であったり、a = b = 1
がa = (b = 1)
と解釈されるので=
は右結合というようなものです。
今回は、この演算子の結合規則のバリエーションについて考察したことについて、まとめたいと思います。
想定読者: 構文解析やプログラミング言語の構文に興味があり、これらについて多少の知識があることを想定しています。
commlogのNuxt 3移行録
commlogはこれまでNuxt 2を利用してきました。 しかし、Nuxtは2022年11月にNuxt 3がリリースされており、Nuxt 2はVue 2と共に2023年12月末をもってサポートが終了されることが発表されていました。 commlogの大部分のコードを書いたのは5年以上前になっているということもあり、コードをメンテナンスすることが困難になっていました。
そこで今回、commlogを完全に書き直すことでNuxt 3に移行しました。 その記録を、この記事では報告します。 また、Nuxt 3の他にTailwind CSSやMock Service Worker (msw)、Bun、Netlify Buildなどの、様々なライブラリ・開発ツールを利用して開発を進めました。 これらにより、モダンな構成にできたのではないかと考えています。
Pike VMとEarley法の関係についてRubyで実装して考えてみる
正規表現マッチングの実装手法の1つとしてPike VMと呼ばれるものがあります。
これはGo言語の正規表現実装やRustのregex
crateで使われている手法であり、正規表現と入力文字列に対しての計算量でマッチングができるのが特徴です。
Earley法はJay Earleyの提案した文脈自由文法 (CFG) の構文解析手法の1つです。 すべてのCFGを構文解析できる手法で最悪計算量はですが、無曖昧であればで、決定的であればで構文解析ができます。
実装してみると分かりますが、Pike VMとEarley法には類似している点があり、Earley法をPike VMの発展系のように考えることができます。 この記事ではPike VMとEarley法のRubyでの実装を通じて、それらの関係を解説します。
想定読者: 形式言語や構文解析についての基本的な知識がある (NFAやCFGなどを知っている) ことを想定しています。
L*について説明してみる
Automata Learning とは、未知の (ブラックボックス) システムに対する入力とその出力から、システムの振舞いを有限状態オートマトンとして再現する手法です。 これは、仕様が形式化されていないシステムに対して形式的な手法を適用するための足掛りになるなど、近年重要な技術となっています。
Angluin によるは Automata Learning のアルゴリズムの中でも最も代表的な存在です。 は未知の正規言語を教師を使って学習するアルゴリズムで、多くの Automata Learning の基礎となっています。
この記事ではの、その原理やアルゴリズムの詳細について解説します。
OGP 画像の自動生成をする
前々から課題として感じていた、このブログの OGP 画像の自動生成を実装しました。 OGP 画像は Twitter などの SNS にシェアするときに表示される画像です。
この記事では自動生成の実装や、skia-canvas や budoux といったライブラリを利用して、タイトルの自動改行や高速な生成を実現したので、それらについても解説します。