Annotation of researchv10no/cmd/sml/doc/examples/parser.sml, revision 1.1.1.1

1.1       root        1: (* a simple parser.  (R. Burstall)
                      2: The grammar is:
                      3: 
                      4:     var          = x | y | z
                      5:     const = 0 | 1 | 2
                      6:     aexpr = var | const | (expr)
                      7:     expr  = aexpr + expr | aexpr * expr | aexpr
                      8:     stmt  = var := expr
                      9:          | if expr then stmt
                     10:          | while expr do stmt
                     11:          | begin stmts end
                     12:     stmts = stmt ; stmts | stmt
                     13:     decl  = var : integer | var : boolean
                     14:     decls = decl ; decls | decl
                     15:     prog  = var decls begin stmts end .
                     16: 
                     17: If S is a set of string lists we say that a function f: string list -> string list
                     18: recognizes S if
                     19: 
                     20:   (1) if l does not begin with a list in S then f l fails
                     21:   (2) if s is the longest list in S such that l = s@m for some list m, then 
                     22:       f l = m
                     23: 
                     24: Each phrase name in the grammar above denotes a set of string lists.  We write ML
                     25: functions called var, const, aexpr, ..., to recognized each of these phrases
                     26: (i.e. to recognize the associated set of string lists).
                     27: 
                     28: If f1 recognizes P1 and f2 recognizes P2 then we can define a function g to
                     29: recognize P1 P2 by 
                     30: 
                     31:   g = f1 & f2     where f & g = (fn s => g(f s))
                     32: 
                     33: We can define a function h to recognize P1 | P2 by
                     34: 
                     35:   h = f = f1 ||| f2    where f ||| g = (fn s => f1 s handle Fail => f2 s)
                     36: *)
                     37: 
                     38: exception Fail
                     39: 
                     40: infix 3 &
                     41: infix 2 |||
                     42: 
                     43: fun f1 & f2 = (fn s => f2(f1 s))
                     44: fun f1 ||| f2 = (fn s => f1 s handle Fail => f2 s)
                     45: 
                     46: fun quote (t: string) ([]: string list) = raise Fail
                     47:   | quote t (t' :: rest) = if t = t' then rest else raise Fail
                     48: 
                     49: val var = quote "x" ||| quote "y" ||| quote "z"
                     50: 
                     51: val const = quote "0" ||| quote "1" ||| quote "2"
                     52: 
                     53: fun aexpr s = (var ||| const ||| quote "(" & expr & quote ")") s
                     54: 
                     55: and expr s = (aexpr & quote "+" & expr ||| 
                     56:              aexpr & quote "*" & expr ||| 
                     57:              aexpr) s
                     58: 
                     59: and stmt s = (var & quote ":=" & expr ||| 
                     60:              quote "if" & expr & quote "then" & stmt |||
                     61:              quote "while" & expr & quote "do" & stmt |||
                     62:              quote "begin" & stmts & quote "end") s
                     63: 
                     64: and stmts s = (stmt & quote ";" & stmts ||| stmt) s
                     65: 
                     66: and decl s = (var & quote ":" & quote "integer" |||
                     67:              var & quote ":" & quote "boolean") s
                     68: 
                     69: and decls s = (decl & quote ";" & decls ||| decl) s
                     70: 
                     71: and prog s = (quote "var" & decls & quote "begin" & stmts & quote "end" &
                     72:              quote ".") s
                     73: 
                     74: fun parse s = (if prog s = [] then "YES" else "NO") handle Fail => "NO"
                     75: 
                     76: (* examples *)
                     77: 
                     78: expr ["x","+","1", "end", "."];
                     79: 
                     80: parse ["var","x",":","integer",";","y",":","boolean",
                     81:        "begin","x",":=","0","end","."];

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.