Open3

The Go Programming Language Specification を読む

湯豆腐湯豆腐

Introduction

  • Go はシステムプログラムを念頭に置いて設計された汎用言語
  • 強い型付け
  • ガベージコレクション
  • 並行プログラミングに対する明示的なサポート
  • Go のプログラムは packages という、効率的な依存関係の管理を可能にする性質をもつものから構成されている
  • 文法はコンパクトでパースするのに単純であるので、統合開発環境のような自動化ツールによる解析を容易にする
湯豆腐湯豆腐

Notation

  • 文法は EBNF で表記される
    ↓EBNF自体を定義するEBNF
    Production  = 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 の部分の解析で TermExpression の間に Alternative が必要だった