作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题类似于this one ,但我想使用 OperatorPrecedenceParser
解析带有函数应用程序的表达式在 FParsec
.
这是我的 AST:
type Expression =
| Float of float
| Variable of VarIdentifier
| BinaryOperation of Operator * Expression * Expression
| FunctionCall of VarIdentifier (*fun name*) * Expression list (*arguments*)
board→create_obstacle(4, 4, 450, 0, fric)
let expr = (number |>> Float) <|> (ident |>> Variable)
let parenexpr = between (str_ws "(") (str_ws ")") expr
let opp = new OperatorPrecedenceParser<_,_,_>()
opp.TermParser <- expr <|> parenexpr
opp.AddOperator(InfixOperator("→", ws,
10, Associativity.Right,
fun left right -> BinaryOperation(Arrow, left, right)))
expr
解析器将参数列表解析为表达式列表。我在这里构建了一个解析器,但我不知道如何将它与我现有的解析器结合起来:
let primitive = expr <|> parenexpr
let argList = sepBy primitive (str_ws ",")
let fcall = tuple2 ident (between (str_ws "(") (str_ws ")") argList)
Success: Expression (BinaryOperation
(Arrow,Variable "board",Variable "create_obstacle"))
Success: Expression
(BinaryOperation
(Arrow,
Variable "board",
Function (VarIdentifier "create_obstacle",
[Float 4, Float 4, Float 450, Float 0, Variable "fric"]))
最佳答案
您可以将参数列表解析为标识符的可选后缀表达式
let argListInParens = between (str_ws "(") (str_ws ")") argList
let identWithOptArgs =
pipe2 ident (opt argListInParens)
(fun id optArgs -> match optArgs with
| Some args -> FunctionCall(id, args)
| None -> Variable(id))
expr
喜欢
let expr = (number |>> Float) <|> identWithOptArgs
关于使用 OperatorPrecedenceParser 使用 FParsec 解析函数应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197687/
是否可以使用 OperatorPrecedenceParser 不区分大小写地解析非符号运算符(例如,AND、OR)? 最佳答案 OperatorPrecedenceParser 没有对非符号运算符的
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我需要在使用 FParsec 的 OperatorPrecedenceParsers 解析运算符时产生错误,特别是在映射阶段。假设我有以下代码: let pOperatorExpr : Expre
此代码将读取此输入“(WEEKEND-SUNDAY)”,然后返回“SATURDAY” 但是输入“WEEKEND-SUNDAY)”仍然返回“SATURDAY”=>这个解析器忽略最后一个')' let p
我正在实现一个解析器,它为我的一个项目实现特定领域的特定语言。 我遇到困难的一个方面是制作一个表达式(使用 FParsec 的 OperatorPrecedenceParser 实现)使得整个表达式是
我是一名优秀的程序员,十分优秀!