pockestrap

Programmer's memo

RubyKaigi 2018 Proposal: A parser based syntax highlighter

accepted.

rubykaigi.org

Title

A parser based syntax highlighter

Abstract

It has an elegant syntax that is natural to read and easy to write. https://www.ruby-lang.org/en/

Definitely. The syntax is elegant. But it is too complex sometimes. So, syntax highlighters for Ruby are difficult and easy to break. For example, probably your editor cannot correctly highlight ????::?:, % %s%% %%%% or def end(def:def def;end)end (They are valid Ruby programs!). Yeah, it is edge cases. In real cases, some syntax highlighter cannot correctly highlight a here document.

I'll talk a robust syntax highlighter for Ruby, it is Iro gem and Iro.vim. The highlighter never break since it uses Ripper to highlight code.

Details

このトークではIro.vimというVimプラグイン、及びIroというGemについて話します。 https://github.com/pocke/iro.vim https://github.com/pocke/iro

IroはRipperを使用しRubyプログラムからSyntax Highlightしやすいような構造を生成するためのGemです。そしてIro.vimはIroをVimから使用するためのプラグインです。これらはVImにおいてどんなRubyプログラムも正しくハイライトできるSyntax Highlighterです。

以下に概要を示します。

  • RubyのSyntax Highlightの難しさについて
    • ????::?:のような、恐らく多くのSyntax Highlighterを壊せるコードの紹介
    • RubyのSyntax Highlighterを実装することの難しさ
      • Rubyの構文の難しさ
      • 従来の正規表現ベースのSyntax Highlighterではどうしても漏れが生じる
        • 正規表現ベースでの実装であるVimのSyntax Highlighterの紹介
  • Iro Gem, 及び Iro.vim の紹介
    • Iro gem は Ripper をベースにしたSyntax Highlighterである
      • なぜparserをベースにしているのか => 正規表現などより正確な情報を取得できる、つまり正確なハイライトが可能となる
    • どのように実装されているのか
      • 字句解析した結果と、構文解析した結果の両方を使用してハイライトしている。
    • Vimでの使用例
  • Iroの従来の実装より有利な点
    • 正確なハイライト
    • Readability
      • 正規表現を読むのはむずかしい
      • Rubyのコードであれば、Rubyを知っていれば読み解ける。
  • 応用
    • 正規表現によるハイライトでは実現できない、ローカル変数のハイライト
    • Webアプリケーション用の、HTMLを出力する使用例(実装予定)
    • YAMLのハイライト
      • YAMLRubyと同様、EasyであるがComplexである。
      • Iro.vim + Psych を使用することで、これも同様にハイライトできる。
  • Iroの将来
    • 多言語対応
      • Ruby以外の言語でも使えるようにする
        • たとえば、SlimやMarkdownは対応したい思いが強い。

参加者はRubyを日常的に使用している人を想定しています。また、Ripperの使用経験などはとくに問いません。

なお、Iro.vimについてはVimConf 2017というVimについてのカンファレンスでも行いました。 https://speakerdeck.com/pocke/the-new-syntax-highlighter-for-vim こちらではVim側の視点からの紹介となったため、RubyKaigiではRuby側の視点からIroの解説を行います。

Pitch

Syntax Highlightはコードを読み書きする上で重要なものです。 たとえば、どこが文字列であるかぱっとわかります。自分のコードが想定外の解釈がされていないかがわかります。 これはコードを書く際の安心感につながります。安心してコードを書くことができるという前提があるからこそ、思考をスラスラと楽しくコードに落とし込むことができるのだと、私は考えています。

ところが既存のSyntax Highlighterはよく壊れます。すこし複雑なコードを書いただけで、正しくないハイライトを行います。このような状態は、安心してコードを書くことができる状態とは程遠いでしょう。

私がこのトークで話すIroはこの問題を解決します。Iroは正しくハイライトを行えるので、コーディングを安心して行う上での頼もしい相棒となるでしょう。

そのため、多くの人にIroを知ってもらいたい、そしてIroがハイライトを行うためにパーサーを利用するというアプローチを知ってもらいたいと考えています。 これにより、多くの人が常に安心できる環境の元プログラミングできるようにしたいです。