home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / SML⁄NJ 93+ / Documentation / examples / textbooks / four_lectures / parser.sml < prev    next >
Encoding:
Text File  |  1995-12-30  |  9.3 KB  |  93 lines  |  [TEXT/R*ch]

  1.       ParseExprTail(RECDECLexpr(ident, binding, scope),
  2.                                         tail')   |
  3.                        (_, tail') => syntaxError(tail')
  4.                    )   |
  5.                 (_, tail) => syntaxError(tail)
  6.              )   |
  7.  
  8.           ParseExpr(TokIF :: rest) =
  9.              (case ParseExpr(rest) of
  10.                 (ifpart, TokTHEN :: tail) =>
  11.                    (case ParseExpr(tail) of
  12.                       (thenpart, TokELSE :: tail') =>
  13.                          let val (elsepart, tail'') = ParseExpr(tail')
  14.                          in  ParseExprTail(CONDexpr(ifpart, thenpart, elsepart),
  15.                                            tail'')
  16.                          end   |
  17.                       (_, tail) => syntaxError(tail)
  18.                    )   |
  19.  
  20.                 (_, tail) => syntaxError(tail)
  21.              )   |
  22.  
  23.           ParseExpr(TokFN :: TokIDENT(ident) :: TokARROW :: rest) =
  24.              let val (body, tail) = ParseExpr(rest)
  25.              in  ParseExprTail(LAMBDAexpr(ident, body), tail)
  26.              end   |
  27.  
  28.           ParseExpr(junk) = syntaxError(junk)
  29.  
  30.           and ParseExprTail(E, TokPLUS :: tail) =
  31.                  let val (E', tail') = ParseExpr(tail)
  32.                  in  ParseExprTail(SUMexpr(E, E'), tail')
  33.                  end   |
  34.  
  35.               ParseExprTail(E, TokMINUS :: tail) =
  36.                  let val (E', tail') = ParseExpr(tail)
  37.                  in  ParseExprTail(DIFFexpr(E, E'), tail')
  38.                  end   |
  39.  
  40.               ParseExprTail(E, TokTIMES :: tail) =
  41.                  let val (E', tail') = ParseExpr(tail)
  42.                  in  ParseExprTail(PRODexpr(E, E'), tail')
  43.                  end   |
  44.  
  45.               ParseExprTail(E, TokEQUALS :: tail) =
  46.                  let val (E', tail') = ParseExpr(tail)
  47.                  in  ParseExprTail(EQexpr(E, E'), tail')
  48.                  end   |
  49.  
  50.               ParseExprTail(E, TokCOLCOL :: tail) =
  51.                  let val (E', tail') = ParseExpr(tail)
  52.                  in  ParseExprTail(CONSexpr(E, E'), tail')
  53.                  end   |
  54.  
  55.               ParseExprTail(E, TokOPENBR :: rest) =
  56.                  (case ParseExpr(rest) of
  57.                      (E', TokCLOSEBR :: tail) =>
  58.                         ParseExprTail(APPLexpr(E, E'), tail)   |
  59.                      (_, tail) => syntaxError(tail)
  60.                  )   |
  61.  
  62.               ParseExprTail(E, tail) = (E, tail)
  63.  
  64.           and ParseList(tokens) =
  65.                  (case ParseExpr(tokens) of
  66.                      (E, TokCOMMA :: rest) =>
  67.                         let val (E', tail) = ParseList(rest)
  68.                         in  (E :: E', tail)
  69.                         end   |
  70.  
  71.                      (E, tail) => ([E], tail)
  72.                  )
  73.  
  74.                     (* WhichItem - given the remaining
  75.                        input tokens, magically find the
  76.                        actual lexical string which barfed *)
  77.  
  78.       fun WhichItem(LexStrings, toks: Token list) =
  79.          nth(rev LexStrings, length(toks) - 1)
  80.          handle Nth => "<end-of-input>"
  81.  
  82.       exception Syntax of string
  83.  
  84.       fun parse(input) =
  85.          let val LexStrings = Lex(input)
  86.          in  (case ParseExpr(map MakeToken LexStrings) of
  87.                  (E, nil) => E   |
  88.                  (_, junk) => syntaxError(junk)
  89.              ) handle SyntaxError(toks) =>
  90.                          raise Syntax(WhichItem(LexStrings, toks))
  91.          end
  92.    end;
  93.