Patch title: Release 84 bulk changes
Abstract:
File: /pliant/language/compiler/expression/expression3.pli
Key:
    Removed line
    Added line
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# 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
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

scope "/pliant/language/" "/pliant/install/"
module "/pliant/install/ring3.pli"


function complex_ident string -> cplx
  arg Str string ; arg CBool cplx
  for (var Int i) 0 string:len-1
    var Char c := string i
    if not ( c>="a" and c<="z" or c>="A" and c<="Z" or c>="0" and c<="9" and i>0 or c="_")
      return true
  return false  

constant to_index (the_function '. to string' Universal Str -> Str):generic_index

function to_string data options function -> string
  arg Universal data ; arg Str options ; arg Function function ; arg Str string
  indirect
  
function to_string expr -> string
  arg Expression expr ; arg Str string
  var Pointer:Type type :> entry_type expr:value
  var Pointer:Function function :> type get_generic_method to_index
  if type=Ident
    string := cast (expr:value map Ident) Str
    if complex_ident:string
      string := "'"+string+"'"
  eif addressof:function<>null and addressof:function<>addressof:(the_function '. to string' Universal Str -> Str)
    string := to_string (expr:value map Universal) "" function
  else
    return "!!!"+(entry_type expr:value):name+"!!!"
  if expr:size=0
    return
  string := "("+string
  for (var Int i) 0 expr:size-1
    string += " "+(to_string expr:i)
  string += ")"

method data 'to string' options -> string
  arg Expression data ; arg Str options string
  string := to_string data


function parse string -> expr
  arg Str string ; arg Link:Expression expr
  var Arrow a
  var Link:List program :> new List
  program append addressof:(new Str "return_expressions ("+string:(cast addressof:a Int)+")")
  program append addressof:(new Str "  [0]left_zero_is_at [dq]"+"[dq] 0 1[0]")
  program append addressof:(new Str "  "+string)
  var Link:Module module :> new Module
  module name := string
  module include the_module:"/pliant/language/basic/safe.pli"
  module include the_module:"/pliant/language/parser/code_generator.pli"
  module include the_module:"/pliant/language/compiler/expression3bis.pli"
  compile_text program module
  expr :> a map Expression


export parse