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

Posted

技术标签:

【中文标题】在 SML Alice 中创建中缀/后缀/前缀解析器【英文标题】:Creating a infix/postfix/prefix parser in SML Alice 【发布时间】:2015-04-27 19:56:51 【问题描述】:

所以我试图在 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 Interpreter Environment 中执行此操作

【问题讨论】:

【参考方案1】:

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

【讨论】:

我不认为你可以在 ML 中实现堆栈 该建议可能会有所帮助,并会做出有用的评论。不幸的是,这不是答案。

以上是关于在 SML Alice 中创建中缀/后缀/前缀解析器的主要内容,如果未能解决你的问题,请参考以下文章

通用编程语言如何解析中缀表达式?

什么是前缀表达式,中缀表达式,后缀表达式

中缀表达式转为后缀表达式(逆波兰式)求值

中缀表达式转为后缀表达式(逆波兰式)求值

前缀、中缀、后缀表达式是怎样的?(程序设计)

前缀,后缀转中缀以及中缀转前缀,后缀