评估算术表达式的语法树

时间:2016-11-28 13:23:09

标签: types eval sml ml

你能帮我完成下一个任务吗? 我应该有一个功能

fun eval (fn : (string * int) list -> expression -> int)

获取元组(variable_name,value)和表达式的列表。该函数使用currying并返回表达式的求值。它应该至少支持表示加法,减法,乘法,整数除法和余数

的运算符+, -, *, /, %

对于下一个数据类型:

datatype expression = Constant of int
                    | Variable of string
                    | Operator of string * expression
                    | Pair of expression list
                    | List of expression list

任何建议或解释都将不胜感激!

1 个答案:

答案 0 :(得分:1)

这是一个骨架:

    String line[]={"https://google.com","https://www.facebook.txt"};
    String extensionToBlock[]={".com",".swf"};

    for (String url:line) {
        for (String ext:extensionToBlock) {
            if (url.endsWith(ext)){
                //url bloc
                System.out.println("not valid url :"+url);
                break;
            }else{
                //url ok
                System.out.println("valid url :"+url);
                //call a function with url ?;
            }
        }
    }

以下是一些想法:

  • 解决问题的方法:将问题分成几个子部分。例如,创建一个在vtable中查找变量的辅助函数是给定的。在单独的辅助函数中处理运算符的好处不那么明显 - 主要是我只是试图避免嵌套 case of of 以便易读。因为数据类型具有太多的灵活性(可以表达,在我看来,无意义的表达),在正确的位置处理这种灵活性似乎也需要在这里进行划分。

  • 如果fun lookup var1 ((var2,value)::rest) = ... | lookup var1 [] = raise Fail ("Variable " ^ var1 ^ " not found") fun eval vtable exp = case exp of Constant i => i | Variable v => lookup ... | Operator (oper, subexp) => evalOp vtable oper subexp | Pair _ => raise Fail "Pair at unexpected position in syntax tree!" | List _ => raise Fail "List at unexpected position in syntax tree!" and evalOp vtable oper exp = let val operands = case exp of ... (* calling eval on sub-expressions allowed *) ... in case oper of "+" => ...add operands... | "-" => ...subtract operands... | ... end 应该始终包含两个操作数,则可以将此部分写为Pair,但如果它们有时会缩减为运算符必须使用的值列表一些关联性假设,可能只是val (op1, op2) = case exp of ...map eval sub_exps是在sub_expsPair中找到的表达式的评估列表。

  • 正如约翰所说,你给出的语法树似乎反映了一些不受欢迎的属性。例如,List是一对奇特的对。 Pair [Constant 1, Constant 2, Constant 3]是什么意思?那么Operator ("-", Pair [Constant 1, Constant 2, Constant 3])呢?当他们同时列出一个列表时,为什么同时拥有Operator ("/", [])PairList什么时候适合?为什么对是合法的表达?他们应该评估什么整数值?

    道德:良好的数据类型只有有意义的价值。

    可能起作用的替代数据类型:

    List

    此数据类型也更容易评估,因为要处理的奇数/错误角点案例更少:

    datatype expression = Constant of int
                        | Variable of string
                        | Operator of string * expression * expression
                 (* or: | Operator of string * expression list *)
    

    不幸的是,您的语法树需要大量探测无效值。

  • 如果这是作业,请记得在源代码中制作正确的版权归属。 ; - )