使用 OperatorPrecedenceParser 通过 FParsec 解析函数应用程序?

2024-03-27

问题类似于this one https://stackoverflow.com/questions/7199589/parsing-method-arguments-with-fparsec,但我想使用函数应用程序来解析表达式OperatorPrecedenceParser in 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 like

let expr = (number |>> Float) <|> identWithOptArgs
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OperatorPrecedenceParser 通过 FParsec 解析函数应用程序? 的相关文章

随机推荐

  • 将 ENGINE 上下文附加到 SSL_CTX

    我想知道是否有可能附加一个ENGINE 实施到SSL CTX and or SSL 结构 我想要实现的是拥有一个SSL CTX 将使用 OpenSSL 中内置的默认加密操作和另一个设置SSL CTX 将使用专用 HSM 作为加密层 我可以通
  • Ext.data.Store getTotalCount() 加载后不计算

    我的商店在调用时并不总是返回正确数量的记录getTotalCount 这个问题出现在我之后load 商店 我知道在检查时商店里有记录 我正在使用 ExtJs 4 1 3 this grid reference to my grid var
  • Swift:使用未声明的类型

    我正在实现一个类 但出现此错误 使用未声明的类型 myProtocol 这是我的代码 class LocalContactService myProtocol 你们中有人知道为什么我会收到此错误吗 我遇到了同样的错误 在我的情况下 我意外地
  • shinyapps setAccountInfo 错误

    当我尝试配置我的shinyapps根据以下指南在 my shinyapps io 上注册帐户信息https github com rstudio shinyapps blob master guide guide md https gith
  • Excel VBA - 将图表保存为 GIF 文件

    编程不是我的主要工作职能 但似乎是我所认为的瑞士军刀 我的任务是在 Excel 中制作一个 VBA 宏 将图形导出到 gif 文件 以便自动更新我们制造工厂的信息屏幕 我有一个可以工作的宏 但是 它有时会失败并创建一个具有正确文件名但 空
  • 实体框架中实体之间的复杂关系

    也许它是重复的 但我找不到任何这样的主题 我正在使用实体框架 数据库中有两个表 public class A public virtual B B1 get set public virtual B B2 get set public cl
  • ORA-01722: 实体框架上的编号无效

    我正在从 Oracle DB 执行一个存储过程 即 PROCEDURE GET TIM USER CUSTO P ANOMES IN VARCHAR USER CUSTO OUT SYS REFCURSOR IS BEGIN OPEN US
  • 如何从特定的目标文件生成特定的二进制文件?

    这是我的 makefile 我在 obj 目录中有目标文件 我需要将它们编译成 bin 文件夹中的二进制文件 但不知何故它无法按我希望的方式工作 有什么想法吗 SOURCES wildcard c OBJECTS patsubst c o
  • 安卓用C++还是Java?

    我正在考虑在空闲时间学习 Android 开发 我发现 Java 和 C 都可以进行开发 但后者是有限的 我对 C 更加满意 所以我的问题是 Android 上的 C 存在哪些限制 我能够用它开发完整的应用程序吗 还是我最终必须学习 Jav
  • C 中数组的理想数据类型

    我想存储键和可变大小数组之间的静态关联 foo gt bar awe foo2 gt bar2 awe2 gruh 该数组在程序执行期间永远不会改变 它只是将字符串变量数组与字符串键静态关联的一种方法 子阵列的数量非常少 我怎样才能纯粹地做
  • 等待 .forEach() 完成的最佳方法

    有时我需要等待 forEach 方法来完成 主要是 加载器 功能 这就是我这样做的方式 q when array forEach function item iterate on something then function contin
  • Google 地图 v3 折线工具提示

    谷歌地图标记对象 google maps Marker 有一个 title 属性 因此当用户将鼠标移到标记上时 会显示一个简单的工具提示 折线 google maps Polyline 上没有标题属性 有没有办法可以在 V3 中做到这一点
  • 如何使用谷歌脚本打开位于谷歌驱动器文件夹中的Excel文件?

    我需要打开给定的谷歌驱动器文件夹中的 Excel 文件并读取其数据 为此 我使用了以下代码 var folders DriveApp getFoldersByName Test Folder var foldersnext folders
  • 结构或联合中的“unsigned temp:3”是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 这段C 代码是什么意思 https stackoverflow com questions 1604968 what does this c code mean 我正在尝试使用 JNA 将 C 结构映
  • 根据两者的坐标选择某个位置的设备并对其进行计数

    通过使用 SQL 地理的 STContains 函数 可以计算一组坐标是否在一个区域内 https stackoverflow com questions 64453530 match location between coordinate
  • str.split() 返回的 Pandas 排序列表

    给定 str 类型的 Pandas Series 我想对 str split 返回的结果进行排序 例如 给定系列 s pd Series abc def ghi ghi abc 我想得到 s2 pd Series abc def ghi a
  • 如何监听 Flutter 中 platformBrightness 的变化?

    我正在设置一个系统 当用户将系统主题更改为深色模式时 它会更改主题 并且使用 Flutter 它运行得很好 但是 当用户更改系统主题时 系统导航和状态栏不会改变其颜色 我在构建方法内的主页上运行了代码 但这似乎没有做到这一点 这是主页构建方
  • jQuery Panzoom 插件将图像定位在右侧,包含:'invert'

    我正在尝试使用jQuery 全景缩放 https github com timmywil jquery panzoom插件 基本上都很好 除了 我希望最初缩放大图像以适合容器 并且有contain invert 已启用 我已经适应了这个例子
  • Windows 批处理:杀死进程

    我正在运行多个具有相同名称的进程 我希望有一个选项可以从批处理脚本中杀死它们 我需要一些与 unix shell 命令非常相似的东西 kill 9 ps axuw grep MY PROCESS NAME awk print 2 有什么建议
  • 使用 OperatorPrecedenceParser 通过 FParsec 解析函数应用程序?

    问题类似于this one https stackoverflow com questions 7199589 parsing method arguments with fparsec 但我想使用函数应用程序来解析表达式OperatorP