Я реализую синтаксический анализатор для имен идентификаторов, которые будут использовать символы Unicode. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть некоторые операторы, которые также написаны с помощью символов Юникода, и они могут быть размещены непосредственно после идентификатора, например:
time→sleep(7);
Здесь знак стрелки - это инфиксный оператор, который я добавляю в свой синтаксический анализатор приоритетов операторов:
opp.AddOperator(InfixOperator("→", ws, 10, Associativity.Right,
fun left right -> BinaryOperation(Arrow, left, right)))
Было бы неплохо, если бы я мог просто исключить все комбинации знаков, автоматически добавленные в качестве операторов в OPP. На данный момент я делаю это вручную, используя следующую реализацию для моего идентификатора:
let variable =
let isAsciiIdContinue = isNoneOf "→*/+-<>=≠≤≥' ,();"
identifier (IdentifierOptions(
isAsciiIdContinue = isAsciiIdContinue,
normalization = System.Text.NormalizationForm.FormKC,
allowAllNonAsciiCharsInPreCheck = true))
Однако, похоже, это не работает. Я получаю следующее сообщение об ошибке при попытке разобрать мой код:
time→sleep(7);
^
The identifier contains an invalid character at the indicated position.
Как мне остановить мой variable
парсер на инфиксных операторах?