GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
############################################################################# ## #W parse.gi OpenMath Package Andrew Solomon #W Marco Costantini ## #Y Copyright (C) 1999, 2000, 2001, 2006 #Y School Math and Comp. Sci., University of St. Andrews, Scotland #Y Copyright (C) 2004, 2005, 2006 Marco Costantini ## ## The parser reads token/values off the stream and builds GAP objects. ## InstallGlobalFunction(OMgetObjectByteStream, function(inputstream) local stream, obj; # assumes there is at least one byte on stream. stream := rec(next := ReadByte(inputstream), stream := inputstream); # Start -> OMtokenObject object OMtokenEndObject # get the OMtokenObject OMgetToken(stream, OMtokenObject); # parse the object obj := OMparseObject(stream); OMgetToken(stream, OMtokenEndObject); return obj; end); InstallGlobalFunction(OMparseApplication, function(stream) local head, rest, nextob; # first get the OMtokenApp off the stream OMgetToken(stream, OMtokenApp); # # 1. Get the "head" object # the possibilities are: # # 2. Apply the head to the rest # # 1.1 If it's a symbol, look it up and see what it translates to in GAP if OMnextToken(stream) = OMtokenSymbol then head := OMsymLookup(OMgetSymbol(stream)); else head := OMparseObject(stream); fi; # get the rest rest := []; while OMnextToken(stream) <> OMtokenEndApp do nextob := OMparseObject(stream); Append(rest, [nextob]); od; # finally get the OMtokenEndApp off the stream OMgetToken(stream, OMtokenEndApp); return head( rest ); end); # just ignore everything but the object InstallGlobalFunction(OMparseAttribution, function(stream) local nextob, ob; # first get the OMtokenAttr off the stream OMgetToken(stream, OMtokenAttr); # now get the OMtokenAtp off the stream OMgetToken(stream, OMtokenAtp); # just read all the objects until the end of attribution while OMnextToken(stream) <> OMtokenEndAtp do nextob := OMparseObject(stream); od; # get the OMtokenEndAtp off the stream OMgetToken(stream, OMtokenEndAtp); # finally, the only thing we don't ignore - the unattributed object ob := OMparseObject(stream); OMgetToken(stream, OMtokenEndAttr); return ob; end); InstallGlobalFunction(OMparseBind, function(stream) Error("Binding is unimplemented"); end); InstallGlobalFunction(OMparseObject, function(stream) ## ## Object -> symbol | variable | integer | float | string | bytearray | ## application | binding | error | attribution # first the basic objects if OMnextToken(stream) = OMtokenSymbol then # this is just a nullary symbol return OMsymLookup(OMgetSymbol(stream)); elif OMnextToken(stream) = OMtokenVar then return OMgetVar(stream); elif OMnextToken(stream) = OMtokenInteger then return OMgetInteger(stream); elif OMnextToken(stream) = OMtokenFloat then Error("GAP doesn't support floating point numbers."); elif OMnextToken(stream) = OMtokenString then return OMgetString(stream); elif OMnextToken(stream) = OMtokenByteArray then Error("GAP doesn't support byte arrays."); # now the compound objects elif OMnextToken(stream) = OMtokenApp then return OMparseApplication(stream); elif OMnextToken(stream) = OMtokenBind then return OMparseBind(stream); elif OMnextToken(stream) = OMtokenError then Error("OMtokenError encountered"); elif OMnextToken(stream) = OMtokenAttr then return OMparseAttribution(stream); else Error("unrecognized token ", OMnextToken(stream)); fi; end); ############################################################################# #E