递归调车场算法

Recursive shunting yard algorithm

大家

我正在尝试使用 实现简单算法“调车场”(将中缀解析为后缀表示法) SML标准 ML

fun parseToRPN(input:string) = 
    let
        val _input =  explode input
        val digits = [#"0", #"1", #"2", #"3", #"4", #"5", #"6", #"7", #"8", #"9"]
        val stack = []
        val output = []
        exception Empty

        fun member(n:char, nil) = false
        | member(n:char, h::t) = if n = h then true else member(n:char, t);

        fun parse(nil) = raise Empty
        | parse(h::t) = if member(h, digits) then h::parse(t) 
                        else if h = #"(" then   ???                 
    in
    ...
    end

但我不知道如何在 SML 中推送到堆栈。 有人可以给一些提示吗! 谢谢!

堆栈作为附加参数传递给 parse。您还需要传递累积的 RPN。

虽然shunting-yard算法通常被描述为一种中缀转后缀的算法,但它实际上只是一种解析算法;您可以直接评估中缀表达式或从中创建解析树,而不是执行中缀→后缀。如果你选择后者,那么你可以使用一个单一的堆栈,它是一个堆栈的部分解析树(森林,换句话说);在算法结束时,如果输入在语法上是正确的,堆栈将由一个可以返回的解析树组成。