LoginSignup
5
1

More than 1 year has passed since last update.

concat を実装した (rfc9402)

Last updated at Posted at 2023-04-22

概要

github: https://github.com/yabeenico/concat
rfc9402: https://datatracker.ietf.org/doc/html/rfc9402

ジョーク rfc9402 Concat Notation が2023年4月1日に公開されました。

この rfc では猫が箱に入っている状態の表記方法が定義されました。

### 2匹の猫が横に座っている
cat + cat

### 箱の中に猫がいる
[cat]

### 猫が入っている箱の上に猫がいる
cat / [cat]

### 猫の頭が箱に入っている
[c]at

### 猫のしっぽ
t

ABNF

SEQUENCE  =  POSITION / POSITION "=>" SEQUENCE
POSITION  =  ADJACENT
ADJACENT  =  OVER / ADJACENT "+" OVER
OVER      =  MULTIPLE / MULTIPLE "/" POSITION
MULTIPLE  =  CONCAT / NUMBER [ "*" ] MULTIPLE / NUMBER "/" MULTIPLE
CONCAT    =  SUBJECT [ NUMBER ] / [ PARTIAL ] CONTAINER [ PARTIAL ]
CONTAINER =  "[" OPT-POS "]" / "(" OPT-POS ")"
CONTAINER =/ "{" OPT-POS "}" / "<" OPT-POS ">"
OPT-POS   =  [ POSITION ]
SUBJECT   =  CAT / 1*ALPHA / "@"
CAT       =  "cat" / PARTIAL
PARTIAL   =  "c" / "a" / "t" / "ca" / "at"
ALPHA     =   %x41-5A / %x61-7A
NUMBER    =  1*DIGIT
DIGIT     =  "0" / "1" / "2" / "3" / "4"
DIGIT     =/ "5" / "6" / "7" / "8" / "9"

実装

python / Lark-parser で実装しました。
ABNF のいい感じの処理系がなかったので、EBNF を自分で定義しました。
rfc9402 の全てを実装することはまだできていません。
実装したのは以下の表記のみです。

<>: grouping
/: over
*: multiple
+: next
(): round container
{}: soft container
[]: square container
@: ball
cat: cat

インストール

$ git clone https://github.com/yabeenico/concat.git
$ cd concat/
$ pip3 install -r requirements.txt
$ ./concat.py 'cat'
 /\    /
(' )  (
 (  \  )
 |(__)/

実行例

$ ./concat.py 'cat'
 /\    /
(' )  (
 (  \  )
 |(__)/

$ ./concat.py '[cat]'
 --------
| /\    /|
|(' )  ( |
| (  \  )|
| |(__)/ |
 --------

$ ./concat.py 'cat + cat'
 /\    /  /\    /
(' )  (  (' )  (
 (  \  )  (  \  )
 |(__)/   |(__)/

$ ./concat.py 'cat / cat'
 /\    /
(' )  (
 (  \  )
 |(__)/
 /\    /
(' )  (
 (  \  )
 |(__)/

$ ./concat.py '<(cat * 2) + {@ + cat}> / [cat]'
  ~~~~~~~~~~~~~~~~~     -----------------
 ( /\    /  /\    /)   /          /\    /\
( (' )  (  (' )  (  ) /          (' )  (  |
(  (  \  )  (  \  ) ) |    __     (  \  ) |
 ( |(__)/   |(__)/ )   \ _/  \_@  |(__)/  |
  ~~~~~~~~~~~~~~~~~     \________________/
 --------
| /\    /|
|(' )  ( |
| (  \  )|
| |(__)/ |
 --------

シェル芸勉強会用メモ

  • 技術選定に2日 (月火)
  • 飲み会 (水)
  • 実装時間に2日 (木金)
  • ABNF は通信プロトコルの定義でよく使われるらしい
  • BNF が原始的なやつで EBNF が BNF の拡張版
  • Lark は EBNF を少し拡張したやつらしい
  • rfc の例
5
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
5
1