/pliant/language/parser/multiline.pli
 
 1  # scope "/pliant/language/" "/pliant/install/" 
 2  module "/pliant/install/ring2.pli" 
 3   
 4   
 5  meta 'pliant multiline rewrite' e 
 6    if e:size<or not e:0:is_pure_ident or e:(e:size-1):ident<>"{}" 
 7      return 
 8    var Link:Expression body :> e:size-1 
 9    var (Link List:Str) list :> new List:Str 
 10    for (var Int i) body:size-1 
 11      if (body:constant Str)=null 
 12        return 
 13      list += (body:constant Str) map Str 
 14    var Link:Expression e2 :> new Expression 
 15    e2 := 0 
 16    e2 size := e:size-1 
 17    for (var Int i) e2:size-2 
 18      e2:arguments := addressof (i+1) 
 19    var Link:Expression lst :> new Expression 
 20    lst := e:size-1 
 21    lst size := 0 
 22    lst value := addressof list 
 23    e2:arguments e2:size-:= addressof lst 
 24    e2 compile 
 25    suckup e2 
 26    set_result e2:result e2:access 
 27   
 28  alias 'pliant multiline rewrite' 'pliant multiline rewrite' in "/pliant/language/basic/ultrasafe.pli" 
 29   
 30  function multiline_filter context line keyword 
 31    arg_rw ParserContext context ; arg Str line ; arg Pointer:Str keyword 
 32    var Int := context x 
 33    if (line keyword:len)=keyword and ((context:current_line map Str) x)=(repeat " ") 
 34      var Pointer:Arrow cur :> context:text next context:current_line 
 35      if cur<>null and { var Pointer:Str :> cur map Str ; (x+1)=(repeat x+" ") } 
 36        var Int margin := shunt (x+2)=(repeat x+" "x+x+1 
 37        var Pointer:Arrow base :> cur 
 38        while cur<>null and { var Pointer:Str :> cur map Str ; (margin)=(repeat margin " "or l=(repeat l:len " ") } 
 39          var Str := margin l:len 
 40          if t<>(repeat t:len " ") 
 41            while base<>cur 
 42              var Pointer:Str lb :> base map Str 
 43              lb := (repeat margin " ")+"[dq][dq]" 
 44              base :> context:text next base 
 45            := (repeat margin " ")+string:t 
 46            base :> context:text next cur 
 47          cur :> context:text next cur 
 48        var Link:Ident id :> new Ident ; id := cast "pliant multiline rewrite" Ident 
 49        context add_token addressof:id 
 50        id :> new Ident ; id := cast keyword Ident 
 51        context add_token addressof:id 
 52        context forward keyword:len 
 53   
 54  function multiline_keyword2 name module 
 55    arg Str name ; arg_rw Module module 
 56    var Link:ParserFilter :> new ParserFilter 
 57    function :> the_function multiline_filter ParserContext Str Pointer:Str 
 58    parameter := addressof:(new Str name) 
 59    module define "pliant parser basic types" addressof:f 
 60   
 61  meta multiline_keyword e 
 62    if e:size<>or not e:0:is_pure_ident 
 63      return 
 64    add (instruction (the_function multiline_keyword2 Str Module) (argument constant Str e:0:ident) (argument mapped_constant Module e:module:external)) 
 65    set_void_result 
 66   
 67  export multiline_keyword