6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

tuat-sysbiolabAdvent Calendar 2024

Day 6

DSLの構文解析をかぎ針編みの英文パターンに注目して行うためにBNF記法で表してみた

Posted at

はじめに

編み物の経験がある方はご存じかもしれませんが編み物には編み図と呼ばれる設計図があり、日本では編み図によって作り方の記録や共有がなされています。一方、海外では文章で作り方を記すことが一般的です。
例えば以下のような表現がされます。
これはかぎ針編みの手順を表したものですが、編み図を読むことに慣れた日本人にとって英語で書かれた文章パターンは直感的に理解しがたく、取り組みにくいものとなっています。その一方でプログラミングに似た規則性を持っています。おそらくプログラムを書くことが好きな人ならこの文章パターンもプログラムを読むかの如く楽しく読めることでしょう。
かぎ針編みのパターンをDSL(ドメイン固有言語)として捉え、構文解析を使って読み解き、編み図生成を行うことができれば、限られた人しか扱えなかったパターンをより多くの人に身近に感じてもらえるのではないかと考え、今回はその先駆けとしてまずはパターンのパースを容易にすることを目的としてBNF記法で表してみました。

DSLと構文解析

DSL(Domain specific language)

DSLとは日本語ではドメイン固有言語と訳され、ある特定の分野に特化した言語のことです。かぎ針編みのパターンも"編み物に特化した言語"ととらえることができます。

構文解析(Parsing)

ある入力に対し、思い通りの挙動をさせることを目的として、入力を意味のある構造に変換させることです。これにより機械的な処理や可視化が可能となります。

BNF記法(Backus-Naur form)

BNF記法とは
構文を構成する規則を定義することに用いられる記法です。文章パターンをBNF記法として表現することで

  • 英文パターンの規則を理解する
  • コンピュータでの処理を容易にする
    ことを目指します。

手順

まずは英文パターンで出現する文字の最小単位を定義します。

<digit>        ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" #数字
<number>       ::= <digit> | <digit> <number>#<digid>を繰り返してより大きな数字も定義
<stitch_kind>  ::= "ch" | "sc" | "dc" | "tr" | "hdc" | "inc" | "dec"
                | "CH" | "SC" | "DC" | "TR" | "HDC" | "INC" | "DEC" #編み方

また、英文パターンはスペースやコンマで区切られるため区切り文字を定義します。

<split>		   ::= " " | ","
<end>		   ::= "." 

編み方は'ch 1'のようにどの編み方で何回編むのかを決めています。それを表現します。

<stitch>       ::= <stitch_kind> | <stitch_kind> <split>? <number> | <number> <split>? <stitch_kind> 

繰り返しパターンも定義します。

<repeat>       ::= "(" <operations> ")" <split>*   "x" <number> 

英文パターンは'ROW1'のように何段目かを表すヘッダーが先頭にあるためこれを定義します。

<header>       ::= "R" | "Row" | "ROUND" | "ROW"
<header> <split>*  <number> <split>*

文章の最後にその段に何目になっているかを表すことがあるのでそれを定義します。

<all_col>      ::=  "[" <number> "]" | "(" <number> ")" | "<" <number> ">"  

先ほど定義したものを用いて一連の操作をひとまとまりとします。

<operations>   ::= <stitch> | <stitch> "," <operations> | <repeat> | "turn" | "turn around" | "crochet" | "Place"

文章パターンではをいくつか繰り返すことで成り立っていることが分かります。

<pattern>      ::= <header> <split>*  <number> <split>* ":" <split>* <operation_group>* <end>* <all_col>?

完成

<header>       ::= "R" | "Row" | "ROUND" | "ROW"
<split>		   ::= " " | ","
<end>		   ::= "." 
<all_col>      ::=  "[" <number> "]" | "(" <number> ")" | "<" <number> ">"  
<number>       ::= <digit> | <digit> <number>
<digit>        ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<stitch_kind>  ::= "ch" | "sc" | "dc" | "tr" | "hdc" | "inc" | "dec"
                | "CH" | "SC" | "DC" | "TR" | "HDC" | "INC" | "DEC"
<special>      ::= "sl st" | "Fasten off" | "close ring" | " in MR"
<stitch>       ::= <stitch_kind> | <stitch_kind> <number> | <number> <stitch_kind> 
<repeat>       ::= "(" <operations> ")" <split>*   "x" <number> 
<operations>   ::= <stitch> | <stitch> "," <operations> | <repeat> | "turn" | "turn around" | "crochet" | "Place"
<operation_group> ::=  <operations> <split>* <special>*
<pattern>      ::= <header> <split>*  <number> <split>* ":" <split>* <operation_group>* <end>* <all_col>?

まとめ

本記事ではかぎ針編みの英文パターンをBNF記法で表してみました。
次はこの結果を踏まえて英文パターンをパーシングしていこうと思います。
こうしてみると編み物はとてもシステマチックで、プログラミング言語に近いもののように思います。
年末年始、やることがなくなったらチャレンジしてみてはいかがでしょうか。

6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?