/* EBNF for the mitchell language. This grammar is LL(k) as recognized by * ml-antlr. */ /* mitchell - experimental compiler * Copyright (C) 2004-2007 Chris Lumens * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Program-level */ start = module-decl+ module-decl = module-symbol identifier-symbol assign-symbol decl-symbol top-decl+ end-symbol /* Expressions */ expr = lparen-symbol base-expr rparen-symbol handle-expr? | base-expr base-expr = record-literal | lbrack-symbol expr-lst? rbrack-symbol | case-expr | decl-expr | if-expr | sym-ref | raise-symbol expr | integer-symbol | string-symbol | boolean-symbol | bottom-symbol record-literal = lbrace-symbol record-assn-lst rbrace-symbol record-assn-lst = single-record-assn (comma-symbol single-record-assn)* single-record-assn = identifier-symbol assign-symbol expr expr-lst = expr (comma-symbol expr)* case-expr = case-symbol expr in-symbol branch-lst (comma-symbol else-symbol mapsto-symbol expr)? end-symbol branch-lst = single-branch (comma-symbol single-branch)* single-branch = branch-expr MAPSTO expr branch-expr = id (lparen-symbol name-lst? rparen-symbol)? | integer-symbol | string-symbol | boolean-symbol decl-expr = decl-symbol decl+ in-symbol expr end-symbol if-expr = if-symbol expr then-symbol expr else-symbol expr sym-ref = id complex-sym-ref? (pipe-symbol identifier-symbol)* complex-sym-ref = lparen-symbol (ty (comma-symbol ty)*)? semicolon-symbol expr-lst? rparen-symbol | record-literal /* Exceptions */ handle-expr = handle-symbol else-symbol identifier-symbol mapsto-symbol expr end-symbol | handle-symbol exn-lst (comma-symbol else-symbol identifier-symbol mapsto-symbol expr)? end-symbol exn-lst = single-exn (comma-symbol single-exn)* single-exn = id identifier-symbol mapsto-symbol expr /* Identifiers */ id = identifier-symbol (dot-symbol identifier-symbol)* name-lst = identifier-symbol (comma-symbol identifier-symbol)* typed-name-lst = typed-name (comma-symbol typed-name)* typed-name = identifier-symbol colon-symbol ty /* Declarations */ decl = ty-decl | val-decl | fun-decl | absorb-symbol id fun-decl = function-symbol identifier-symbol lparen-symbol ty-formals-lst semicolon-symbol formals-lst rparen-symbol (colon-symbol ty)? assign-symbol expr formals-lst = typed-name-lst? top-decl = decl | module-decl ty-decl = type-symbol identifier-symbol (lparen-symbol name-lst rparen-symbol)? assign-symbol ty ty-formals-lst = name-lst? val-decl = val-symbol identifier-symbol (colon-symbol ty)? assign-symbol expr /* Types */ ty = bottom-symbol | list-symbol ty | exn-symbol lbrace-symbol typed-name-lst rbrace-symbol | union-symbol lbrace-symbol tycon-lst rbrace-symbol | lbrace-symbol typed-name-lst rbrace-symbol | id tycon-lst = tycon (comma-symbol tycon)* tycon = identifier-symbol (colon-symbol ty)? /* Misc */ comment = start-comment-symbol .* end-comment-symbol /* Terminals */ absorb-symbol = "absorb" assign-symbol = "←" boolean-symbol = "t" | "f" bottom-symbol = "⊥" case-symbol = "case" colon-symbol = ":" comma-symbol = "," decl-symbol = "decl" dot-symbol = "." else-symbol = "else" end-symbol = "end" end-comment-symbol = "\n" exn-symbol = "ℰ" function-symbol = "ƒ" handle-symbol = "handle" if-symbol = "if" in-symbol = "in" integer-symbol = [0-9]+ lbrace-symbol = "{" lbrack-symbol = "[" list-symbol = "list" lparen-symbol = "(" mapsto-symbol = "→" module-symbol = "ℳ" pipe-symbol = "|" raise-symbol = "raise" rbrace-symbol = "}" rbrack-symbol = "]" rparen-symbol = ")" semicolon-symbol = ";" start-comment-symbol = "#" string-symbol = ".*" then-symbol = "then" type-symbol = "τ" union-symbol = "∪" val-symbol = "ʋ"