我试图将我的语法定义为一个有区别的联盟.它有两种可能:int与datetime和mathemetical运营商Add和Mul.
Add适用于int和datetime(如加在INT天)
Mul只在工作int,而不是datetime
语法可以递归
我的语法看起来像
type MyExpression =
|Integer of int
|Date of datetime
|Add of MyExpression * MyExpression
|Mul of MyExpression * MyExpression
Run Code Online (Sandbox Code Playgroud)
我编写了一个解析器(fparsec),它可以解析我的语法中的文本,但我不知道如何处理Mul可递归的条件,但仅限于Integer.
是否可以选择在我的MyExpression类型上定义此限制,还是必须在我的解析输入中处理此问题?
我正在创建一个带有多个受歧视联盟(DU)的简单DSL.有积木DU和较高的DU建立在较低的顶部之上.
现在我想创建UI,用户可以在其中构建与我的DSL匹配的文本.到UI我不想表达我的完整语法,但只显示可以执行的操作.所以我需要一种方法来从我的层次结构DU中找出用户可以做的其他可能状态.
示例输入文本 (1 + (2 * 3))
type Expression =
| Constant of int
| Add of Expression * Expression
| Mul of expression * Expression
Run Code Online (Sandbox Code Playgroud)
所以当用户启动时,我必须返回一个只能Constant使用的列表.当用户将(常量)作为当前状态传递时,我必须告诉你可以add/Mul(这是表达式)等等.
我想用一种类型安全的方式表示一种结构,它表示当前状态和可能的状态.有没有办法在f#中解决这类问题
在尝试解析时{asdc,456,ghji,abc},我跑了
run specialListParser "{asdc,456,ghji,abc}"
Run Code Online (Sandbox Code Playgroud)
解析器失败了
错误发生在输入流的末尾.
期待:任何不在',',','或'}'中的字符
我根据这个答案定义了我的解析器:
let str : Parser<_> = many1Chars (noneOf ",")
let comma = pstring ","
let listParser = sepBy str comma
let specialListParser = between (pstring "{") (pstring "}") listParser
Run Code Online (Sandbox Code Playgroud)
我错过了什么?