1

我花了一天时间尝试一个简单的编译器程序,但仍然难以理解这个函数。

let rec expression tokens = 
  let (trm, tokens') = term tokens in 

这里 so (trm, tokens') 是一个元组, term 是一个函数还是一个变量?元组如何=两个变量或一个函数

  expTail trm tokens'

and
  expTail trm tokens = 
  match tokens with
    Tokenizer.PlusTok::tokens' ->
      let (trm', tokens'') = term tokens' in expTail (Plus(trm, trm')) tokens''

  | Tokenizer.MinusTok::tokens' ->
      let (trm', tokens'') = term tokens' in expTail (Minus(trm, trm')) tokens''

  |  _ -> (trm, tokens)

这条线是什么意思?它似乎没有调用任何东西。为什么现在是 (trm, tokens) 而不是 (trm', tokens'')

and
  term tokens = let (trm, tokens') = factor tokens in termTail trm tokens'

也不确定这条线是什么意思。

and
  termTail trm tokens =
  match tokens with
    Tokenizer.TimesTok::tokens' -> 
      let (trm', tokens'') = factor tokens' in termTail (Times(trm, trm')) tokens''

  | Tokenizer.DivTok::tokens' -> 
      let (trm', tokens'') = factor tokens' in termTail (Div(trm, trm')) tokens''

  | Tokenizer.ModTok::tokens' -> 
      let (trm', tokens'') = factor tokens' in termTail (Mod(trm, trm')) tokens''

  | _ -> (trm, tokens)

and
  factor tokens =
  match tokens with
  Tokenizer.LParenTok::tokens' -> 
  let (expr, tokens'') = expression tokens' in
      (match tokens'' with
      Tokenizer.RParenTok::tokens''' -> (expr, tokens''')
  | _ -> raise (Syntax "Bad factor, failed to find )\n")) 

  | (Tokenizer.IntTok i)::tokens' -> (Bits i,  tokens')

  | _ -> raise (Syntax ("Bad factor."))

多谢你们!

4

1 回答 1

1

这些都是非常基本的问题。从 OCaml 教程开始可能会很好(也许请参阅之前的 SO 问题OCaml 资源?)。

一些答案:

let (trm, tokens') = term tokens

这将调用一个名为term传递的函数tokens作为参数。结果是一对。您将通过 name 引用对的第一个元素,通过 name 引用第二个trm元素tokens'

and
   term tokens = let (trm, tokens') = factor tokens in termTail trm tokens'

这些是定义term上面调用的函数的行。

  |  _ -> (trm, tokens)

这是模式匹配的默认情况。如果其他两种模式都不匹配,则此替代方案给出该值。这基本上是一个值,而不是函数调用。然而,从某种意义上说,其中涉及到一个函数——你正在构建一对。逗号 ( ,) 用作构造对的好语法。(括号实际上是可选的,尽管在风格上我喜欢看到它们。)

名称tokenstokens'只是不同的名称。它们之间没有内在的联系。在这种默认情况下,没有定义命名tokens'的值。所以这里不可能引用这样的值。按照惯例,在名称末尾添加“撇号”用于表示新值是从旧值派生而来的。

于 2012-10-20T19:21:48.267 回答