| |
| /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<2 or not e:0:is_pure_ident or e:(e:size-1):ident<>"{}" | |
| 7 |
return | |
| 8 |
var Link:Expression body :> e e:size-1 | |
| 9 |
var (Link List:Str) list :> new List:Str | |
| 10 |
for (var Int i) 0 body:size-1 | |
| 11 |
if (body:i constant Str)=null | |
| 12 |
return | |
| 13 |
list += (body:i constant Str) map Str | |
| 14 |
var Link:Expression e2 :> new Expression | |
| 15 |
e2 := e 0 | |
| 16 |
e2 size := e:size-1 | |
| 17 |
for (var Int i) 0 e2:size-2 | |
| 18 |
e2:arguments i := addressof (e i+1) | |
| 19 |
var Link:Expression lst :> new Expression | |
| 20 |
lst := e e:size-1 | |
| 21 |
lst size := 0 | |
| 22 |
lst value := addressof list | |
| 23 |
e2:arguments e2:size-1 := addressof lst | |
| 24 |
e2 compile | |
| 25 |
e suckup e2 | |
| 26 |
e 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 x := context x | |
| 33 |
if (line 0 keyword:len)=keyword and ((context:current_line map Str) 0 x)=(repeat x " ") | |
| 34 |
var Pointer:Arrow cur :> context:text next context:current_line | |
| 35 |
if cur<>null and { var Pointer:Str l :> cur map Str ; (l 0 x+1)=(repeat x+1 " ") } | |
| 36 |
var Int margin := shunt (l 0 x+2)=(repeat x+2 " ") x+2 x+1 | |
| 37 |
var Pointer:Arrow base :> cur | |
| 38 |
while cur<>null and { var Pointer:Str l :> cur map Str ; (l 0 margin)=(repeat margin " ") or l=(repeat l:len " ") } | |
| 39 |
var Str t := l 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 |
l := (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 f :> new ParserFilter | |
| 57 |
f function :> the_function multiline_filter ParserContext Str Pointer:Str | |
| 58 |
f parameter := addressof:(new Str name) | |
| 59 |
module define "pliant parser basic types" addressof:f | |
| 60 |
| |
| 61 |
meta multiline_keyword e | |
| 62 |
if e:size<>1 or not e:0:is_pure_ident | |
| 63 |
return | |
| 64 |
e add (instruction (the_function multiline_keyword2 Str Module) (argument constant Str e:0:ident) (argument mapped_constant Module e:module:external)) | |
| 65 |
e set_void_result | |
| 66 |
| |
| 67 |
export multiline_keyword | |
| |