Twitter hashtag: #esspec
https://youtu.be/pVvXXaMZCAM
自己紹介
syumai
仕事でNext.jsやったり、Go書いたりしてます
Goの言語仕様の輪読会が終わったので、勢いでこれを開催しました
Nozomu Ikuta
Vue/Nuxtのスタック中心に仕事をしています
Vue.js-JP 2022 コアスタッフ
Jun Yasumura Jun Yasumura.icon
趣味はCommon Lisp
HTMLの仕様書を読んだ経験あり→仕様書はそうなった経緯が書かれていないものだということを痛感。意図を理解するまで1年半かかった。
元バックエンド(Perl)→講師→休職→復帰。フロントエンド周りの技術を学び、世の中のHTML/CSSコーダーさんを幸せにすることが今の目標。
輪読会は英語の勉強にも役立っています!
noyannoyan.icon
Reactが大好きです。React内部のコードリーディングに時間を溶かしていました
言語仕様書を読むのは初めてなので緊張しています…!
最近はアオアシという漫画が面白いです!
yebis0942yebis0942.icon
Reactたまにやってます
本文では「MDNの説明は難しすぎる」っていう話をしてるけど、MDNの新しい説明はいい感じになってた…
おーみー
高校生です。趣味でReact, Scheme, Haskellなどをいじって遊んでいます
dotfiles managerを作ろうとしたり
プログラミング言語に興味があります
最近は友人のNext.js個人開発を手伝っています
tars0x9752 (たーず / naoki aoyama)
Matrix: @tars0x9752:matrix.org
仕事ではwebアプリ・モバイルアプリ開発のフロントエンド~バックエンドをTSで書いたりしてます。
普段英語を人前で話す機会とかは全然ないので、発音とかお聞き苦しいかもですが、ご容赦ください。(がんばります)
今回の範囲
5.2.4 Static Semantics の Static Semantic Rules have names and... からです
今回どこ読むか
前回のあらすじ
6 ECMAScript Data Tyeps and Valuesを読んでみた
5.2.3 Runtime Semanticsあたりの知識が必要だねという話になって読み始める
5.2.4 Static Semanticsから再開するか相談しようか、というところで終了した
進め方の相談
5.2.4は5.1あたりで説明されている内容に依存してそうなので、5.1から読んでいきたい
たぶんそのあとで5.2.4に戻る
5 Notational Convention
(英語) convention: 規約
(英語) syntactic grammar: 構文文法
(英語) lexical grammar: 字句文法
5.1 Context-Free Grammars
たくさんの生成規則 (production) で構成される production: 生成規則
code:production
HogeHoge: Fuga Moga
↑ ↑
| 右辺 nonterminalまたはterminal(0個以上)
|
左辺 nonterminalひとつ
DivPunctuatorという非終端記号は、終端記号/または/=を生成する
ということだと思うyebis0942.icon
left-hand side, right-hand side: 左辺, 右辺
nonterminal: 非終端記号
terminal: 終端記号
chain production: 連鎖規則
右辺に0個以上の終端記号を持った、ちょうど1つの非終端記号
ちょうど1つ("exactly one")なのはなぜ?
Starting from a sentence consisting of a single distinguished nonterminal, called the goal symbol, a given context-free grammar specifies a language, namely, the (perhaps infinite) set of possible sequences of terminal symbols that can result from repeatedly replacing any nonterminal in the sequence with a right-hand side of a production for which the nonterminal is the left-hand side.
文脈自由文法は言語(language)を規定するもの
languageとはgoal symbolから生成されるもの
5.1.2 The Lexical and RegExp Grammars
Lexical Grammar: 字句文法
ESの字句文法は"11 ECMAScript Language: Lexical Grammar"で定義される
終端記号
SourceCharacterの規則を満たすUnicodeのコードポイント
InputElementDiv, InputElementTemplateTail, InputElementRegExp, InputElementRegExpOrTemplateTail
コードポイント列をinput elements列に変換する
仕様書の記述からは定義がよくわからん感
The lexical grammar describes how Unicode code points are translated into a sequence of input elements (tokens, line terminators, comments, white space).
input elements = トークン + 改行 + コメント+ 空白なのか
token
空白とコメント以外のinput elements
ECMAScriptの構文文法における終端記号になる
ECMAScriptにおける予約語、識別子、リテラル、punctuator
punctuatorって;とかのことだろうかyebis0942.icon
セミコロンもそうみたいです
ありがとうございます。演算子とかもpunctuatorなんですねyebis0942.icon
行端はtokenではないがinput element
無視される要素
単なる空白と一行コメントは無視される
構文文法のためのinput elementsには登場しない
MultiLineComment
一つ以上の行端(改行)を含む場合には1つの行端に置換され、構文文法のためのinput elementに現れる
RegExp Grammar: 正規表現文法
22.2.1で定義されている
同じくSourceCharacterを終端記号とする
goal symbol: Pattern
code points -> regular expression pattern
Lexical grammarとRegExp grammarは
どちらも::を区切り記号にする
両者は一部の生成規則を共有している
streamとsequenceとの違いは?
「stream = プログラムから動的に吐き出されていく」みたいなイメージなのでは
lexical grammarのパース結果がtokenとinput elementの2つあるらしいけど、普通の言語処理系ならtoken列だけで済みそうな気がする。input elementはセミコロン自動挿入のためだけに存在するんだろうかyebis0942.icon
5.1.3 The Numeric String Grammar
文字列を数値にするための文法
終端記号はSourceCharacter
lexical grammarのnumeric literalに関する箇所と似ている
区切り記号は:::
5.1.4 The Syntactic Grammar
Syntactic Grammar: 構文文法
13〜16節で定義される
lexical grammarのtokenを終端記号とする
goal symbol: Script, Module
"independent"の解釈
ScriptもしくはModuleを満たすソースコードは単体で完結しているということか?
ScriptとModuleの間に相互の依存はないということか?
区切り記号は:
ECMAScriptのソースコードの解釈の流れ
1. コードポイントのstreamにlexical grammarを繰り返し適用してinput elementsにする
2. input elementsのstreamにsyntactic grammarを一度だけ適用してパースする
パースに成功するのは以下の場合
input elementsのstreamのtokenがひとつのgoal nonterminal (ScriptかModule) としてパースできるとき
ただしパース後にtokenが残っていたらNG
構文木の話
parse tree
パースに成功して得られるもの
ノードはparse nodeと呼ぶ
parse node
文法のsymbol(記号)に対応する
そのsymbolを生成できるソーステキストの範囲を表す
yebis0942.icon「ソースのn文字目からm文字目はVarDeclarationである」みたいな話か
parse treeのroot
ソーステキストの全体を表す
そのパース処理のgoal symbol
parse node
非終端記号に対応する場合には、その非終端記号を左辺とする生成規則にも対応する
0個以上のchildrenを持つ
note:
one for each symbol on the production's right-hand side: each child is a Parse Node that is an instance of the corresponding symbol.
パーサーが起動するごとに新たに生成されて、再利用はされない
parse node同士が同一になるのは以下の場合
ソーステキストの同じ範囲を表し
同じ文法記号に対応し
同一のパーサー呼び出しから生成する
NOTE 1:
同じソーステキストを複数回evalしたとしても、生成されるparse nodesは別物
NOTE 2:
parse nodeは仕様書のための概念であって、内部実装を規定するものではない
(英語) a rooted tree structure
根付き木
treeには必ずrootがあるのでは?
「特定のノードをrootにする」ということにしたtreeのことをrooted treeというらしいyebis0942.icon
(英語) if and only if
「そのとき、かつそのときに限り」
(英語): and resulted from
"and are resulted from"と書いてくれていたら分かりやすかった
枝葉を省くと"They are instances, and resulted."なので文法的には正当な気がするyebis0942.icon
(英語) account: 説明
parse nodeの同一性っていつ問題になるんだろうyebis0942.icon
例外的な文法の話
13〜16の定義のほかにも正しいScript, Moduleがある
文法の曖昧性を回避する手法
validなScript, Moduleを構成しない一般化された生成規則を使う
たとえばオブジェクトリテラルとオブジェクト分割パターンで使われている
説明がよくわからない感
Draftではもっとわかりやすくなってた
実例がほしい
supplemental grammarとかのキーワードが共通してるのでそれっぽい
この記事ではアロー関数の話だけが出ていて、オブジェクトリテラルとかの話が出てこないですね
generalized productions
複数の生成規則をまとめたもの?
grammatical parameters
後方互換性のために「async付きのfunctionの中だけでawaitをキーワード扱いしたい」みたいなニーズがあって、これを簡便に記述するために「awaitパラメータがあればawaitをキーワード扱いする」のように表現する記述法があるので、たぶんそれのことなのかなyebis0942.icon
(英語) run: 並び・配列
In contrast, in the syntactic grammar, a contiguous run of fixed-width code points is a single terminal symbol.
(字句的文法と違って)構文的文法ではwhileはひとまとまり
$ \texttt{while}\texttt{(}\textit{Expression}\texttt{)} \textit{Statement}
5.1.5 Grammar Notation
lexical grammerにおいて、fixed-width (固定幅/等幅) で書かれた終端記号はソーステキストにそのまま書かれる
このように書かれた終端記号は基本ラテン文字のUnicodeコードポイントとして解釈されるべき
Unicodeエスケープシーケンスで書くこともできない
syntactic grammerにおいて fixed-width で書かれたコードポイントは単一の終端記号を表す
lexical/RegExp grammersにおいて、視覚的な表現の規約(?)がない文字は <ABBREV> と表される
ABBREVはコードポイントのニーモニック
Unicode Format-Control Characters と空白文字
「視覚的な表現の規約がない」というのは空白文字とか制御文字は印字できないという話のような気がしますyebis0942.icon
非終端記号はitalic(斜体)で表される
$ \texttt{while}\texttt{(}\textit{Expression}\texttt{)} \textit{Statement}
TeX記法かっこいいですね…yebis0942.icon
仕様書の内容を正確に表せてうれしいんですがメンテがかなり大変そうaumy.icon
たしかに…。仕様書からコピペするとシュッとTeX記法にしてくれる君みたいなブラウザ拡張は頑張れば書けそうyebis0942.icon
5.1.5のメモ取りしてなかったけど他の方がどんどん書いてくださっててうれしいyebis0942.icon
(英語) ABBREV: abbreviation(略語)の略語
(英語) mnemonic: ニーモニック
一般的には「記憶術」