onihusube/rime

IdentityEscape のパースの実装

onihusube opened this issue · 6 comments

よくわからないので未実装

IdentityEscape ::
    SourceCharacter but not IdentifierPart

IdentifierStart :: 
    UnicodeLetter
    $
    _
    \ UnicodeEscapeSequence

IdentifierPart :: 
    IdentifierStart
    UnicodeCombiningMark
    UnicodeDigit
    UnicodeConnectorPunctuation
    \ UnicodeEscapeSequence

UnicodeLetter
    any character in the Unicode categories “Uppercase letter (Lu)”, “Lowercase letter (Ll)”, “Titlecase letter (Lt)”, “Modifier letter (Lm)”, “Other letter (Lo)”, or “Letter number (Nl)”.

UnicodeCombiningMark
    any character in the Unicode categories “Non-spacing mark (Mn)” or “Combining spacing mark (Mc)”

UnicodeDigit
    any character in the Unicode category “Decimal number (Nd)”

UnicodeConnectorPunctuation
    any character in the Unicode category “Connector punctuation (Pc)”

C++ では IdentityEscape は ECMA-262 に対して修正が入っています。
https://timsong-cpp.github.io/cppwp/n4868/re.grammar#3
要は、何でも OK って事ですね。(ホントは but not c じゃマズい気はするのですが…)

ちなみに、ECMA-262 3rd はちょっとバグってて、この修正が無いと例えば * を(Qualifier ではなく)普通の文字として表すのが非常にめんどくさくなってしまいます。(HexEscapeSequence とか UnicodeEscapeSequence とか使わなくちゃならない)
これは ECMA-262 5.1 では直っています。

(そこ見つけられてませんでした・・・)

ちゃんと読み通して実装します。ありがとうございます!

ちなみに、ECMA-262 3rd はちょっとバグってて、この修正が無いと例えば * を(Qualifier ではなく)普通の文字として表すのが非常にめんどくさくなってしまいます。(HexEscapeSequence とか UnicodeEscapeSequence とか使わなくちゃならない)

あ、すみません、ちゃんと調べたらこれはウソでした。

* とかは IdentifierPart には含まれないので \* は 3rd でも普通に大丈夫でした。
(よくよく考えれは IdentifierPart は識別子に使える文字なので * とかが入らないのは当たり前ですね…)

[a-[:digit:]]みたいのはリジェクト

https://twitter.com/kariya_mitsuru/status/1418769352032018435

[a-[:digit:]] がエラーとなるべき理屈が分かった気がします。

やはり ClassAtomExClassClassAtomCollatingElementClassAtomEquivalence の 3 つは ClassAtom じゃなくて ClassAtomNoDash に生やすので良さそうです。
そうすると BNF の構文規則では [a-[:digit:]] も受理されるのですが、[a-b] の形式の ab に当たる部分について、単一文字を表す物でないと SyntaxError を生成すると ECMA-262 に書いてありました。

[:digit:] は1文字を表す物ではないので、エラーとなります。
同様に、[a-\s] 等もエラーとすべきです。(\s は単一文字を表さないので)

なお、ClassAtom には構文規則上 DecimalEscape も許されていますが、この DecimalEscape が後方参照だった場合にはエラーとなります。(つまり、\0 以外はエラー)

完了しました、詳細に調査していただきありがとうございました!