2012-02-10 8 views
0

私はユニコード記号を消費する識別子名用のパーサーを実装しています。ここでFParsecでOperationPrecedenceParserの演算子で識別子パーサーを停止する方法はありますか?

time→sleep(7); 

矢印記号は、私が追加中置演算子です:私は、例えば、また、Unicodeの記号で書かれており、これらは、識別子の後に直接配置される可能性がありますいくつかの演算子を持っている私が直面しています問題があります私の演算子の優先順位パーサに:私はちょうど自動的OPPに演算子として追加されたすべての記号の組み合わせを除外することができれば

opp.AddOperator(InfixOperator("→", ws, 10, Associativity.Right, 
     fun left right -> BinaryOperation(Arrow, left, right))) 

それはいいだろう。現時点では、私の識別子に以下の実装を手動で使用します:

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パーサーの停止を行うことができますか?

答えて

3

isAsciiIdStartおよびisAsciiIdContinueは、識別子に有効なASCII文字を指定するためのものです。 identifierパーサによって受け入れられる非ASCII文字は、事前チェックを通過したものであり、有効なUnicode XID文字です。

シンボリック演算子は有効なUnicode XID識別子文字ではないため、単にIdentifierOptions(normalization = System.Text.NormalizationForm.FormKC)を使用できます。

関連する問題