伺か Advent Calendar 2023、6日目の記事です。 前日5日はTatakinovさんの担当でした。
私、月波 清火が制作したYAYA
用フォーマッター「ayayatter
」についての記事です。
YAYA
の辞書ファイルを、一定の規則に従って整形するツールになります。
先行作品として、apxxxxxxeさんのformatyayaがあります。
GitHub Repositoryにて公開をしています。(※開発版かつUTF-8のみ対応なので注意)
使い方の説明もそちらで。
例:
$ ayayatter input -e utf8 -f path/to/yaya_dict.txt
後学のためです。(その割にはゴリ押ししています)
本当に後学のため、非公開用に作ったので、色々準備がいたらぬ面もあると思います。
公開に至った経緯は、Advent Calendar の枠が空いていたので……。
入力を1ページで完結するようにしたことです。
本当は#globaldefine
の関係でyaya.txt
から辞書順を読み込み、そこからパースする必要があったのですが、めんど、いや、大変だったので、1ページのみの入力にしました。
これにより、パースできない部分が出てきた分、動作が軽くなっているはずです。
また、YAYA
のシステム辞書で用意されているチェイントーク用の構文にも対応しています。
コメントのパース処理です。
リンターならコメントは多分無視して大丈夫だと思うのですが、フォーマッターだとコメントも取得しなければ情報が欠けることになってしまいます。
(追記: リンターでもエラー位置把握のためコメントのパースは必要とのことです。大変失礼いたしました)
なので、コメントも取得するようにtspeg
というパーサジェネレーターのスクリプトを書いたのですが……。
(#globaldefine
の一部分です)
preprocessGlobalDefineName := '#' c1=continueLineOrCommentLong* 'g' c2=continueLineOrCommentLong*
'l' c3=continueLineOrCommentLong* 'o' c4=continueLineOrCommentLong*
'b' c5=continueLineOrCommentLong* 'a' c6=continueLineOrCommentLong*
'l' c7=continueLineOrCommentLong* 'd' c8=continueLineOrCommentLong*
'e' c9=continueLineOrCommentLong* 'f' c10=continueLineOrCommentLong*
'i' c11=continueLineOrCommentLong* 'n' c12=continueLineOrCommentLong*
'e' c13=continueLineOrCommentLong*
.comments = commentLong[][] {
const raw = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13];
return filterOutContinueLines(raw);
}
うん、不味い。おかわりはいらない系。
もっとスマートなやり方がきっとあると思うのですが、私には思いつかなかったです……。
- 複数の文字コードに対応
- コメントの出力処理の改善
- インデント形式をオプションで選べるようにする(可能性低いです)
以上3点でしょうか。また、YAYA
に新しいキーワードや構文が出てきたら、できる限り対応、したいなと思っています(ふんわり)。
ここまで読んでくださり、ありがとうございます。
明日7日は生駒精華さんの担当です。よろしくお願いいたします。
月波 清火
コード部分については、ソースのライセンスであるMITにて公開することとします。
コード以外の部分についてはCC BY 4.0の下で公開するものとします。
クレジット: 月波 清火(https://github.com/tukinami)