问题标签 [shunting-yard]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
168 浏览

objective-c - NSString:componentsSeparatedByCharactersInSet 包含

tokens返回:

[@“4”,@“23”,@“54”,@“543”,@“23”]

我正在尝试在 Objective-C 中实现 Shutting Yard。如何使用运算符集标记中缀字符串而不从标记化中删除运算符集本身?

我需要的:

[@"4"、@"+"、@"23"、@"-"、@"54"、@"/"、@"543"、@"*"、@"23"]

0 投票
1 回答
3918 浏览

function - 带函数的调车场算法

我在这里的第一篇文章:)

我看到有很多关于调车场算法的问题,但我希望仍然有论坛成员有兴趣帮助我解决关于这个算法的另一个问题。

我确实搜索了其他帖子,看看我的答案是否已经得到回答,我在其他论坛和互联网上做了一些研究:

我的代码是用 vb-script 编写的,因为我喜欢它的简单性,而且我不懂 java 或 c 之类的语言..

我的问题:

目前该算法允许错误使用“(”和“)”示例:函数((10,20,)30)是允许的,但它显然不是调用函数的正确方法..

我也不确定我的代码是否正确编写,来自维基百科的伪代码是我的参考,但不是很清楚:(

我还计划用 if-else 语句和嵌套循环之类的东西来扩展它,因为主要目标是用类似 vb 的语言编写某种解释器作为学习项目:)

我的代码[编辑]:

0 投票
1 回答
948 浏览

c++ - 将字符串分配给 stack.top() 时出现分段错误

我一直在研究一个可以接受复杂数学表达式的基本计算器,例如:(2-4)*7/(3/4) 等

我正在使用调车场算法的实现......

我在Linux操作系统上。使用 gdb 调试器,我将分段错误隔离到一个函数。使用 cout 语句,我将其进一步隔离到一行..但是我无法理解为什么这条线给了我一个段错误..我将在稍后提供更多关于确切位置的信息,首先这里是一些代码..

std::cout << "10\n";调用时发生段错误std::string topToken = st.top();

我会给出一些输入/输出

输入:(8*2) 输出:1 2 9 2 3 4 8 2 3 4 5 6 8 2 10 11 13 14 2 10 segfault (core dumped)

输入:(4/4) 输出:1 2 9 2 3 4 8 2 3 4 5 6 8 2 10 11 13 14 2 10 segfault (core dump)

我还运行了一些测试,我可以在这里轻松发布,但老实说,它们变得非常多余。如果你们想看到更多,你只需要问,我会很乐意提供更多。但是我觉得这两个应该提供足够的信息......

我知道段错误发生在哪里,并且我有预感为什么......所以如果有人能向我确认为什么会发生错误,那就太好了,任何解决问题的方法都将不胜感激。

PS:代码中的任何错别字都是错别字!我通过重新输入来复制代码,因为我在 Linux 操作系统上编码,但我拥有一台电脑。话虽如此......代码编译没有错误,任何拼写错误的术语都是拼写错误!

再次感谢

编辑:在给它几天并回到这个之后,我对代码进行了更多测试。这次使用不带括号的方程。

输入:3-9 输出:1 2
3 8 2 3 4 5 7 8 17 19 20 segfault (core dump)

输入:6/8 输出: 1 2 3 8 2 3 4 5 7 8 17 19 20

所以我在打电话时也遇到了段错误strArray.assign( out.begin(), out.end() );

0 投票
3 回答
992 浏览

javascript - 带不必要括号的调车场算法

输入(在 javascript 中)是“3-2+(8-3)”

我想将此表达式翻译为反向波兰表示法。但是,根据算法,我可以得到“3 2 8 3 - + -”,它不会评估结果 12 ..... 有什么解决方法吗?我知道括号在这里是不必要的,但是,哦,好吧......我的功能如下:

0 投票
0 回答
239 浏览

c++ - 调车场功能定义

有人对向基于 Shunting-Yard 的解析器添加函数定义支持有任何见解吗?

单语句定义很简单。我可以修改我的解析器以在块内递归(这非常模糊!)以将函数定义作为子程序处理,但这感觉就像一个杂物。

有更好的解决方案吗?

更新

因此,我设法通过很少的修改来实现它。SY 阶段将两者都{}入堆栈。

当解析器(管道中的下一阶段)遇到{(blockstart)时,它会创建一个新的Block(AST)结构并将其推送到 RPN 堆栈上。当解析器到达 a}时,它会创建一个 AST 节点向量,并弹出堆栈直到遇到 a Block。此时,在块结束和块开始之间遇到的节点向量被添加到块的表达式(语句)集合中。

当解析器到达堆栈上的块时,它会检查下一个(堆栈上较低的)节点是否是函数调用。如果是,则弹出函数调用,创建函数定义节点,并使用先前生成的块和调用来定义函数。

这都是一个非常模糊/半无用的描述 -我将尝试写一个详细的解释并将其发布在某个地方

0 投票
2 回答
316 浏览

java - 在调车场算法中实现变量识别

这是对这个问题的跟进。在这一点上,我希望程序自己识别变量,然后向用户询问变量值 .so 而不是看起来像:

该程序的功能应如下所示:

所以用户不再需要告诉机器变量是什么。怎么能做到这一点?

我已经检查了这个问题,但它与我需要的完全不同,而且它也在 python 中

更新:特别是我想迭代调车场算法,以便它可以找到变量。我在 http://paste.ubuntu.com/9999494/下面放了一个解析器代码的链接

0 投票
0 回答
233 浏览

function - 带函数调试的调车场算法

我想在运算符旁边的调车场算法中实现“功能”,并从结果算法中制作一个小解释器,但默认算法会忽略语法错误的令牌使用。

有没有人写过解释器(或不写)想帮助我?这将帮助很多被这个问题困扰的人!

这里列出了一些测试,分流场函数忽略了函数调用中令牌的错误使用和/或缺少运算符/操作数:

我读到的一些研究:

对我的代码(vbscript)的解释以通过一些改进来测试它:

如果有人想分享那里的改进或有任何好的想法,请告诉我!

我的代码:

[编辑] 我希望我的解释器的语法与 BASIC 编程语言几乎完全相同。

类似 BASIC 的表达式示例:a + b * (c / func(x, y, func(z))) - d

语法错误表达式的示例:1 + 2 + + 3 3 func(,1,(,2)) ()

我的目标: 调车场算法的输出应该是正确的顺序,如果遇到语法问题应该有一个错误:空括号“()”或多个运算符/函数/整数彼此或错误的括号不允许在函数调用...

到目前为止,如果您以正确的方式键入表达式,则函数、整数和运算符的顺序是正确的!

如果它在 vbscript 本身中工作,它应该在这个算法中工作,如果不是,那么它不应该在这个脚本中工作,你得到一个错误......这就是我在这里想要做的......

我希望语法如何:(在“[]”之间表示可选,“;”是注释,在“##”之间是带有该标题的描述的链接......)

0 投票
1 回答
658 浏览

c++ - C++ 数学表达式解析器问题

由于某种原因,我无法让我的代码正常工作。它总是抛出 Thread 1: EXC_BAD_ACCESS (code=EXC_1386_GPFLT) 错误。当我使用简单的字符串进行测试时,它也没有正确放置“+”号:(3+4)。队列应该看起来像:34+,但它持有 3+4。在我看来,“+”运算符永远不会被压入堆栈。谁能帮我找到我应该关注的重点?

0 投票
4 回答
878 浏览

algorithm - 如何在将中缀表达式转换为反向波兰符号时计算方法的参数数量

我有一个像下面这样的表达。MIN(MAX(AVG(AVG(4,2),2,3),SUM(1,2))) 我已经实现了调车场算法来将中缀转换为反向波兰符号。我用两个参数添加了函数 MAX 、 MIN 和 AVG 。但是假设如果我想实现可变参数,那么我必须知道每个函数在中缀表达式中有多少个参数。有人可以告诉我如何修改调车场算法以包含否。将中缀转换为 rpn 时每个函数的参数?

0 投票
2 回答
603 浏览

java - Java中的Shunting-Yard算法实现给出不正确的输出和字符串索引超出范围?

我正在实现 Shunting-Yard 算法并评估结果 这是一个使用节点(一个用于运算符,一个用于操作数)和堆栈(一个用于运算符,一个用于操作数)的基于引用的实现。


输入文件包含(仅前几行):

输出:

主要的:

操作数堆栈(也是运算符堆栈之一。相同,只是使用 char 而不是 int):

节点(也是操作数/整数之一):

算法如下:

初始化运算符堆栈以包含“;” (堆栈运算符的底部)

获取第一个令牌

虽然没有到达表达式的结尾

如果令牌是操作数,那么

打印令牌

将操作数压入操作数堆栈

否则,如果令牌是 ')' 那么

而运算符栈顶不等于'('</p>

弹出操作符堆栈

打印运算符

弹出操作数堆栈两次

对两个操作数应用指定的操作

将运算结果压入操作数栈

结束时

弹出“(”并丢弃它

别的

而 inputPriority(token) ≤ stackPriority(操作栈顶)

弹出操作符堆栈

打印运算符

弹出操作数堆栈两次

对两个操作数应用指定的操作

将运算结果压入操作数栈

结束时

将令牌推入操作员堆栈

获取下一个令牌

结束时

而运算符栈顶不等于';'</p>

弹出操作符堆栈

打印运算符

弹出操作数堆栈两次

对两个操作数应用指定的操作

将运算结果压入操作数栈

结束时

弹出操作数堆栈并打印结果

任何帮助表示赞赏。