概要
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 の例
- tcp
- 鳥類キャリアによるIP (ジョーク)