0

我正在为将使用 unicode 符号的标识符名称实现解析器。我面临的问题是我有一些也用 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解析器停止在中缀运算符上?

4

1 回答 1

3

isAsciiIdStart并且isAsciiIdContinue仅用于指定标识符中有效的 ASCII 字符。解析器接受的非 ASCII 字符identifier是那些通过预检查并且是有效的 Unicode XID 字符的字符。

由于符号运算符不是有效的 Unicode XID 标识符字符,您可以简单地使用IdentifierOptions(normalization = System.Text.NormalizationForm.FormKC).

于 2012-02-10T11:01:09.800 回答