2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ブロックプログラミング言語】 Trees に、文字幅の設定機能を実装しました

Last updated at Posted at 2024-10-13

はじめに

以前、↓ のように書けるプログラミング言語を開発しました。

「でも、せっかく見やすいのに、全角文字が入ると表示が崩れるやん!」
「罫線文字って、場合によって全角か半角かが変わるんだぞ?」

対応しました。

新しいコンパイラオプション

この章は機種やフォントの設定によって大きく表示が違います。2つパターン(HalfFull)があるので、「一番キレイに見えるプログラム」 の方を見ていただければ。

Half

 さて、例えば、以下のTreesコードは正しくコンパイルされます。(そして、「こんにちは!世界!」を出力します。)

正しいTreesコード
┌───────┐
│println│
└──┬────┘
 ┌─┴─────────┐
 │"こんにちは!世界!"│
 └───────────┘

でもこれはあんまりキレイじゃないですね?以下のように書きたいです。

全角を考慮したTreesコード (helloworld_half.tr)
┌───────┐
│println│
└───┬───┘
 ┌──┴─────────────────┐
 │"こんにちは!世界!"│ 
 └────────────────────┘

コマンドに --char-width オプションを渡せば、このプログラムもコンパイルできます!

コンパイルするためのオプション
> trees --char-width half "./helloworld_half.tr"

Full

上記に加えて、罫線も全角で表示されていたらどうでしょう?

罫線も全角になっているTreesコード (helloworld_full.tr)
 ┌────┐
 │println │
 └──┬─┘
 ┌──┴───────┐
 │"こんにちは!世界!"│
 └──────────┘

--char-width オプションにfullを渡せば、このプログラムもコンパイルできます!

コンパイルするためのオプション
> trees --char-width full "./helloworld_full.tr"

どうやって全角か半角か決めてるの?

Unicode には、全角表示か半角表示かを決定する附則があります。これを参考にしています1

(全角、半角のリスト):

ところが、文字によっては 半角で表示すべきか全角で表示すべきかが決まっていない場合があります。例えば、罫線文字はその代表例です。

image.png
↑ セミコロンの直後に注目。"A" (Ambiguous) は場合によって全角の場合も半角の場合もあることを示す。

--char-width オプションの、half はそのような文字を半角として扱い、full は全角として扱うという差があります。これでほとんどのケースをカバーできるはずです。

終わりに

文字の全角半角のことを全然知らなかったです。こんな風に決まってたんですね。
さて、Trees の GitHubリポジトリを貼っておきます。

以上です。以下はおまけです。


補足:文字幅が異なるプログラムがごっちゃになるが~?

前の記事で、「Treesはインタプリタ言語で、ソースコードを直接実行するよ」と言いました。であれば、次の疑問が出てくるのは当然です。

「結局文字コードを統一しなければいけないじゃん」...と。

実は、この問題に対応するため、すでに Trees は、Javaめいた中間コードを生成して実行するようになっています!2

以下のコードはコンパイル結果の中間コード(*.trm)を出力します

コンパイルコマンド
> trees -m compile <ソースコードファイル>

ーそうして、プログラム内部で、こうして生成された*.trmを利用できます。3

補足は以上です。

  1. なお、実装上は、Rustのunicode-widthクレートに完全に依存しています。

  2. もちろんそれだけではなく、いちいちソースコードを解析するのにコストがかかるため、という理由もありますよ。

  3. 詳しくは、GitHubのwikiにあるinclude プロシージャの説明を参照。従来通り*.trも利用できます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?