F# 使用FParsec解析变量声明

F# 使用FParsec解析变量声明,f#,parsec,fparsec,F#,Parsec,Fparsec,我试图用FParsec解析一个变量声明。我读了部分教程,也读了一些。 以下是可以扫描的内容: let [identifier] = [value]; let [identifier] [: type] = [value]; let [identifier] = [new [type(constructor)]]; 例如: let foo = 9; let foo: Integer = 9; let foo = new Integer(9); let foo(a, b) = a + b; le

我试图用FParsec解析一个变量声明。我读了部分教程,也读了一些。 以下是可以扫描的内容:

let [identifier] = [value];
let [identifier] [: type] = [value];
let [identifier] = [new [type(constructor)]];
例如:

let foo = 9;
let foo: Integer = 9;
let foo = new Integer(9);
let foo(a, b) = a + b;
let foo(a: Integer, b: Integer = 0) -> Integer = a + b;
但是
foo
也可以使用参数,例如:

let foo = 9;
let foo: Integer = 9;
let foo = new Integer(9);
let foo(a, b) = a + b;
let foo(a: Integer, b: Integer = 0) -> Integer = a + b;
基本上,
let
指令与F#指令相同,只是参数在括号中,没有块,只有一个表达式

在本教程中,它实现了一个C#变量,例如:

let pdefine = pipe2 (pidentifier .>> ws1) (pidentifier)
                (fun ty name -> Define(ty,name))

let pdefinition = pdefine |>> fun d -> Definition(d)

但我不知道如何实现我的版本,它看起来更复杂。。。。如果有人能给我一条线索,或者一个能更清楚地解释如何做的链接,这会对我有很大帮助。

你可以用这个例子:

open FParsec
open System

let str = pstring
let ws = spaces

type VarType = 
    | Implicit
    | Explicit of string

type Value = 
    | IntValue of int
    | TypeConstructor of string * Value

type LetDeclr = LetDeclr of string * VarType * Value

let isValidChar c =
    ['A'..'Z'] @ ['a'..'z']
    |> Seq.exists (fun ch -> ch = c)

let identifierParser = manySatisfy isValidChar

let value, valueRef = createParserForwardedToRef()

do valueRef := choice [
    str "new" >>. ws >>. identifierParser >>= fun typeName ->
        ws >>. between (str "(") (str ")") value |>> fun typeValue ->
             TypeConstructor(typeName, typeValue)
    pint32 |>> IntValue
]

let parser = 
    str "let" >>. ws >>. identifierParser
    >>= fun identifier ->
    attempt (ws >>. str ":" >>. ws >>. identifierParser |>> Explicit) <|> (ws >>% Implicit )
    >>= fun varType ->
    ws >>. str "=" >>. ws >>. value
    |>> fun varValue -> LetDeclr(identifier, varType, varValue)
    .>> ws .>> str ";"

let parse = FParsec.CharParsers.run parser

parse "let foo = 9;"
parse "let foo: Integer = 9;"
parse "let foo = new Integer(new String(344));"
打开FParsec
开放系统
设str=pstring
设ws=spaces
类型VarType=
|含蓄的
|字符串的显式
类型值=
|int的int值
|字符串*值的类型构造函数
类型LetDeclr=字符串*VarType*值的LetDeclr
让isValidChar c=
['A'..'Z']@['A'..'Z']
|>序列存在(乐趣通道->通道=c)
让identifierParser=many满足isValidChar
let值,valueRef=createParserForwardedToRef()
do valueRef:=选择[
str“new”>>.ws>.identifierParser>>=有趣的类型名->
ws>>.between(str“(”)(str“)”)值|>>趣味类型值->
TypeConstructor(typeName、typeValue)
pint32 |>>IntValue
]
让解析器=
str“let”>>。ws>>。识别器
>>=有趣的标识符->
尝试(ws>>.str):“>>.ws>>.identifierParser |>>显式)(ws>>%隐式)
>>=有趣的类型->
ws>>。str“=”>>。ws>>。价值
|>>fun varValue->LetDeclr(标识符、varType、varValue)
.>>ws.>>str“
让parse=FParsec.CharParsers.runparser
解析“让foo=9
解析“let foo:Integer=9
解析“let foo=新整数(新字符串(344))