2

私はF#とFParsecに慣れていないので、これまでに得たものを見せて困惑することすらしたくありません。

FParsecの例では、ASTのすべてのタイプ(私が見る)は、単一の値、リスト、またはタプルのタイプの省略形です。

たとえば、解析された関数名とそのパラメーターを保持することになっている複合型がある場合はどうなりますか?

したがって、文字列メンバーとリストメンバーを持つf(a, b, c)タイプのオブジェクトに解析されます。一致するパーサーからどのようにすればよいですか?PFunctionNamePParameterParametersf(a, b, c)|>>PFunction

これまでにできることは、複合パーサーを作成することだけですが、それを何にも変えることはできません。電卓の例は、Termのようなタイプを含むASTを作成した場合も同様ですが、代わりに、パーサーではなくインタープリターのように見えるため、ASTはありません。その上、Termはおそらく他のタイプの省略されたコンポーネントのタプルにすぎません。

ありがとう!

4

3 に答える 3

3

私はこれがあなたが探しているものだと思います:

let pIdentifier o =
    let isIdentifierFirstChar c = isLetter c || c = '_'
    let isIdentifierChar c = isLetter c || isDigit c || c = '_'
    many1Satisfy2L isIdentifierFirstChar isIdentifierChar "identifier" <| o

let pParameterList p = 
    spaces >>. 
        pchar '(' >>. spaces >>. sepBy (spaces >>. p .>> spaces) (pchar ',') 
            .>> spaces .>> pchar ')'

type FunctionCall(Name: string, Parameters: string list) =
    member this.Name = Name
    member this.Parameters = Parameters

let pFunctionCall o= 
    pipe2 (pIdentifier) (pParameterList pIdentifier) (fun name parameters -> FunctionCall(name, parameters)) <|o
于 2011-12-16T15:19:24.220 に答える
0

これは完全に工夫されていますが、|>>の代わりにpipe2を使用すると、次のようになります。

type FunctionCall(Name: string, Parameters: string list) =
    member this.Name = Name
    member this.Parameters = Parameters

let pFunctionCall = 
    pipe2 (pIdentifier) (pstring "(" >>. pParameterList .>> pstring ")") (fun name parameters -> FunctionCall(name, parameters))
于 2011-12-16T14:28:44.197 に答える
0

ダニエルが述べたように、機能的な答えは、識別された共用体を使用することです。FParsecには、状態モナドのように使用できるUserStateもあるため、実際に複合型に直接解析する場合は、それを使用できます。[1]

[1] http://cs.hubfs.net/topic/None/60071

于 2011-12-16T16:20:40.203 に答える