当前位置: 首页 > 知识库问答 >
问题:

在SML Alice中创建中缀/后缀/前缀解析器

柯浩壤
2023-03-14

因此,我试图在SML中创建一个解析器程序,提示用户输入表达式。然后,它会告知输入的表达式是后缀、前缀还是中缀,然后显示结果。下面是我希望它做的一个示例:

Enter Expression: "* + 2 3 4"

Postfix: 2 3 + 4 *
Prefix: * + 2 3 4
Infix: (2 + 3) * 4

*
\-- +
    \-- 2
    \-- 3
\-- 4

我在创建函数时遇到了麻烦,这样它就会向屏幕输出结果,我不确定我是否正确地执行了该方法。在我首先计算出转换之前,我甚至不会专注于输出树。

fun infix_postfix(PostfixString,operatorStack,expList) = 
  if null expList then operatorStack
    else    
      if(hd expList = #"^" orelse
        hd expList = #"*" orelse
        hd expList = #"/" orelse
        hd expList = #"+" orelse
        hd expList = #"-" =  true)
        then 
          hd expList:: operatorStack
       else
          infix_postfix(hd expList :: PostfixString, operatorStack, tl expList);

val x = "+12";
val expList = (explode x);
val PostfixString = [];
val operatorStack = [#"a"];
infix_postfix(PostfixString, operatorStack, expList);

我觉得我应该在第二个if语句中放一个递归方法(检查与运算符是否相等),但由于Alice SML语法的限制,我不允许这样做。任何帮助都将不胜感激,我的方向是否正确?

val infix_postfix : char list * char list * char list -> char list = _fn
val x : string = "+12"
val expList : char list = [#"+", #"1", #"2"]
val PostfixString : 'a list = []
val operatorStack : char list = [#"a"]
val it : char list = [#"+", #"a"]

仅供参考:我正在Alice解释器环境中进行此操作

共有1个答案

傅茂实
2023-03-14

我看到你确实取得了一些进展,我建议在你的方法中使用堆栈

 类似资料:
  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 我在互联网上搜索了一个很好的实现,它不是把数字表达式,而是把变量表达式从中缀符号转换成前缀和后缀。我做的所有搜索都没有成功。基本上,我想看看PHP中是否有任何实现,这样我就可以修改它以支持更多的操作符,而不仅仅是(-,*,=)。 例如转换: 同时保留变量名,不必输入数字进行计算。

  • 对于类,我们的任务是使用“抽象中的双链接列表堆栈实现”将中缀表达式转换为后缀。我能够编写一个使用堆栈进行转换的程序,但是双链表的用途是什么?我们将向列表中添加哪些信息节点? 这是作为示例提供给我们的堆栈类。为什么下一个变量是Stack类型?不应该是节点吗? 如果我创建双向链表和节点类,节点对象中有什么数据?

  • 我的讲师给了我一个任务,创建一个程序,使用堆栈将中缀表达式转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个名为inToPos(charstring[])的函数正在创建断点,该函数负责使用堆栈将字符串中缀中的中缀表达式转换为字符串后缀中的后缀表达式。你们能帮帮我,告诉我我做错了什么吗? 这些是我的代码,非常需要您的帮助:) 注:inToPos功能是使用以下算法实现的: 从左到右扫描中

  • 我写了一个中缀式转化为后缀式,前缀式,并计算出中前后缀式结果的代码,但是在确保输入格式正确后(我输入的是:11+22*(9-6)/3#),输出为:Have no target!!,我想了好久,觉得是输入的式子没有办法入栈,但是找不出来哪里有问题,能帮我看一下是哪里的问题吗?谢谢各位大佬! 以下是我的代码: 主函数中将 改为 输出变成了“The Sqstack2 is empty!” 试过修改ini