Open3
The Go Programming Language Specification を読む
そういえばGoの言語仕様ちゃんと知らないな~と思っていたところでこちらの記事を見つけた
The Go Programming Language Specification を読んでいく
Introduction
- Go はシステムプログラムを念頭に置いて設計された汎用言語
- 強い型付け
- ガベージコレクション
- 並行プログラミングに対する明示的なサポート
- Go のプログラムは packages という、効率的な依存関係の管理を可能にする性質をもつものから構成されている
- 文法はコンパクトでパースするのに単純であるので、統合開発環境のような自動化ツールによる解析を容易にする
Notation
- 文法は EBNF で表記される
↓EBNF自体を定義するEBNFProduction = production_name "=" [ Expression ] "." . Expression = Alternative { "|" Alternative } . Alternative = Term { Term } . Term = production_name | token [ "…" token ] | Group | Option | Repetition . Group = "(" Expression ")" . Option = "[" Expression "]" . Repetition = "{" Expression "}" .
- 演算子
| alternation () grouping [] option (0 or 1 times) {} repetition (0 to n times)
- 小文字の production name は lexical token を識別するために使われる
- CamelCase は非終端記号(EBNFによって更に展開できる記号)
- lexical token は
""
か``
で囲われる- (どうでもいいけどバッククオートをインラインコードに含めたいときは、囲むバックオートの数を長くすれば良いということを知った)
-
a … b
という形式は、aからbまで(bも含む)の文字の集合を表す -
…
という記号は GoSpec の別の所でも非公式に、列挙したりコードスニペットの省略をしたりするときに出てくる -
…
は Go の token ではない- (
...
という token はあるので、それ特別するために…
を使っているんだろうな)
- (
EBNF自体を定義するEBNFを読み解いてみる
-
Production
とは、production_name = <0個か1個の Expression> .
という形式のもの- 定義の仕方
-
Expression
とは、Alternative
を1つ以上|
で区切って並べたもの -
Alternative
とは、Term
を 1つ以上並べたもの -
Term
とは以下のいずれかproduction_name
token
token…token
Group
Option
Repetition
-
Group
とは、Expression
を()
で囲ったもの -
Option
とは、Expression
を[]
で囲ったもの -
Repetition
とは、Expression
を{}
で囲ったもの
Production = production_name "=" [ Expression ] "." .
を解析してみるとこんな感じかな?
(追記)Expression
の部分の解析で Term
と Expression
の間に Alternative
が必要だった