Git Product home page Git Product logo

aliceml's Introduction

Overview

Alice ML is a functional programming language based on Standard ML, extended with rich support for concurrent, distributed, and constraint programming. Alice ML extends Standard ML with several new features:

  • Futures: laziness and light-weight concurrency with implicit data-flow synchronisation
  • Higher-order modules: higher-order functors and abstract signatures
  • Packages: integrating static with dynamic typing and first class modules
  • Pickling: higher-order type-safe, generic & platform-independent persistence
  • Components: platform-independence and type-safe dynamic import & export of modules
  • Distribution: type-safe cross-platform remote functions and network mobility
  • Constraints: solving combinatorical problems using constraint propagation and programmable search

More about Alice ML is available from the original project page: http://www.ps.uni-saarland.de/alice/

Building on Linux

The following packages were required to build on Ubuntu 19.10:

$ sudo apt-get install smlnj smlnj-runtime ml-lex ml-lpt ml-yacc     
$ sudo apt-get install g++ libsqlite3-dev libgtk2.0-dev libgmp-dev \
     gawk libtool libgnomecanvas2-dev gtk2-engines-pixbuf \
     libxml2-dev autoconf texinfo

To build:

$ git clone git://github.com/aliceml/aliceml
$ cd aliceml
$ git submodule init
$ git submodule update

$ cd make
$ make setup
#...add directory displayed to the PATH...
$ export PATH=/path/displayed/in/setup:$PATH
$ make all

The final system will be in the distro subdirectory and instructions are printed at the end of make all on how to add to the PATH and run.

Building on Mac OS X

Support for building on Mac OS X is in the early stages and slightly more manual than building on Linux due to errors I haven't worked out. Help from Mac OS X users would be useful.

The following packages were used from Homebrew:

$ brew install smlnj gmp libgnomecanvas gtk+ gawk

To build:

$ git clone git://github.com/aliceml/aliceml
$ cd aliceml/make
$ export PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig:/usr/local/lib/pkgconfig
$ make setup
#...add directory displayed to the PATH...
$ export PATH=/path/displayed/in/setup:$PATH
$ make all

On my machine the make all fails some time in the build when compiling NativeLibs.cc with this error:

distro/bin/seamtool: line 63: echo: write error: Resource temporarily unavailable

The build can be continued with:

$ PATH=/path/to/aliceml/distro/bin:$PATH make -C ../alice/sources/lib/gtk/seam/
$ make all

The final system will be in the distro subdirectory and instructions are printed at the end of make all on how to add to the PATH and run.

Original Source

This git repository was created by converting Gareth Smith's mercurial repositories to git with minor bitrot fixes. Instructions for building Gareth's original code is from a post on the Alice ML mailing list. Note that Gareth's repository contains many changes to the original Alice ML CVS repository but is the only one I've found buildable on modern Linux systems.

During the make setup process the source to gecode will be downloaded.

aliceml's People

Contributors

doublec avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aliceml's Issues

Grammar railroad diagram

Manually transforming the grammar in https://github.com/aliceml/aliceml-alice/blob/b7841b4ad401f82d14e71d91445098146c97f5d6/compiler/frontend-sml/Parser.grm and adding tokens from https://github.com/aliceml/aliceml-alice/blob/b7841b4ad401f82d14e71d91445098146c97f5d6/compiler/frontend-sml/Lexer.lex to get an EBNF understood by https://www.bottlecaps.de/rr/ui we can get a nice navigable railroad diagram.

Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui on the tab Edit Grammar the click on the tab View Diagram to see/download a navigable railroad diagram.

  /* Constants */

  scon::=
	  ZERO
	| DIGIT
	| NUMERIC
	| INT
	| WORD
	| STRING
	| CHAR
	| REAL

  d::=
	  ZERO
	| DIGIT



  /* Identifiers and labels */

  lab::=
	  ALPHA
	| SYMBOL
	| STAR
	| DIGIT
	| NUMERIC


  vid::=
	  vidL
	| EQUALS

     vidL::=
	  ALPHA
	| SYMBOL
	| STAR

  tycon::=
	  ALPHA
	| SYMBOL

  tyvar::=  TYVAR

  strid::=  ALPHA
	| PERVASIVE

  sigid::=  ALPHA


  longvid::=
	  longvidL
	| EQUALS
     longvidL::=
	  vidL
	| longstrid DOT vid
  longtycon::=
	  tycon
	| longstrid DOT tycon
  longstrid::=
	  strid
	| longstrid DOT strid
  longsigid::=
	  sigid
	| longstrid DOT sigid


  OP_opt::=
	  OP
	| /*empty*/

  LAZY_SPAWN_opt::=
	  LAZY
	| SPAWN
	| /*empty*/


  /* Core::= Expressions */

  atexp::=
	  scon
	| FILE
	| LINE
	| longvid
	| OP longvid
	| LBRACE exprow_opt RBRACE
	| LBRACE atexp WHERE exprow RBRACE
	| HASH lab
	| LPAR RPAR
	| LPAR exp_COMMA_list2 RPAR
	| LBRACK exp_COMMA_list0 RBRACK
	| LBRACK exp FOR pat IN exp RBRACK
	| HASHBRACK exp_COMMA_list0 RBRACK
	| LPAR exp_SEMICOLON_list2 RPAR
	| LET dec IN exp_SEMICOLON_list1 END
	| COMP localann_IN_opt spec WITH dec END
	| LPAR exp SEMICOLON_opt RPAR


     exp_COMMA_list0::=
	  exp_COMMA_list1
	| /*empty*/

     exp_COMMA_list1::=
	  exp COMMA exp_COMMA_list1
	| exp

     exp_COMMA_list2::=
	  exp COMMA exp_COMMA_list1

     exp_SEMICOLON_list1::=
	  exp SEMICOLON exp_SEMICOLON_list1
	| exp SEMICOLON_opt

     exp_SEMICOLON_list2::=
	  exp SEMICOLON exp_SEMICOLON_list1

     SEMICOLON_opt::=
	  SEMICOLON
	| /*empty*/

     localann_IN_opt::=
	  localann IN
	| /*empty*/

  exprow::=
	  lab EQUALS exp COMMA_exprow_opt
	| DOTS EQUALS exp COMMA_exprow_opt
	| vidL COLON_ty_opt COMMA_exprow_opt
     COMMA_exprow_opt::=
	  COMMA exprow
	| /*empty*/

     exprow_opt::=
	  exprow
	| /*empty*/


  appexp::=
	  atexp
	| appexp atexp


  infexp::=
	  appexp
	/*infexp vid infexp*/


  exp::=
	  infexp
	| exp COLON ty
	| exp ANDALSO exp
	| exp ORELSE exp
	| exp FINALLY exp
	| exp HANDLE BAR_opt match
	| RAISE exp
	| LAZY exp
	| SPAWN exp
	| IF exp THEN exp ELSE_exp_opt
	| WHILE exp DO exp
	| CASE exp OF BAR_opt match
	| FN BAR_opt match
	| REC pat DARROW exp
	| PACK atstrexp COLON atsigexp
	| PACK atstrexp COLONGREATER atsigexp
	| ASSERT exp DO exp
	| ASSERT exp OF pat DO exp
	| ASSERT exp
	| ASSERT exp OF pat
	| ASSERT exp RAISE pat
     ELSE_exp_opt::=
	  ELSE exp
	| /*empty*/


  /* Core::= Matches */

  match::=
	  mrule BAR_match_opt

     BAR_opt::=
	  BAR
	| /*empty*/

     BAR_match_opt::=
	  BAR match
	| /*empty*/ //%prec DARROW

  mrule::=
	  pat DARROW exp



  /* Core::= Declarations */

  dec::=
	  dec1
	| /*empty*/

     decL::=
	  dec1L
	| decL decL //%prec SEMICOLON

     dec1::=
	  dec1L
	| SEMICOLON
	| dec1 dec1 //%prec SEMICOLON

     dec1L::=
	  dec1LL
	| LOCAL dec IN dec END

     dec1LL::=
	  VAL valbind
	| VAL tyvarseq1 valbind
	| DO exp
	| FUN fvalbind
	| FUN tyvarseq1 fvalbind
	| TYPE typbind
	| EQTYPE typbind
	| EQEQTYPE typbind
	| DATATYPE datbind0 WITHTYPE_typbind_opt
	| DATATYPE datbind1 WITHTYPE_typbind_opt
	| DATATYPE tycon EQUALS DATATYPE longtycon
	| ABSTYPE datbind WITHTYPE_typbind_opt WITH dec END
	| EXTTYPE extbind
	| CONSTRUCTOR econbind
	| EXCEPTION exbind
	| STRUCTURE strbind
	| SIGNATURE sigbind
	| FUNCTOR funbind
	| OPEN strexp
	| INFIX d_opt vid_list1
	| INFIXR d_opt vid_list1
	| NONFIX vid_list1
	| OVERLOAD longtyconseq AS tyvar OP_opt vid COLON ty EQUALS longvidseq
	| OVERLOAD tyvar OP_opt vid COLON ty EQUALS longvid
	| PRIMITIVE VAL OP_opt vid COLON ty EQUALS STRING
	| PRIMITIVE FUN OP_opt vid COLON ty EQUALS STRING
	| PRIMITIVE TYPE tyvarseq tycon EQUALS STRING
	| PRIMITIVE EQTYPE tyvarseq tycon EQUALS STRING
	| PRIMITIVE EQEQTYPE tyvarseq tycon EQUALS STRING
	| PRIMITIVE EXTTYPE tyvarseq tycon EQUALS STRING
	| PRIMITIVE REFTYPE tyvar tycon EQUALS OP_opt vid OF tyvar
	| PRIMITIVE CONSTRUCTOR OP_opt vid OF_ty_opt COLON tyvarseq longtycon
	  EQUALS STRING
	| PRIMITIVE EXCEPTION OP_opt vid OF_ty_opt EQUALS STRING
	| PRIMITIVE STRUCTURE strid COLON sigexp EQUALS STRING
	| PRIMITIVE FUNCTOR strid atstrpat_list0 COLON sigexp EQUALS STRING
	| PRIMITIVE SIGNATURE sigid atstrpat_list0 EQUALS STRING

     WITHTYPE_typbind_opt::=
	  WITHTYPE typbind
	| /*empty*/

     vid_list1::=
	  vid vid_list1
	| vid

     d_opt::=
	  d
	| /*empty*/



  /* Core::= Bindings */

  valbind::=
	  pat EQUALS exp AND_valbind_opt
	| REC valbind

      AND_valbind_opt::=
	  AND valbind
	| /*empty*/


  fvalbind::=
	  fmatch AND_fvalbind_opt
	| BAR fmatch AND_fvalbind_opt
	| LAZY BAR_opt fmatch AND_fvalbind_opt
	| SPAWN BAR_opt fmatch AND_fvalbind_opt
     AND_fvalbind_opt::=
	  AND fvalbind
	| /*empty*/

  fmatch::=
	  fmrule BAR_fmatch_opt

     BAR_fmatch_opt::=
	  BAR fmatch
	| /*empty*/

  fmrule::=
	  fpat EQUALS exp

  fpat::=
	  pat

  typbind::=
	  tyvarseq tycon AND_typbind_opt
	| tyvarseq tycon EQUALS ty AND_typbind_opt

     AND_typbind_opt::=
	  AND typbind
	| /*empty*/


  datbind::=
	  tyvarseq tycon EQUALS BAR_opt conbind AND_datbind_opt
     datbind0::=
	  tycon EQUALS BAR_opt conbind AND_datbind_opt
     datbind1::=
	  tyvarseq1 tycon EQUALS BAR_opt conbind AND_datbind_opt
     AND_datbind_opt::=
	  AND datbind
	| /*empty*/


  conbind::=
	  OP_opt vid OF_ty_opt BAR_conbind_opt

     BAR_conbind_opt::=
	  BAR conbind
	| /*empty*/

     OF_ty_opt::=
	  OF ty
	| /*empty*/


  extbind::=
	  tyvarseq tycon AND_extbind_opt
     AND_extbind_opt::=
	  AND extbind
	| /*empty*/


  econbind::=
	  OP_opt vid OF_ty_opt COLON tyvarseq longtycon AND_econbind_opt
	| OP_opt vid EQUALS OP_opt longvid AND_econbind_opt
     AND_econbind_opt::=
	  AND econbind
	| /*empty*/


  exbind::=
	  OP_opt vid OF_ty_opt AND_exbind_opt
	| OP_opt vid EQUALS OP_opt longvid AND_exbind_opt
     AND_exbind_opt::=
	  AND exbind
	| /*empty*/



  /* Core::= Patterns */

  atpat::=
	  UNDERBAR
	| longvidL
	| OP longvid
	| scon
	| LBRACE patrow_opt RBRACE
	| LPAR RPAR
	| LPAR pat_COMMA_list2 RPAR
	| LBRACK pat_COMMA_list0 RBRACK
	| HASHBRACK pat_COMMA_list0 RBRACK
	| LPAR pat RPAR


     pat_COMMA_list0::=
	  pat_COMMA_list1
	| /*empty*/

     pat_COMMA_list1::=
	  pat COMMA pat_COMMA_list1
	| pat

     pat_COMMA_list2::=
	  pat COMMA pat_COMMA_list1


  patrow::=
	  DOTS COMMA_patrow_opt
	| DOTS EQUALS pat COMMA_patrow_opt
	| lab EQUALS pat COMMA_patrow_opt
	| vidL COLON_ty_opt AS_pat_opt COMMA_patrow_opt
     COMMA_patrow_opt::=
	  COMMA patrow
	| /*empty*/

     COLON_ty_opt::=
	  COLON ty
	| /*empty*/

     AS_pat_opt::=
	  AS pat
	| /*empty*/

     patrow_opt::=
	  patrow
	| /*empty*/



  infpat::=
	  atpat
	| infpat atpat
	/*OP_opt longvid atpat*/
	/*pat vid pat*/

  pat::=
	  infpat
	| pat COLON ty
	| NON pat
	| pat AS pat
	| pat BAR pat
	| pat IF atexp
	| pat WITHVAL valbind END
	| pat WITHFUN fvalbind END



  /* Core::= Types */

  ty::=
	  tupty
	| tupty ARROW ty

     tupty::=
	  ty_STAR_list

     ty_STAR_list::=
	  consty STAR ty_STAR_list
	| consty

     consty::=
	  atty
	| tyseq longtycon

     atty::=
	  UNDERBAR
	| tyvar
	| LBRACE tyrow_opt RBRACE
	| LPAR ty RPAR

  tyrow::=
	  lab COLON ty COMMA_tyrow_opt
	| DOTS COLON ty COMMA_tyrow_opt
     COMMA_tyrow_opt::=
	  COMMA tyrow
	| /*empty*/

     tyrow_opt::=
	  tyrow
	| /*empty*/



  /* Core::= Sequences */

  tyseq::=
	  consty
	| /*empty*/
	| LPAR ty_COMMA_list2 RPAR
     ty_COMMA_list2::=
	  ty COMMA ty_COMMA_list2
	| ty COMMA ty


  tyvarseq::=
	  tyvarseq1
	| /*empty*/
     tyvarseq1::=
	  tyvar
	| LPAR tyvar_COMMA_list1 RPAR
     tyvar_COMMA_list1::=
	  tyvar COMMA tyvar_COMMA_list1
	| tyvar


  longtyconseq::=
	  longtyconseq1
	| /*empty*/
     longtyconseq1::=
	  longtycon
	| LPAR longtycon_COMMA_list1 RPAR
     longtycon_COMMA_list1::=
	  longtycon COMMA longtycon_COMMA_list1
	| longtycon


  longvidseq::=
	  longvidseq1
	| /*empty*/
     longvidseq1::=
	  longvid
	| LPAR longvid_COMMA_list1 RPAR
     longvid_COMMA_list1::=
	  longvid COMMA longvid_COMMA_list1
	| longvid




  /* Modules::= Structures */

  atstrexp::=
	  STRUCT dec END
	| longstrid
	| LPAR strexp RPAR
	| LPAR dec RPAR
	| LET dec IN strexp END

  appstrexp::=
	  atstrexp
	| appstrexp atstrexp
  strexp::=
	  appstrexp
	| strexp COLON sigexp
	| strexp COLONGREATER sigexp
	| FCT strpat DARROW strexp
	| UNPACK infexp COLON sigexp
	| LAZY strexp
	| SPAWN strexp

  atstrpat::=
	  LPAR strid COLON sigexp RPAR
	| LPAR UNDERBAR COLON sigexp RPAR
	| LPAR spec RPAR
  strpat::=
	  atstrpat
	| strid COLON sigexp
	| UNDERBAR COLON sigexp
  strpatL::=
	  atstrpat
	| strid COLON atsigexp
	| UNDERBAR COLON atsigexp

  strbind::=
	  strid COLON_sigexp_opt EQUALS strexp__AND_strbind_opt
	| strid COLONGREATER sigexp EQUALS strexp__AND_strbind_opt
	| UNDERBAR COLON_sigexp_opt EQUALS strexp__AND_strbind_opt
     AND_strbind_opt::=
	  AND strbind
	| /*empty*/

     strexp__AND_strbind_opt::=
	  appstrexp AND_strbind_opt
	| strexp COLON sigexp__AND_strbind_opt
	| strexp COLONGREATER sigexp__AND_strbind_opt
	| FCT strpat DARROW strexp__AND_strbind_opt
	| UNPACK infexp COLON sigexp__AND_strbind_opt
	| LAZY strexp__AND_strbind_opt
	| SPAWN strexp__AND_strbind_opt

     sigexp__AND_strbind_opt::=
	  sigexpL AND_strbind_opt
	| FCT strpatL ARROW sigexp__AND_strbind_opt
	| atsigexp ARROW sigexp__AND_strbind_opt
	| sigexp WHERE rea__AND_strbind_opt

     rea__AND_strbind_opt::=
	  SIG spec END AND_rea_opt__AND_strbind_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_strbind_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_strbind_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_strbind_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_strbind_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_strbind_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_strbind_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_strbind_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_strbind_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_strbind_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_strbind_opt

     AND_rea_opt__AND_strbind_opt::=
	  AND_strbind_opt
	| AND rea__AND_strbind_opt

     sigexp__AND_rea_opt__AND_strbind_opt::=
	  appsigexp AND_rea_opt__AND_strbind_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_strbind_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_strbind_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_strbind_opt
	| sigexp WHERE rea__AND_strbind_opt
*/

     COLON_sigexp_opt::=
	  COLON sigexp
	| /*empty*/



  /* Modules::= Signatures */

  atsigexp::=
	  ANY
	| SIG spec END
	| longsigid
	| LET dec IN sigexp END
	| LPAR sigexp RPAR
	| LPAR spec RPAR
  appsigexp::=
	  atsigexp
	| appsigexp atstrexp
  sigexp::=
	  sigexpL
	| FCT strpatL ARROW sigexp
	| atsigexp ARROW sigexp
	| sigexp WHERE rea
     sigexpL::=
	  appsigexp
	| sigexp WHERE longstrid EQUALS longstrid

  sigbind::=
	  sigid atstrpat_list0 EQUALS sigexp__AND_sigbind_opt
     atstrpat_list0::=
	  atstrpat_list1
	| /*empty*/

     AND_sigbind_opt::=
	  AND sigbind
	| /*empty*/

     sigexp__AND_sigbind_opt::=
	  sigexpL AND_sigbind_opt
	| FCT strpatL ARROW sigexp__AND_sigbind_opt
	| atsigexp ARROW sigexp__AND_sigbind_opt
	| sigexp WHERE rea__AND_sigbind_opt

     rea__AND_sigbind_opt::=
	  SIG spec END AND_rea_opt__AND_sigbind_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_sigbind_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_sigbind_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_sigbind_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_sigbind_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_sigbind_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_sigbind_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_sigbind_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_sigbind_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_sigbind_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_sigbind_opt

     AND_rea_opt__AND_sigbind_opt::=
	  AND_sigbind_opt
	| AND rea__AND_sigbind_opt

     sigexp__AND_rea_opt__AND_sigbind_opt::=
	  appsigexp AND_rea_opt__AND_sigbind_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_sigbind_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_sigbind_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_sigbind_opt
	| sigexp WHERE rea__AND_sigbind_opt
*/


  rea::=
	  SIG spec END AND_rea_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid AND_rea_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid AND_rea_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid AND_rea_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid AND_rea_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS sigexp__AND_rea_opt
     AND_rea_opt::=
	  AND rea
	| /*empty*/

     sigexp__AND_rea_opt::=
	  appsigexp AND_rea_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt
	| atsigexp ARROW sigexp__AND_rea_opt
	| sigexp WHERE rea
*/


  /* Modules::= Functors */

  funbind::=
	  LAZY_SPAWN_opt strid atstrpat_list1 COLON_sigexp_opt
		EQUALS strexp__AND_funbind_opt
	| LAZY_SPAWN_opt strid atstrpat_list1 COLONGREATER sigexp
		EQUALS strexp__AND_funbind_opt
     atstrpat_list1::=
	  atstrpat
	| atstrpat atstrpat_list1

     AND_funbind_opt::=
	  AND funbind
	| /*empty*/

     strexp__AND_funbind_opt::=
	  appstrexp AND_funbind_opt
	| strexp COLON sigexp__AND_funbind_opt
	| strexp COLONGREATER sigexp__AND_funbind_opt
	| FCT strpat DARROW strexp__AND_funbind_opt
	| UNPACK infexp COLON sigexp__AND_funbind_opt
	| LAZY strexp__AND_funbind_opt
	| SPAWN strexp__AND_funbind_opt

     sigexp__AND_funbind_opt::=
	  sigexpL AND_funbind_opt
	| FCT strpatL ARROW sigexp__AND_funbind_opt
	| atsigexp ARROW sigexp__AND_funbind_opt
	| sigexp WHERE rea__AND_funbind_opt

     rea__AND_funbind_opt::=
	  SIG spec END AND_rea_opt__AND_funbind_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_funbind_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_funbind_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_funbind_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_funbind_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_funbind_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_funbind_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_funbind_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_funbind_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_funbind_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_funbind_opt

     AND_rea_opt__AND_funbind_opt::=
	  AND_funbind_opt
	| AND rea__AND_funbind_opt

     sigexp__AND_rea_opt__AND_funbind_opt::=
	  appsigexp AND_rea_opt__AND_funbind_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_funbind_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_funbind_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_funbind_opt
	| sigexp WHERE rea__AND_funbind_opt
*/


  /* Modules::= Specifications */

  spec::=
	  spec1
	| /*empty*/

     spec1::=
	  spec1L
	| SEMICOLON
	| spec1 spec1L //%prec SEMICOLON
	| spec1 SEMICOLON //%prec SEMICOLON
	| SHARING TYPE longtycon_EQUALS_list2
	| spec1 SHARING TYPE longtycon_EQUALS_list2
	| SHARING SIGNATURE longsigid_EQUALS_list2
	| spec1 SHARING SIGNATURE longsigid_EQUALS_list2
	| SHARING longstrid_EQUALS_list2
	| spec1 SHARING longstrid_EQUALS_list2

     spec1L::=
	  VAL valdesc
	| FUN valdesc
	| TYPE typdesc
	| EQTYPE typdesc
	| EQEQTYPE typdesc
	| DATATYPE datdesc0 WITHTYPE_typdesc_opt
	| DATATYPE datdesc1 WITHTYPE_typdesc_opt
	| DATATYPE tycon EQUALS DATATYPE longtycon
	| EXTTYPE extdesc
	| CONSTRUCTOR econdesc
	| EXCEPTION exdesc
	| STRUCTURE strdesc
	| SIGNATURE sigdesc
	| FUNCTOR fundesc
	| INCLUDE sigexp
	| INFIX d_opt vid_list1
	| INFIXR d_opt vid_list1
	| NONFIX vid_list1

     WITHTYPE_typdesc_opt::=
	  WITHTYPE typdesc
	| /*empty*/

     longtycon_EQUALS_list1::=
	  longtycon EQUALS longtycon_EQUALS_list1
	| longtycon

     longtycon_EQUALS_list2::=
	  longtycon EQUALS longtycon_EQUALS_list1
     longsigid_EQUALS_list1::=
	  longsigid EQUALS longsigid_EQUALS_list1
	| longsigid

     longsigid_EQUALS_list2::=
	  longsigid EQUALS longsigid_EQUALS_list1
     longstrid_EQUALS_list1::=
	  longstrid EQUALS longstrid_EQUALS_list1
	| longstrid

     longstrid_EQUALS_list2::=
	  longstrid EQUALS longstrid_EQUALS_list1


  /* Modules::= Descriptions */

  valdesc::=
	  OP_opt vid COLON ty AND_valdesc_opt
	| OP_opt vid EQUALS OP_opt longvid AND_valdesc_opt
     AND_valdesc_opt::=
	  AND valdesc
	| /*empty*/

  typdesc::=
	  tyvarseq tycon AND_typdesc_opt
	| tyvarseq tycon EQUALS ty AND_typdesc_opt
     AND_typdesc_opt::=
	  AND typdesc
	| /*empty*/

  datdesc::=
	  tyvarseq tycon EQUALS BAR_opt condesc AND_datdesc_opt
     datdesc0::=
	  tycon EQUALS BAR_opt condesc AND_datdesc_opt
     datdesc1::=
	  tyvarseq1 tycon EQUALS BAR_opt condesc AND_datdesc_opt
     AND_datdesc_opt::=
	  AND datdesc
	| /*empty*/

  condesc::=
	  OP_opt vid OF_ty_opt BAR_condesc_opt
     BAR_condesc_opt::=
	  BAR condesc
	| /*empty*/

  extdesc::=
	  tyvarseq tycon AND_extdesc_opt
     AND_extdesc_opt::=
	  AND extdesc
	| /*empty*/

  econdesc::=
	  OP_opt vid OF_ty_opt COLON tyvarseq longtycon AND_econdesc_opt
	| OP_opt vid EQUALS OP_opt longvid AND_econdesc_opt
     AND_econdesc_opt::=
	  AND econdesc
	| /*empty*/


  exdesc::=
	  OP_opt vid OF_ty_opt AND_exdesc_opt
	| OP_opt vid EQUALS OP_opt longvid AND_exdesc_opt
     AND_exdesc_opt::=
	  AND exdesc
	| /*empty*/

  strdesc::=
	  strid COLON sigexp__AND_strdesc_opt
	| strid COLON_sigexp_opt EQUALS longstrid AND_strdesc_opt
     AND_strdesc_opt::=
	  AND strdesc
	| /*empty*/

     sigexp__AND_strdesc_opt::=
	  sigexpL AND_strdesc_opt
	| FCT strpatL ARROW sigexp__AND_strdesc_opt
	| atsigexp ARROW sigexp__AND_strdesc_opt
	| sigexp WHERE rea__AND_strdesc_opt

     rea__AND_strdesc_opt::=
	  SIG spec END AND_rea_opt__AND_strdesc_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_strdesc_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_strdesc_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_strdesc_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_strdesc_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_strdesc_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_strdesc_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_strdesc_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_strdesc_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_strdesc_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_strdesc_opt

     AND_rea_opt__AND_strdesc_opt::=
	  AND_strdesc_opt
	| AND rea__AND_strdesc_opt

     sigexp__AND_rea_opt__AND_strdesc_opt::=
	  appsigexp AND_rea_opt__AND_strdesc_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_strdesc_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_strdesc_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_strdesc_opt
	| sigexp WHERE rea__AND_strdesc_opt
*/

  sigdesc::=
	  sigid atstrpat_list0 AND_sigdesc_opt
	| sigid atstrpat_list0 EQUALS sigexp__AND_sigdesc_opt

     AND_sigdesc_opt::=
	  AND sigdesc
	| /*empty*/

     sigexp__AND_sigdesc_opt::=
	  sigexpL AND_sigdesc_opt
	| FCT strpatL ARROW sigexp__AND_sigdesc_opt
	| atsigexp ARROW sigexp__AND_sigdesc_opt
	| sigexp WHERE rea__AND_sigdesc_opt

     rea__AND_sigdesc_opt::=
	  SIG spec END AND_rea_opt__AND_sigdesc_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_sigdesc_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_sigdesc_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_sigdesc_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_sigdesc_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_sigdesc_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_sigdesc_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_sigdesc_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_sigdesc_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_sigdesc_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_sigdesc_opt

     AND_rea_opt__AND_sigdesc_opt::=
	  AND_sigdesc_opt
	| AND rea__AND_sigdesc_opt

     sigexp__AND_rea_opt__AND_sigdesc_opt::=
	  appsigexp AND_rea_opt__AND_sigdesc_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_sigdesc_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_sigdesc_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_sigdesc_opt
	| sigexp WHERE rea__AND_sigdesc_opt
*/

  fundesc::=
	  strid atstrpat_list0 COLON sigexp__AND_fundesc_opt
     AND_fundesc_opt::=
	  AND fundesc
	| /*empty*/

     sigexp__AND_fundesc_opt::=
	  sigexpL AND_fundesc_opt
	| FCT strpatL ARROW sigexp__AND_fundesc_opt
	| atsigexp ARROW sigexp__AND_fundesc_opt
	| sigexp WHERE rea__AND_fundesc_opt

     rea__AND_fundesc_opt::=
	  SIG spec END AND_rea_opt__AND_fundesc_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_fundesc_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_fundesc_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_fundesc_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_fundesc_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_fundesc_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_fundesc_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_fundesc_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_fundesc_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_fundesc_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_fundesc_opt

     AND_rea_opt__AND_fundesc_opt::=
	  AND_fundesc_opt
	| AND rea__AND_fundesc_opt

     sigexp__AND_rea_opt__AND_fundesc_opt::=
	  appsigexp AND_rea_opt__AND_fundesc_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_fundesc_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_fundesc_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_fundesc_opt
	| sigexp WHERE rea__AND_fundesc_opt
*/


  /* Components::= Imports */

  imp::=
	  imp1
	| /*empty*/

     imp1::=
	  imp1L
	| imp1 imp1L //%prec SEMICOLON
	| SEMICOLON

     imp1L::=
	  VAL valitem
	| FUN valitem
	| TYPE typitem
	| EQTYPE typitem
	| EQEQTYPE typitem
	| DATATYPE datitem
	| EXTTYPE extitem
	| CONSTRUCTOR econitem
	| EXCEPTION exitem
	| STRUCTURE stritem
	| SIGNATURE sigitem
	| FUNCTOR funitem
	| INFIX d_opt vid_list1
	| INFIXR d_opt vid_list1
	| NONFIX vid_list1


  /* Components::= Items */

  valitem::=
	  OP_opt vid AND_valitem_opt
	| OP_opt vid COLON ty AND_valitem_opt
     AND_valitem_opt::=
	  AND valitem
	| /*empty*/

  typitem::=
	  tycon AND_typitem_opt
	| tyvarseq1 tycon AND_typitem_opt
     AND_typitem_opt::=
	  AND typitem
	| /*empty*/

  datitem::=
	  tycon AND_datitem_opt
	| tycon EQUALS BAR_opt conitem AND_datitem_opt
	| tyvarseq1 tycon EQUALS BAR_opt conitem AND_datitem_opt
     AND_datitem_opt::=
	  AND datitem
	| /*empty*/

  conitem::=
	  OP_opt vid OF_ty_opt BAR_conitem_opt
     BAR_conitem_opt::=
	  BAR conitem
	| /*empty*/

  extitem::=
	  tycon AND_extitem_opt
	| tyvarseq1 tycon AND_extitem_opt
     AND_extitem_opt::=
	  AND extitem
	| /*empty*/

  econitem::=
	  OP_opt vid AND_econitem_opt
	| OP_opt vid OF_ty_opt COLON tyvarseq longtycon AND_econitem_opt
     AND_econitem_opt::=
	  AND econitem
	| /*empty*/


  exitem::=
	  OP_opt vid AND_exitem_opt
	| OP_opt vid OF ty AND_exitem_opt
     AND_exitem_opt::=
	  AND exitem
	| /*empty*/

  stritem::=
	  strid AND_stritem_opt
	| strid COLON sigexp__AND_stritem_opt
     AND_stritem_opt::=
	  AND stritem
	| /*empty*/

     sigexp__AND_stritem_opt::=
	  sigexpL AND_stritem_opt
	| FCT strpatL ARROW sigexp__AND_stritem_opt
	| atsigexp ARROW sigexp__AND_stritem_opt
	| sigexp WHERE rea__AND_stritem_opt

     rea__AND_stritem_opt::=
	  SIG spec END AND_rea_opt__AND_stritem_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_stritem_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_stritem_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_stritem_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_stritem_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_stritem_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_stritem_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_stritem_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_stritem_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_stritem_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_stritem_opt

     AND_rea_opt__AND_stritem_opt::=
	  AND_stritem_opt
	| AND rea__AND_stritem_opt

     sigexp__AND_rea_opt__AND_stritem_opt::=
	  appsigexp AND_rea_opt__AND_stritem_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_stritem_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_stritem_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_stritem_opt
	| sigexp WHERE rea__AND_stritem_opt
*/

  sigitem::=
	  sigid AND_sigitem_opt
	| sigid atstrpat_list1 AND_sigitem_opt
     AND_sigitem_opt::=
	  AND sigitem
	| /*empty*/

  funitem::=
	  strid AND_funitem_opt
	| strid atstrpat_list0 COLON sigexp__AND_funitem_opt
     AND_funitem_opt::=
	  AND funitem
	| /*empty*/

     sigexp__AND_funitem_opt::=
	  sigexpL AND_funitem_opt
	| FCT strpatL ARROW sigexp__AND_funitem_opt
	| atsigexp ARROW sigexp__AND_funitem_opt
	| sigexp WHERE rea__AND_funitem_opt

     rea__AND_funitem_opt::=
	  SIG spec END AND_rea_opt__AND_funitem_opt
	| VAL OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_funitem_opt
	| FUN OP_opt longvid EQUALS OP_opt longvid AND_rea_opt__AND_funitem_opt
	| CONSTRUCTOR OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_funitem_opt
	| EXCEPTION OP_opt longvid EQUALS OP_opt longvid
						AND_rea_opt__AND_funitem_opt
	| TYPE tyvarseq longtycon EQUALS ty AND_rea_opt__AND_funitem_opt
	| EQTYPE tyvarseq longtycon AND_rea_opt__AND_funitem_opt
	| EQEQTYPE tyvarseq longtycon AND_rea_opt__AND_funitem_opt
	| STRUCTURE longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_funitem_opt
	| FUNCTOR longstrid COLON_sigexp_opt EQUALS longstrid
						AND_rea_opt__AND_funitem_opt
	| SIGNATURE longsigid atstrpat_list0 EQUALS
					sigexp__AND_rea_opt__AND_funitem_opt

     AND_rea_opt__AND_funitem_opt::=
	  AND_funitem_opt
	| AND rea__AND_funitem_opt

     sigexp__AND_rea_opt__AND_funitem_opt::=
	  appsigexp AND_rea_opt__AND_funitem_opt
/*UNFINISHED::= heavy conflicts with this stuff...
	  sigexpL AND_rea_opt__AND_funitem_opt
	| FCT strpatL ARROW sigexp__AND_rea_opt__AND_funitem_opt
	| atsigexp ARROW sigexp__AND_rea_opt__AND_funitem_opt
	| sigexp WHERE rea__AND_funitem_opt
*/


  /* Components::= Announcements */

  ann0::=
	  ann1
	| /*empty*/

     ann1::=
	  IMPORT imp FROM STRING
	| IMPORT STRING
	| IMPORT PRIMITIVE imp FROM STRING
	| IMPORT PRIMITIVE STRING
	| ann1 ann1 //%prec SEMICOLON
	| SEMICOLON

  localann::=
	  localann1
	| /*empty*/

     localann1::=
	  IMPORT spec FROM STRING
	| localann1 localann1 //%prec SEMICOLON
	| SEMICOLON


  /* Components::= Programs */

  program::=
	  decL
	| exp
	| decL SEMICOLON program_optL
	| exp SEMICOLON program_optL

     program_opt::=
	  program
	| /*empty*/

     program_optL::=
	  program_opt
	| SEMICOLON program_optL



  /* Components::= Compilation units */

  component::=
	  ann0 program_opt

//Tokens
//<INITIAL>\("[^"]+"\)\s*=>\s*( token(\([^,]+\).+

HASH ::= "#"
HASHBRACK ::= "#["
LPAR ::= "("
RPAR ::= ")"
STAR ::= "*"
COMMA ::= ","
ARROW ::= "->"
DOT ::= "."
DOTS ::= "..."
COLON ::= ":"
COLONGREATER ::= ":>"
SEMICOLON ::= ";"
EQUALS ::= "="
DARROW ::= "=>"
LBRACK ::= "["
RBRACK ::= "]"
UNDERBAR ::= "_"
LBRACE ::= "{"
BAR ::= "|"
RBRACE ::= "}"

EQEQTYPE ::= "__eqeqtype"
OVERLOAD ::= "__overload"
PERVASIVE ::= "__pervasive"
PRIMITIVE ::= "__primitive"
REFTYPE ::= "__reftype"
FILE ::= "_file_"
LINE ::= "_line_"
ABSTYPE ::= "abstype"
AND ::= "and"
ANDALSO ::= "andalso"
ANY ::= "any"
AS ::= "as"
ASSERT_ NONE ::= "assert"
/*
ASSERT_(SOME 0) ::= "assert0"
ASSERT_(SOME 1) ::= "assert1"
ASSERT_(SOME 2) ::= "assert2"
ASSERT_(SOME 3) ::= "assert3"
ASSERT_(SOME 4) ::= "assert4"
ASSERT_(SOME 5) ::= "assert5"
ASSERT_(SOME 6) ::= "assert6"
ASSERT_(SOME 7) ::= "assert7"
ASSERT_(SOME 8) ::= "assert8"
ASSERT_(SOME 9) ::= "assert9"
*/
CASE ::= "case"
COMP ::= "comp"
CONSTRUCTOR ::= "constructor"
DATATYPE ::= "datatype"
DO ::= "do"
ELSE ::= "else"
END ::= "end"
EQTYPE ::= "eqtype"
EXCEPTION ::= "exception"
EXTTYPE ::= "exttype"
FCT ::= "fct"
FINALLY ::= "finally"
FN ::= "fn"
FOR ::= "for"
FROM ::= "from"
FUN ::= "fun"
FUNCTOR ::= "functor"
HANDLE ::= "handle"
IF ::= "if"
IMPORT ::= "import"
IN ::= "in"
INCLUDE ::= "include"
INFIX ::= "infix"
INFIXR ::= "infixr"
LAZY ::= "lazy"
LET ::= "let"
LOCAL ::= "local"
NON ::= "non"
NONFIX ::= "nonfix"
OF ::= "of"
OP ::= "op"
OPEN ::= "open"
ORELSE ::= "orelse"
PACK ::= "pack"
RAISE ::= "raise"
REC ::= "rec"
SHARING ::= "sharing"
SIG ::= "sig"
SIGNATURE ::= "signature"
SPAWN ::= "spawn"
STRUCT ::= "struct"
STRUCTURE ::= "structure"
THEN ::= "then"
TYPE ::= "type"
UNPACK ::= "unpack"
VAL ::= "val"
WHERE ::= "where"
WHILE ::= "while"
WITH ::= "with"
WITHFUN ::= "withfun"
WITHTYPE ::= "withtype"
WITHVAL ::= "withval"

Fedora support

Hello,
I am trying to use an AliceML implementation to run some code using futures and found this as latest repository.

Some of the listed packages are not available on Fedora. For example libc6-dev-i386, smlnj smlnj-runtime, ml-lex ml-lpt etc.

It would be great to add a section for Fedora in the README file.

I followed the build instructions and it fails with:

futures/build/aliceml-prefix/src/aliceml/alice/sources/bootstrap/smla: line 6: sml: command not found
futures/build/aliceml-prefix/src/aliceml/alice/sources/bootstrap/smla: line 32: sml: command not found

Do I have to install this manually? http://smlnj.org/install/

I cannot find any sml package for Fedora.

Compilation error, Ubuntu 22.04 64-bit

The make all goes on for about 12 minutes without issues. Then:

alicetool -v compile  \
`pkg-config --cflags gecode` -c  GecodeSpace.cc -o GecodeSpace.o
g++ -I. -I/home/spam/Public/aliceml/distro/include/seam -DHAVE_LIGHTNING=0 -fPIC -falign-functions -falign-jumps -falign-loops -falign-labels -ggdb -DHAVE_LOADLIBRARY=0 -DHAVE_SIGNAL=1 -DHAVE_CONSOLECTRL=0 -DHAVE_LIBLTDL=1 -DDEBUGGER=0 -fno-rtti -DPROFILE=0 -I/include -I/home/spam/Public/aliceml/distro/include -I/home/spam/Public/aliceml/gecode/install/include -c GecodeSpace.cc -o GecodeSpace.o
alicetool -v link UnsafeGecode.o GecodeSpace.o `pkg-config --libs gecode` -o UnsafeGecode.dll
g++ -fPIC -Wl,-S UnsafeGecode.o GecodeSpace.o -L/home/spam/Public/aliceml/gecode/install/lib -lgecodekernel -lgecodeint -lgecodeset -o UnsafeGecode.dll /home/spam/Public/aliceml/distro/lib/seam/alice.dll -L/lib -shared -L/home/spam/Public/aliceml/distro/lib -lseam
/usr/bin/ld: /home/spam/Public/aliceml/gecode/install/lib/libgecodeset.a(branch.o): warning: relocation against `_ZTVN6Gecode16ViewValBranchingINS_3Set7SetViewEiNS1_6Branch9ByMinCardENS3_6ValMaxEEE' in read-only section `.text._ZN6Gecode16ViewValBranchingINS_3Set7SetViewEiNS1_6Branch9ByMinCardENS3_6ValMaxEEC2EPNS_5SpaceEbRS6_[_ZN6Gecode16ViewValBranchingINS_3Set7SetViewEiNS1_6Branch9ByMinCardENS3_6ValMaxEEC5EPNS_5SpaceEbRS6_]'
/usr/bin/ld: /home/spam/Public/aliceml/gecode/install/lib/libgecodekernel.a(exception.o): relocation R_X86_64_PC32 against symbol `_ZTVN6Gecode9ExceptionE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[4]: *** [Makefile:82: UnsafeGecode.dll] Error 1
make[4]: Leaving directory '/home/spam/Public/aliceml/alice/sources/lib/gecode'
make[3]: *** [Makefile:236: libs-seam] Error 2
make[3]: Leaving directory '/home/spam/Public/aliceml/alice/sources'
make[2]: *** [Makefile:215: reinstall-seam] Error 2
make[2]: Leaving directory '/home/spam/Public/aliceml/alice/sources'
make[1]: *** [Makefile:461: rebuild-alice-bootstrap] Error 2
make[1]: Leaving directory '/home/spam/Public/aliceml/make'
make: *** [Makefile:241: all] Error 2

The issue seems to be with Gecode kernel. How can I "recompile with -fPIC"? Any ideas?

If I look into the /distro/bin folder I can already see many binaries built successfully:

-rwxr-xr-x 1 spam spam    68 Nov 15 12:42 alice
-r-xr-xr-x 1 spam spam    75 Nov 15 12:31 alicec
-rwxr-xr-x 1 spam spam  2735 Nov 15 12:42 alice-config
-r-xr-xr-x 1 spam spam    66 Nov 15 12:31 alicedep
-rwxr-xr-x 1 spam spam    56 Nov 15 12:42 alicegtkbuilder
-rwxr-xr-x 1 spam spam    75 Nov 15 12:42 alicelex
-r-xr-xr-x 1 spam spam    66 Nov 15 12:31 alicelink
-rwxr-xr-x 1 spam spam   656 Nov 15 12:42 aliceremote
-rwxr-xr-x 1 spam spam  1901 Nov 15 12:42 alicerun
-rwxr-xr-x 1 spam spam  2839 Nov 15 12:42 alicetool
-rwxr-xr-x 1 spam spam    76 Nov 15 12:42 aliceyacc
-rwxr-xr-x 1 spam spam 16568 Nov 15 12:41 seam
-rwxr-xr-x 1 spam spam  4311 Nov 15 12:41 seamtool

Am I missing anything significant? Could I use an alternate to make all that excludes the Gecode stuff?

Internal exception running 'send more money' constraint example

This is an import of doublec/aliceml#1 from the previous repository.

When running the constraint example from the Alice website an internal exception occurs:

...
import structure Search from "x-alice:/lib/gecode/Search"
Search.searchAll money  ;
### loaded signature from x-alice:/lib/gecode/Search
Internal exception
  Io {cause = Native (_val), function = "load",
   name =
      "distro/share/alice/lib/gecode/UnsafeGecode.dll"}
  while linking
      x-alice:/lib/gecode/UnsafeGecode

This is due to shared libraries needed by UnsafeGecode.dll not being in the library load path:

$ ldd UnsafeGecode.dll |grep "not found"
    libgecodekernel.so.8 => not found
    libgecodeint.so.8 => not found
    libgecodeset.so.8 => not found
    libseam.so.0 => not found
    libseam.so.0 => not found

Adding gecode/install/lib/ and distro/lib to the LD_LIBRARY_PATH fixes this issue. The build process should perhaps move the gecode/install/lib into distro/lib and include instructions to add distro/lib to the LD_LIBRARY_PATH and equivalent on Mac OS X.

Build fails when using smlnj versions from v110.83

The version of smlnj used with Homebrew on Mac OS is v110.99.3. Since v110.83 There has been the addition of a Word8Buffermodule which clashes with a module with the same name in the AliceML implementation. The error during compilation is:

../compiler/top/main-seam.cm:6.5-6.31 Error: structure Word8Buffer imported from $SMLNJ-BASIS/(basis.cm):basis-common.cm@1356324(word8-buffer.sml) and also from (main-seam.cm):../compiler/top/(main-seam.cm):../backend-seam/(sources.cm):NJ/Word8Buffer.sml

Trailing space in console prevents command from being evaluated

This is an import of doublec/aliceml#5 from the previous repository.

Entering code without a trailing space after the semicolon works fine in the interactive console when pressing enter:

1+2;<enter>
val it : int = 2

Adding a trailing space followed by a newline causes the console to wait for further input. Only another semicolon appears to cause the first line to be processed:

1+2;<space><enter>
;
val it : int = 2

Unpickled proxy function call fails with Hole.Hole exception

This is an import of doublec/aliceml#2 from the previous repository.

If an alice instance unpickles and calls a proxy function it will sometimes fail with a Hole.Hole exception. To reproduce, in alice instance A do:

val f = Remote.proxy (fn s => print (s ^ "\n"));
Pickle.save ("/tmp/a.pickle", pack (val it = f) : (val it : string -> unit));  

In alice instance B do:

structure H = unpack Pickle.load "/tmp/a.pickle" : (val it : string -> unit);
H.it "foo";

The exception gets raised in instance B:

Uncaught exception
   Hole.Hole

If the Remote structure is used in instance B before calling the deserialized proxy function then it works fine:

await Remote.port;
H.it "foo";

This can be any use of Remote. Opening it, calling a function in it, etc. It seems like something in Remote needs to be initialized that doesn't occur when just deserializing and calling the proxy function.

Out of Bounds access in MyNativeAuthoring.hh

Coverity CID 140909. See Issue #11 for details on the scan results.

In MyNativeAuthoring.hh the DEFINE17 macro calls Scheduler::GetCurrentArg with the value 16. This indexes into Scheduler::currentArgs with the value 16. The size of that array is 16 which results in a buffer overflow by indexing one past the size of the array.

It looks like DEFINE17 was added during the Gtk refactoring but the size of the array in the scheduler was increased to match. DEFINE17 is used in NativeGdk.cc (an automatically generated file) for the function Gdk_PixbufcompositeColor.

LargeWord.toIntX overflows unexpectedly

Int.minInt (Int31.minInt) would be represented as 0wxc0000000 in LargeWord (Word32), but AliceML's LargeWord.toIntX cannot produce Int.minInt.

- Int.precision;
val it : int option = SOME 31
- LargeWord.wordSize;
val it : int = 32
- LargeWord.toIntX (LargeWord.<< (Word.toLarge 0wxc0, 0w24));
Uncaught exception
   Overflow

(I used 0wxc0 << 0w24 instead of 0wxc0000000 because 0wxc0000000 is out of range in AliceML.)

SML/NJ can:

- Int.precision;
val it = SOME 31 : int option
- LargeWord.wordSize;
val it = 32 : int
- LargeWord.toIntX 0wxc0000000;
val it = ~1073741824 : int
- LargeWord.toIntX (LargeWord.<< (Word.toLarge 0wxc0, 0w24));
val it = ~1073741824 : int

SML Basis Library spec says that "they raise Overflow if the target integer value cannot be represented as an Int.int" and does not say "only if", but it is natural to expect that toIntX should not raise exception if the operand can be represented as Int.int.

Missing return statements

Coverity picked up a number of missing return statements. See Issue #11 for details on the scan results. The following CID's are covered by this issue:

  • 140853
  • 140854
  • 140855
  • 140856
  • 140857
  • 140858
  • 140859

Replace downloading of gecode source with a submodule

The current build system downloads a gecode source archive, applies patches to build with recent GCC versions, and builds. This should be replaced with a git submodule set to the right gecode version and with patches applied. This removes the need to do downloads during make (which the Nix package system doesn't like) and might make it easier to update to newer gecode versions.

Using 'use' changes the current directory

Minor problem when using use to evaluate a source file in a subdirectory:

- OS.FileSys.getDir ();
### loaded signature from x-alice:/lib/system/OS
val it : string = "/tmp"
- use "sub/a.sml";
val it : unit = ()
### evaluating file /tmp/sub/a.sml
- OS.FileSys.getDir ();
val it : string = "/tmp/sub"

I don't know whether there is a rationale for this behavior, but a little bit confusing.

Installation on Ubuntu 19.04 (32 bit, i686)

To install Alice ML on Ubuntu 19.04 with 32-bit i686 architecture, I had to make the following changes:

  1. Install the recommended packages, renaming libc6-dev-i386 to libc6-dev (add to README.md?)

  2. Install an old version of GNU Lightning (add to README.md?):

wget http://launchpadlibrarian.net/35291775/lightning_1.2-8_i386.deb
sudo dpkg -i lightning_1.2-8_i386.deb
  1. Under ALICE_ROOT/seam-support, change build.sh to support i686 (include this patch?):
diff --git a/build.sh b/build.sh
index 9106e4d..3bf89b6 100755
--- a/build.sh
+++ b/build.sh
@@ -28,6 +28,11 @@ case `uname -sm` in
        CC=gcc
         LIBTOOLIZE=libtoolize
        ;;
+       *i686*)
+       LIGHTNING=0
+       CC=gcc
+        LIBTOOLIZE=libtoolize
+       ;;
     *)
        CC=gcc
        ;;

This allowed me to get the gui going (!). As a final note, I could not get the FFI working. As an example:

cd alice/sources/test/bench
make
alice -g
> import "AliceTimer";
### reading signature from file:/home/marcle/src/aliceml/alice/sources/test/bench/AliceTimer.asig
AliceTimer.asig:5.27-5.31: unknown type `unit'

Any suggestions?

Sincerely, Mark.

Running make twice results in a build where Explorer tool fails

After a make setup and make all running the follow example displays the Explorer tool as expected:

import structure FD from "x-alice:/lib/gecode/FD"
import structure Modeling from "x-alice:/lib/gecode/Modeling"
import structure Explorer from "x-alice:/lib/tools/Explorer";

open Modeling
fun palindrome sp =
   let
      val a = FD.intvar(sp, #[(0,999999)])
      val b = FD.intvar(sp, #[(100,999)])
      val c = FD.intvar(sp, #[(100,999)])
      val x = FD.intvar(sp, #[(0,9)])
      val y = FD.intvar(sp, #[(0,9)])
      val z = FD.intvar(sp, #[(0,9)])
   in
      FD.mult (sp, b, c, a, FD.DOM); 
      post (sp, FD(a) `= (FD(x) `* `100000) `+
                         (FD(y) `* `10000) `+
                         (FD(z) `* `1000) `+
                         (FD(z) `* `100) `+
                         (FD(y) `* `10) `+
                         FD(x), FD.DOM);
      post (sp, FD(a) `> `100000, FD.DOM);
      branch (sp, #[FD(x),FD(y),FD(z),FD(b),FD(c)], FD.B_SIZE_MIN, FD.B_MAX);
      {a,b,c}
   end

val _ = Explorer.exploreOne palindrome;

If that's saved in a file "x.aml" then the following shows the Explorer:

$ alice
- use "x.aml";
...explorer shows...

If a second 'make all' is done, without a clean first, then running the same example gives a type error:

$ cd make
$ make all
$ alice
- use "x.aml";
Failure type-checking 
   x-alice:/lib/tools/Explorer
as requested by 
   file:/home/chris/src/alice/foo/
because
   structure Explorer
does not match, because
   structure ExplorerMain
does not match, because
   val initScript' : _dynamic.typ -> (space -> 'a) -> _dynamic.explorer
does not match
   val initScript' : Type.typ -> (space -> 'a) -> Explorer.ExplorerMain.explorer
because
   _dynamic.typ
is incompatible with
   Type.typ

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.