Работа с синтаксисом EBNF в спецификации:
upper ::= ‘A’ | ... | ‘Z’ | ‘$’ | ‘_’ and Unicode category Lu
lower ::= ‘a’ | ... | ‘z’ and Unicode category Ll
letter ::= upper | lower and Unicode categories Lo, Lt, Nl
digit ::= ‘0’ | ... | ‘9’
opchar ::= “all other characters in \u0020-007F and Unicode
categories Sm, So except parentheses ([]) and periods”
Но также с учетом самого начала лексического синтаксиса, который определяет:
Parentheses ‘(’ | ‘)’ | ‘[’ | ‘]’ | ‘{’ | ‘}’.
Delimiter characters ‘‘’ | ‘’’ | ‘"’ | ‘.’ | ‘;’ | ‘,’
Вот что я придумаюс.Работая путем исключения в диапазоне \u0020-007F
, исключая буквы, цифры, скобки и разделители, мы имеем для opchar
... (барабанная дробь):
! # % & * + - / : < = > ? @ \ ^ | ~
, а также Sm
и So
- за исключением скобок и периодов.
(Правка: добавление допустимых примеров здесь :).Таким образом, вот некоторые действительные примеры, которые выделяют все случаи - следите за \
в REPL, мне пришлось бежать как \\
:
val !#%&*+-/:<=>?@\^|~ = 1 // all simple opchars
val simpleName = 1
val withDigitsAndUnderscores_ab_12_ab12 = 1
val wordEndingInOpChars_!#%&*+-/:<=>?@\^|~ = 1
val !^©® = 1 // opchars ans symbols
val abcαβγ_!^©® = 1 // mixing unicode letters and symbols
Примечание 1:
Я нашел этот Unicode индекс категории , чтобы выяснить Lu, Ll, Lo, Lt, Nl
:
- Lu (заглавные буквы)
- Ll (строчные буквы)
- Lo (другие буквы)
- Lt (заглавные буквы)
- Nl (буквенные цифры, такие как римские цифры)
- Sm (математические символы)
- То (символ другой)
Примечание 2:
val #^ = 1 // legal - two opchars
val # = 1 // illegal - reserved word like class or => or @
val + = 1 // legal - opchar
val &+ = 1 // legal - two opchars
val &2 = 1 // illegal - opchar and letter do not mix arbitrarily
val £2 = 1 // working - £ is part of Sc (Symbol currency) - undefined by spec
val ¬ = 1 // legal - part of Sm
Примечание 3:
Другие операторские вещи, которые являются зарезервированными словами: _ : = => <- <: <% >: # @
, а также \u21D2
⇒ и \u2190
←