F# 使用FParsec解析变量声明
我试图用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
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))