erlang中如何将中缀转换为后缀?

2024-03-30

我刚刚遇到这个帖子 https://stackoverflow.com/questions/4621151/the-shortest-way-to-convert-infix-expressions-to-postfix-rpn-in-c,相当优雅。

但它没有考虑到不同运营商的优先级。

e.g. *优先级高于+.

So 1+2*(3+2)应转换为1 2 3 2 + * +

考虑到优先级问题,在erlang中如何做到这一点?


这是一种滥用 Erlang 术语内置解析器的方法。您可以通过 yecc 或递归下降编写自己的解析器,但为了简单起见,我将坚持使用 Erlang 解析器。

  -module(foo).
  -compile(export_all).

声明一个模块,从中导出所有内容。如果你想使用它,这是不好的形式。而是尽量减少出口p/1.

 parse(Str) ->    
     {ok, Tokens, _} = erl_scan:string(Str ++ "."),
     {ok, [E]} = erl_parse:parse_exprs(Tokens),
     E.

这个函数滥用了 Erlang 解析器,因此我们可以获得 Erlang 标记的解析树。

 rpn({op, _, What, LS, RS}) ->
     rpn(LS),
     rpn(RS),
     io:format(" ~s ", [atom_to_list(What)]);
 rpn({integer, _, N}) ->
     io:format(" ~B ", [N]).

RPN输出是做后序树遍历。因此,我们基本上遍历树的左侧和右侧,然后将自己输出为节点。 “括号”的顺序抽象地存储在树本身中。优先级由 Erlang 解析器处理。如果需要,您可以通过递归下降解析器轻松完成此操作。但这与“如何在 Erlang 中编写解析器?”的问题不同。答案是双重的:要么使用 leex+yecc,要么使用基于解析器组合器和/或递归下降的解析器。特别是对于如此简单的语法。

 p(Str) ->
      Tree = parse(Str),
      rpn(Tree),
      io:format("~n").

这只是格式化。

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

erlang中如何将中缀转换为后缀? 的相关文章

  • Erlang 可以使用哪些分布式进程注册表?

    我想为 Erlang 编译一个相当完整的分布式进程注册表库列表 此类库需要支持基本操作 例如register name Pid Name and whereis name Name 并且理想情况下registered names 0 名称不
  • erlang 中的错误报告被截断

    警告 erlang n00b 前面 我正在尝试掌握 erlang 并且只是尝试使用牛仔编写一个基本的 hello world 应用程序 我正在模拟一个错误 基本上在代码中的某个位置返回一个无效值 并尝试解释该错误 即 ERROR REPOR
  • Erlang:如何在控制Erlang进程崩溃时使连接的外部操作系统进程自动终止?

    我正在使用 Erlang 端口读取 Linux 进程的输出 我希望每当我连接的 Erlang 进程终止时 Linux 进程就会自动终止 从文档来看 在我看来这应该自动发生 但事实并非如此 最小的例子 将其放入文件 test erl 中 mo
  • 何时“让它崩溃”以及何时捍卫 Erlang 中的代码?

    因此 带着 让它崩溃 的口号 Erlang 代码意味着能够抵御残酷的世界事件 例如意外拔出插头 硬件故障和不稳定的网络连接 另一方面 有防御性编程 https en wikipedia org wiki Defensive programm
  • 分布式erlang安全如何?

    我想要有 2 个独立的 erlang 节点可以相互通信 so node a myhost将能够发送消息至b myhost 有没有办法限制节点a myhost 所以只有来自 a 的函数安全模块可以被召唤b myhost 它应该是这样的 a m
  • 在 Red Hat 上安装 RabbitMQ - 错误的 Erlang 版本

    我正在尝试按照以下说明在 Red Hat Enterprise Linux 7 64 位工作站版本 的评估虚拟机上安装 RabbitMQhttps www rabbitmq com install rpm html https www ra
  • `ejabberdctl start` 导致“内核 pid 终止”错误 - 我该怎么办?

    我用谷歌搜索了三个小时但没有结果 我有一个 ejabberd 安装 但不是使用 apt 安装的 它是从源代码安装的 其中没有名为 ejabberd 的程序 启动和停止 一切都是通过 ejabberdctl 进行的 它完美地运行了一个月 突然
  • rabbitmq-erlang-client,使用 rebar 友好的 pkg,在开发环境上工作在 rebar 版本上失败

    我成功地将rabbitmq erlang client的rebar友好包用于一个简单的Hello World rebarized和OTP 兼容 应用程序 并且在开发环境中工作正常 我能够启动 erl 控制台并执行我的操作applicatio
  • Erlang:如何从体内引用匿名函数?

    In Erlang http en wikipedia org wiki Erlang programming language 有没有办法引用当前正在执行的函数 这对于产生无限循环很有用 spawn fun gt do something
  • Erlang / Golang 端口示例中的缓冲区大小

    我有一个粗略的 Erlang to Golang 端口示例 将数据从 Erlang 传递到 Golang 并回显响应 问题是我可以传输的数据量似乎仅限于 2 8 字节 见下文 我认为问题可能出在 Golang 方面 没有创建足够大的缓冲区
  • 如何在 Erlang 中将 XML 转换为元组列表?

    我正在尝试从 XML 创建键 值对元组 我想从任何嵌套的 XML 中列出一个列表 这似乎是一件很常见的事情 但我找不到任何例子 例如
  • 为什么在 Erlang 中使用 OTP?

    正如问题所说 使用 Erlang 进行开发时 使用 OTP 设计原则会带来什么好处 我正在开发一个仅接收命令并发送响应的服务器 正如 Jonas 所说 OTP 是一组久经考验的设计元素和习惯用法 用于创建容错系统以及其他功能 例如灵活性 实
  • 构建 Erlang 服务器场(用于业余爱好项目)最便宜的方法是什么? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 假设我们有一个 本质上并行 的问题需要用 Erlang 软件来解决 我们有很多并行进程 每个进程都执行顺序代码 不是数字运算 并且我们向它们投入的 C
  • ejabberd如何编译新模块

    Here http www ejabberd im node 2872我找到了代码 erlc I ejabberd 2 1 13 lib ejabberd 2 1 13 include pa ejabberd 2 1 13 lib ejab
  • 与共享数据相比,消息传递的性能损失

    最近有很多关于不使用锁和使用 Erlang 等消息传递方法的讨论 或者关于使用不可变的数据结构 例如函数式编程与 C Java 中的比较 但我关心的是以下几点 AFAIK Erlang 不保证消息传递 消息可能会丢失 如果还要担心消息丢失
  • 有没有办法对默认记录值进行查找?

    给定一个记录 record something id integer name string email undefined string undefined 有没有办法获取字段的默认值 在本例中得到的事实是 something email
  • 终止连接到 erlang 端口的进程

    我想写一个某种主管 我正在尝试实现关闭外部程序的功能 外部进程通过端口连接到 erlang 的代码 我不知道如何通过发送信号或其他任何方式来关闭该程序 关闭端口不是解决方案 因为我已经检查过许多程序不会在 SIGPIPE 上退出 您有任何想
  • Erlang:如何限制分配给进程的内存

    我要问的是是否可以限制分配给特定进程的内存 堆或堆栈 以便该进程不能超过它 也许类似于 process flag min heap size MinHeapSize 但针对最大堆 您可以将某种进程跟踪 gen server 放在一起 定期检
  • Erlang 更好地支持哪种数据库(SQL)?

    你建议我在 Erlang 中使用什么 MySQL 还是 Postgres 哪个数据库有更好 更成熟 更稳定 更快 的 Erlang 驱动程序 The Erlang ODBC 接口 http erlang org doc apps odbc
  • 设置 Emacs 进行 Erlang 编程

    Emacs 是 Erlang 编程的首选 IDE 有很多好的模式 distel erlware mode 默认的 erlang 模式 但是您对设置 Emacs 进行专业 Erlang 开发有何建议 按照中所述设置 erlang mode自述

随机推荐