3

別の文字列から単純な文字列を解析するにはどうすればよいですか。

FParsec チュートリアルには、次のコードが示されています。

let str s = pstring s
let floatBetweenBrackets = str "[" >>. pfloat .>> str "]"

バケット間のフロートを解析したくはありませんが、式内の文字列を解析したくありません。

通り。お気に入り:

Location := LocationKeyWord path EOL

ヘルパー関数が与えられた場合

let test p s =
    match run p s with
    | Success(result,_,_)  -> printfn "%A" result
    | Failure(message,_,_) -> eprintfn "%A" message

そしてパーサー関数:let pLocation = ...

電話するとtest pLocation "Location /root/somepath"

印刷する必要があります"/root/somepath"

私の最初の試みは、チュートリアル コードを次のように変更することでした。

let pLocation = str "Location " >>. str

しかし、これは私にエラーを与えます:

Error 244   Typeerror. Expected:
    Parser<'a,'b>    
Given:
    string -> Parser<string,'c>  
The type CharStream<'a> doesn't match with the Type string
4

1 に答える 1

5

str定数文字列を照合/解析するように設計されているため、パスでは機能しません。str定数に対してはうまく機能し"Location "ますが、パス部分にもパーサーを提供する必要があります。それが何であるかを指定しないので、ここでは任意の文字を解析するだけの例を示します。

let path = manyChars anyChar
let pLocation = str "Location " >>. path
test pLocation "Location /root/somepath"

パスに対して別のパーサーが必要になる場合があります。たとえば、これは改行またはファイルの終わりまでのすべての文字を解析するため、多くの行を解析できます。

let path = many1CharsTill anyChar (skipNewline <|> eof)

スペースを受け入れない、または引用符で囲まれたパスなどを処理しない他のパーサーを作成できます。

于 2014-05-12T14:58:43.063 に答える