Как заставить парсер идентификатора останавливаться на операторах OperationPrecedenceParser в FParsec? - PullRequest
0 голосов
/ 10 февраля 2012

Я реализую синтаксический анализатор для имен идентификаторов, которые будут использовать символы 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 парсер на инфиксных операторах?

1 Ответ

3 голосов
/ 10 февраля 2012

isAsciiIdStart и isAsciiIdContinue предназначены только для указания символов ASCII, допустимых в идентификаторе.Символы, отличные от ASCII, принятые синтаксическим анализатором identifier, - это те, которые проходят предварительную проверку и являются действительными символами Unicode XID.

Поскольку символические операторы не являются допустимыми символами идентификатора XID Unicode, вы можете просто использоватьIdentifierOptions(normalization = System.Text.NormalizationForm.FormKC).

...