home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / imt / procs / eventgen.icn < prev    next >
Text File  |  1994-10-01  |  7KB  |  492 lines

  1. ############################################################################
  2. #
  3. #    File:     eventget.icn
  4. #
  5. #    Subject:  Program for meta-variant code generation
  6. #
  7. #    Author:   Ralph E. Griswold
  8. #
  9. #    Date:     September 3, 1994
  10. #
  11. ############################################################################
  12. #
  13. #  This program is designed to be linked with the output of the meta-variant
  14. #  translator.
  15. #
  16. #  It is designed to insert event-reporting code in Icon programs.
  17. #
  18. ############################################################################
  19. #
  20. #  Bug:  The invocable declaration is not handled properly.  "invocable all"
  21. #        will get by, but some other forms produce syntax errors.  The
  22. #        problem is in the meta-variant translator itself, not in this
  23. #     program.
  24. #
  25. ############################################################################
  26. #
  27. #  Links:  cat
  28. #
  29. ############################################################################
  30.  
  31. global procname
  32.  
  33. link cat
  34.  
  35. #  main() calls tp(), which is produced by the meta-variant
  36. #  translation.
  37.  
  38. procedure main()
  39.  
  40.    write("$define MAssign 1")
  41.    write("$define MValue 2")
  42.    write("procedure noop()")
  43.    write("end")
  44.  
  45.    Mp()
  46.  
  47. end
  48.  
  49. procedure Alt(e1, e2)            # e1 | e2
  50.  
  51.    return cat("(", e1, "|", e2, ")")
  52.  
  53. end
  54.  
  55. procedure Apply(e1, e2)        # e1 ! e2
  56.  
  57.    return cat("(", e1, "!", e2, ")")
  58.  
  59. end
  60.  
  61. procedure Arg(e)
  62.  
  63.    return e
  64.  
  65. end
  66.  
  67. procedure Asgnop(op, e1, e2)        # e1 op e2
  68.  
  69.    return cat("2(event(MAssign, ", image(e1) , "), ",
  70.       e1, " ", op, " ", e2, ", event(MValue, ", e1, "))")
  71.  
  72. end
  73.  
  74. procedure Augscan(e1, e2)        # e1 ?:= e2
  75.  
  76.    return cat("(", e1, " ?:= ", e2, ")")
  77.  
  78. end
  79.  
  80. procedure Bamper(e1, e2)        # e1 & e2
  81.  
  82.    return cat("(", e1, " & ", e2, ")")
  83.  
  84. end
  85.  
  86. procedure Binop(op, e1, e2)        # e1 op e2
  87.  
  88.    return cat("(", e1, " ",  op, " ",  e2, ")")
  89.  
  90. end
  91.  
  92. procedure Body(s[])            # procedure body
  93.  
  94.    if procname == "main" then
  95.       write("   if &source === &main then event := noop")
  96.  
  97.    every write(!s)
  98.  
  99.    return
  100.  
  101. end
  102.  
  103. procedure Break(e)            # break e
  104.  
  105.    return cat("break ", e)
  106.  
  107. end
  108.  
  109. procedure Case(e, clist)        # case e of { caselist }
  110.  
  111.    return cat("case ", e, " of {", clist, "}")
  112.  
  113. end
  114.  
  115. procedure Cclause(e1, e2)        # e1 : e2
  116.  
  117.    return cat(e1, " : ", e2, "\n")
  118.  
  119. end
  120.  
  121. procedure Clist(e1, e2)        # e1 ; e2 in case list
  122.  
  123.    return cat(e1, ";", e2)
  124.  
  125. end
  126.  
  127. procedure Clit(e)            # 's'
  128.  
  129. #  return cat("'", e, "'")
  130.    return image(e)
  131.  
  132. end
  133.  
  134. procedure Compound(es[])        # { e1; e2; ... }
  135.    local result
  136.  
  137.    if *es = 0 then return "{}\n"
  138.  
  139.    result := "{\n"
  140.    every result ||:= !es || "\n"
  141.  
  142.    return cat(result, "}\n")
  143.  
  144. end
  145.  
  146. procedure Create(e)            # create e
  147.  
  148.    return cat("create ", e)
  149.  
  150. end
  151.  
  152. procedure Default(e)            # default: e
  153.  
  154.    return cat("default: ", e)
  155.  
  156. end
  157.  
  158. procedure End()            # end
  159.  
  160.    write("end")
  161.  
  162.    return
  163.  
  164. end
  165.  
  166. procedure Every(e)            # every e
  167.  
  168.    return cat("every ", e)
  169.  
  170. end
  171.  
  172. procedure EveryDo(e1, e2)        # every e1 do e2
  173.  
  174.    return cat("every ", e1, " do ", e2)
  175.  
  176. end
  177.  
  178. procedure Fail()            # fail
  179.  
  180.    return "fail"
  181.  
  182. end
  183.  
  184. procedure Field(e1, e2)        # e . f
  185.  
  186.    return cat("(", e1, ".", e2, ")")
  187.  
  188. end
  189.  
  190. procedure Global(vs[])        # global v1, v2, ...
  191.    local result
  192.  
  193.    result := ""
  194.    every result ||:= !vs || ", "
  195.  
  196.    write("global ", result[1:-2])
  197.    
  198.    return
  199.  
  200. end
  201.  
  202. procedure If(e1, e2)            # if e1 then e2
  203.  
  204.    return cat("if ", e1, " then ", e2)
  205.  
  206. end
  207.  
  208. procedure IfElse(e1, e2, e3)        # if e1 then e2 else e3
  209.  
  210.    return cat("if ", e1, " then ", e2, " else ", e3)
  211.  
  212. end
  213.  
  214. procedure Ilit(e)            # i
  215.  
  216.    return e
  217.  
  218. end
  219.  
  220. procedure Initial(s)            # initial e
  221.  
  222.    write("initial ", s)
  223.  
  224.    return
  225.  
  226. end
  227.  
  228. procedure Invocable(es[])        # invocable ... (problem)
  229.  
  230.    if \es then write("invocable all")
  231.    else write("invocable ", es)
  232.  
  233.    return
  234.  
  235. end
  236.  
  237. procedure Invoke(e0, es[])        # e0(e1, e2, ...)
  238.    local result
  239.  
  240.    if *es = 0 then return cat(e0, "()")
  241.  
  242.    result := ""
  243.    every result ||:= !es || ", "
  244.  
  245.    return cat(e0, "(", result[1:-2], ")")
  246.  
  247. end
  248.  
  249. procedure Key(s)            # &s
  250.  
  251.    return cat("&", s)
  252.  
  253. end
  254.  
  255. procedure Limit(e1, e2)        # e1 \ e2
  256.  
  257.    return cat("(", e1, "\\", e2, ")")
  258.  
  259. end
  260.  
  261. procedure Link(vs[])            # link "v1, v2, ..."
  262.  
  263.    local result
  264.  
  265.    result := ""
  266.    every result ||:= !vs || ", "
  267.  
  268.    write("link ", result[1:-2])
  269.  
  270.    return
  271.  
  272. end
  273.  
  274. procedure List(es[])            # [e1, e2, ... ]
  275.    local result
  276.  
  277.    if *es = 0 then return "[]"
  278.  
  279.    result := ""
  280.    every result ||:= !es || ", "
  281.  
  282.    return cat("[", result[1:-2], "]")
  283.  
  284. end
  285.  
  286. procedure Local(vs[])            # local v1, v2, ...
  287.    local result
  288.  
  289.    result := ""
  290.    every result ||:= !vs || ", "
  291.  
  292.    write("local ", result[1:-2])
  293.    
  294.    return
  295.  
  296. end
  297.  
  298. procedure Next()            # next
  299.  
  300.    return "next"
  301.  
  302. end
  303.  
  304. procedure Not(e)            # not e
  305.  
  306.    return cat("not(", e, ")")
  307.  
  308. end
  309.  
  310. procedure Null()            # &null
  311.  
  312.    return ""
  313.  
  314. end
  315.  
  316. procedure Paren(es[])            # (e1, e2, ... )
  317.    local result
  318.  
  319.    if *es = 0 then return "()"
  320.  
  321.    result := ""
  322.    every result ||:= !es || ", "
  323.  
  324.    return cat("(", result[1:-2], ")")
  325.  
  326. end
  327.  
  328. procedure Pdco(e0, es[])        # e0{e1, e2, ... }
  329.    local result
  330.  
  331.    if *es = 0 then return cat(e0, "{}")
  332.  
  333.    result := ""
  334.    every result ||:= !es || ", "
  335.  
  336.    return cat(e0, "{", result[1:-2], "}")
  337.  
  338. end
  339.  
  340. procedure Proc(s, es[])        # procedure s(v1, v2, ...)
  341.    local result, e
  342.  
  343.    if *es = 0 then write("procedure ", s, "()")
  344.  
  345.    result := ""
  346.    every e := !es do
  347.       if \e == "[]" then result[-2:0] := e || ", "
  348.       else result ||:= (\e | "") || ", "
  349.  
  350.    write("procedure ", s, "(", result[1:-2], ")")
  351.  
  352.    procname := s            # needed later
  353.  
  354.    return
  355.  
  356. end
  357.  
  358. procedure Record(s, es[])        # record s(v1, v2, ...)
  359.    local result, field
  360.  
  361.    if *es = 0 then write("record ", s, "()")
  362.  
  363.    result := ""
  364.    every field := !es do
  365.       result ||:= (\field | "") || ", "
  366.  
  367.    write("record ", s, "(", result[1:-2], ")")
  368.  
  369.    return
  370.  
  371. end
  372.  
  373. procedure Repeat(e)            # repeat e
  374.  
  375.    return cat("repeat ", e)
  376.  
  377. end
  378.  
  379. procedure Return(e)            # return e
  380.  
  381.    return cat("return ", e)
  382.  
  383. end
  384.  
  385. procedure Rlit(e)
  386.  
  387.    return e
  388.  
  389. end
  390.  
  391. procedure Scan(e1, e2)            # e1 ? e2
  392.  
  393.    return cat("(", e1 , " ? ", e2, ")")
  394.  
  395. end
  396.  
  397. procedure Section(op, e1, e2, e3)    # e1[e2 op  e3]
  398.  
  399.    return cat(e1, "[", e2, op, e3, "]")
  400.  
  401. end
  402.  
  403. procedure Slit(s)            # "s"
  404.  
  405.    return image(s)
  406.  
  407. end
  408.  
  409. procedure Static(ev[])            # static v1, v2, ..
  410.    local result
  411.  
  412.    result := ""
  413.    every result ||:= !ev || ", "
  414.  
  415.    write("static ", result[1:-2])
  416.    
  417.    return
  418.  
  419. end
  420.  
  421. procedure Subscript(e1, e2)        # e1[e2]
  422.  
  423.    return cat(e1, "[", e2, "]")
  424.  
  425. end
  426.  
  427. procedure Suspend(e)            # suspend e
  428.  
  429.    return cat("suspend ", e)
  430.  
  431. end
  432.  
  433. procedure SuspendDo(e1, e2)        # suspend e1 do e2
  434.  
  435.    return cat("suspend ", e1, " do ", e2)
  436.  
  437. end
  438.  
  439. procedure To(e1, e2)            # e1 to e2
  440.  
  441.    return cat("(", e1, " to ", e2, ")")
  442.  
  443. end
  444.  
  445. procedure ToBy(e1, e2, e3)        # e1 to e2 by e3
  446.  
  447.    return cat("(", e1, " to ", e2, " by ", e3, ")")
  448.  
  449. end
  450.  
  451. procedure Repalt(e)            # |e
  452.  
  453.    return cat("(|", e, ")")
  454.  
  455. end
  456.  
  457. procedure Unop(op, e)            # op e
  458.  
  459.    return cat("(", op, e, ")")
  460.  
  461. end
  462.  
  463. procedure Until(e)            # until e
  464.  
  465.    return cat("until ", e)
  466.  
  467. end
  468.  
  469. procedure UntilDo(e1, e2)        # until e1 do e2
  470.  
  471.    return cat("until ", e1, " do ", e2)
  472.  
  473. end
  474.  
  475. procedure Var(s)            # v
  476.  
  477.    return s
  478.  
  479. end
  480.  
  481. procedure While(e)            # while e
  482.  
  483.    return cat("while ", e)
  484.  
  485. end
  486.  
  487. procedure WhileDo(e1, e2)        # while e1 do e2
  488.  
  489.    return cat("while ", e1, " do ", e2)
  490.  
  491. end
  492.