0

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

isAsciiIdStartisAsciiIdContinue識別子で有効なASCII文字を指定することのみを目的としています。パーサーが受け入れる非 ASCII 文字はidentifier、事前チェックに合格し、有効な Unicode XID 文字です。

記号演算子は有効な Unicode XID 識別子文字ではないため、単純にIdentifierOptions(normalization = System.Text.NormalizationForm.FormKC).

于 2012-02-10T11:01:09.800 に答える