home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / imt / procs / tokgen.icn < prev   
Text File  |  1994-10-01  |  8KB  |  373 lines

  1. ############################################################################
  2. #
  3. #    File:     tokengen.icn
  4. #
  5. #    Subject:  Procedures for token counting
  6. #
  7. #    Author:   Ralph E. Griswold
  8. #
  9. #    Date:     September 4, 1994
  10. #
  11. ############################################################################
  12. #
  13. #  These procedures are for use with code produced by a meta-translator.
  14. #  The result of linking these procedures with a program
  15. #  translated by standard the meta-translator and executing the
  16. #  result is a tabulation of the tokens in the program.
  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-translator itself, not in this
  23. #     program.
  24. #
  25. ############################################################################
  26. #
  27. #  Links:  showtbl
  28. #
  29. ############################################################################
  30.  
  31. link showtbl
  32.  
  33. global binops, unops, vars, controls, procs, others, keys
  34. global clits, ilits, rlits, slits
  35. global summary, globals, locals, statics, declarations, fields, files, parms
  36. global fldref
  37. global all            # kludge -- invocable is not handled properly
  38.  
  39. procedure main()
  40.    local names, tables, i, total, count
  41.  
  42.    total := 0            # total number of tokens
  43.  
  44.    #  Build a list of tables for the different types of tokens.  The order
  45.    #  of the tables determines the order of output.
  46.  
  47.    tables := []
  48.    every put(tables, (unops | binops | others | controls | keys | clits |
  49.       ilits | rlits | slits | vars | fldref | declarations | globals |
  50.       locals | statics | parms | fields | files) := table(0))
  51.  
  52.    #  Create a list of names for the different types of tokens.  The order
  53.    #  of the names must correspond to the order of the tables above.
  54.  
  55.    names := ["Unary operators", "Binary operators", "Other operations", 
  56.       "Control structures", "Keywords", "Cset literals", "Integer literals",
  57.       "Real literals", "String literals", "Variable references",
  58.       "Field references", "Declarations", "Globals", "Locals", "Statics",
  59.       "Procedure parameters", "Record fields", "Included files"]
  60.  
  61.    #  Call the procedure corresponding to the target program.
  62.    #  It adds the token counts to the tables.
  63.  
  64.    Mp()
  65.  
  66.    every i := 1 to *names do {
  67.       count := showtbl(names[i],tables[i])[1]
  68.       total +:= count
  69.       write("\n", right(count, 8), "   total")
  70.       }
  71.    write("\nTotal tokens: ", total)
  72.  
  73. end
  74.  
  75. procedure Alt(e1, e2)            # e1 | e2
  76.    controls["e1 | e2"] +:= 1
  77.    return
  78. end
  79.  
  80. procedure Apply(e1, e2)        # e1 ! e2
  81.    binops["e1 ! e2"] +:= 1
  82.    return
  83. end
  84.  
  85. procedure Arg(s)
  86.    return s
  87. end
  88.  
  89. procedure Asgnop(op, e1, e2)        # e1 op e2
  90.    binops["e1 " || op || " e2"] +:= 1
  91.    return
  92. end
  93.  
  94. procedure Augscan(e1, e2)        # e1 ?:= e2
  95.    controls["e1 ?:= e2"] +:= 1
  96.    return
  97. end
  98.  
  99. procedure Bamper(e1, e2)        # e1 & e2
  100.    binops["e1 & e2"] +:= 1
  101.    return
  102. end
  103.  
  104. procedure Binop(s)
  105.    binops["e1 " || s || " e2"] +:= 1
  106.    return
  107. end
  108.  
  109. procedure Body(s[])            # procedure body
  110.    return
  111. end
  112.  
  113. procedure Break(e)            # break e
  114.    controls["break"] +:= 1
  115.    return
  116. end
  117.  
  118. procedure Case(e, clist)        # case e of { caselist }
  119.    controls["case"] +:= 1
  120.    return
  121. end
  122.  
  123. procedure Cclause(e1, e2)        # e1 : e2
  124.    controls["case selector"] +:= 1
  125.    return
  126. end
  127.  
  128. procedure Clist(e1, e2)        # e1 ; e2 in case list
  129.    return
  130. end
  131.  
  132. procedure Clit(s)
  133.    clits[image(s)] +:= 1
  134.    return
  135. end
  136.  
  137. procedure Compound(es[])        # { e1; e2; ... }
  138.    every controls["{...}"] +:= 1
  139.    return
  140. end
  141.  
  142. procedure Create(e)            # create e
  143.    controls["create e"] +:= 1
  144.    return
  145. end
  146.  
  147. procedure Default(e)            # default: e
  148.    controls["default"] +:= 1
  149.    return
  150. end
  151.  
  152. procedure End()            # end
  153.    return
  154. end
  155.  
  156. procedure Every(e)            # every e
  157.    controls["every e"] +:= 1
  158.    return
  159. end
  160.  
  161. procedure EveryDo(e1, e2)        # every e1 do e2
  162.    controls["every e1 do e2"] +:= 1
  163.    return
  164. end
  165.  
  166. procedure Fail()            # fail
  167.    controls["fail"] +:= 1
  168.    return
  169. end
  170.  
  171. procedure Field(e1, e2)        # e . f
  172.    binops["e1 . e2"] +:= 1
  173.    fldref[e2] +:= 1
  174.    return
  175. end
  176.  
  177. procedure Global(vs[])            # global v1, v2, ...
  178.    every globals[!vs] +:= 1
  179.    declarations["global"] +:= *vs    # each name counts as a declaration
  180.    return
  181. end
  182.  
  183. procedure If(e1, e2)            # if e1 then e2
  184.    controls["if e1 then e2"] +:= 1
  185.    return
  186. end
  187.  
  188. procedure IfElse(e1, e2, e3)        # if e1 then e2 else e3
  189.    controls["if e1 then e2 else e3"] +:= 1
  190.    return
  191. end
  192.  
  193. procedure Ilit(s)
  194.    ilits[s] +:= 1
  195.    return
  196. end
  197.  
  198. procedure Initial(s)            # initial e
  199.    controls["initial"] +:= 1
  200.    return
  201. end
  202.  
  203. procedure Invocable(es[])        # invocable ... (problem)
  204.    declarations["invocable"] +:= 1
  205.    return
  206. end
  207.  
  208. procedure Invoke(e0, es[])        # e0(e1, e2, ...)
  209.    others["e(...)"] +:= 1
  210.    return
  211. end
  212.  
  213. procedure Key(s)
  214.    keys["&" || s] +:= 1
  215.    return
  216. end
  217.  
  218. procedure Limit(e1, e2)        # e1 \ e2
  219.    controls["e1 \\ e2"] +:= 1
  220.    return
  221. end
  222.  
  223. procedure Link(vs[])            # link "v1, v2, ..."
  224.    every files[!vs] +:= 1
  225.    declarations["link"] +:= *vs        # each file counts as a declaration
  226.    return
  227. end
  228.  
  229. procedure List(es[])            # [e1, e2, ... ]
  230.    others["[...]"] +:= 1
  231.    return
  232. end
  233.  
  234. procedure Local(vs[])            # local v1, v2, ...
  235.    every locals[!vs] +:= 1
  236.    declarations["local"] +:= *vs    # each name counts as a declaration
  237.    return
  238. end
  239.  
  240. procedure Next()            # next
  241.    controls["next"] +:= 1
  242.    return
  243. end
  244.  
  245. procedure Not(e)            # not e
  246.    controls["not e"] +:= 1
  247.    return
  248. end
  249.  
  250. procedure Null()            # &null
  251.    return
  252. end
  253.  
  254. procedure Paren(es[])            # (e1, e2, ... )
  255.    if *es > 1 then others["(...)"] +:= 1
  256.    return
  257. end
  258.  
  259. procedure Pdco(e0, es[])        # e0{e1, e2, ... }
  260.    others["e{...}"] +:= 1
  261.    return
  262. end
  263.  
  264. procedure Proc(s, es[])        # procedure s(v1, v2, ...)
  265.    local p
  266.  
  267.    every parms[\!es] +:= 1 do
  268.    declarations["procedure"] +:= 1
  269.    return
  270. end
  271.  
  272. procedure Record(s, es[])        # record s(v1, v2, ...)
  273.     every fields[\!es] +:= 1
  274.     declarations["record"] +:= 1
  275.     return
  276. end
  277.  
  278. procedure Repeat(e)            # repeat e
  279.    controls["repeat e"] +:= 1
  280.    return
  281. end
  282.  
  283. procedure Return(e)            # return e
  284.    controls["return e"] +:= 1
  285.    return
  286. end
  287.  
  288. procedure Rlit(s)
  289.    rlits[s] +:= 1
  290.    return
  291. end
  292.  
  293. procedure Scan(e1, e2)            # e1 ? e2
  294.    controls["e1 ? e2"] +:= 1
  295.    return
  296. end
  297.  
  298. procedure Section(op, e1, e2, e3)    # e1[e2 op  e3]
  299.    others["e1[e2" || op || "e3]"] +:= 1
  300.    return
  301. end
  302.  
  303. procedure Slit(s)
  304.    slits[image(s)] +:= 1
  305.    return
  306. end
  307.  
  308. procedure Static(ev[])            # static v1, v2, ..
  309.    every statics[!ev] +:= 1
  310.    declarations["static"] +:= *ev    # each name counts as a declaration
  311.    return
  312. end
  313.  
  314. procedure Subscript(e1, e2)        # e1[e2]
  315.    binops["e1[e2]"] +:= 1
  316.    return
  317. end
  318.  
  319. procedure Suspend(e)            # suspend e
  320.    controls["suspend e"] +:= 1
  321.    return
  322. end
  323.  
  324. procedure SuspendDo(e1, e2)        # suspend e1 do e2
  325.    controls["suspend e1 do e2"] +:= 1
  326.    return
  327. end
  328.  
  329. procedure To(e1, e2)            # e1 to e2
  330.    others["e1 to e2"] +:= 1
  331.    return
  332. end
  333.  
  334. procedure ToBy(e1, e2, e3)        # e1 to e2 by e3
  335.    others["e1 to e2 by e3"] +:= 1
  336.    return
  337. end
  338.  
  339. procedure Repalt(e)            # |e
  340.    controls["|e"] +:= 1
  341.    return
  342. end
  343.  
  344. procedure Unop(s)            # op e (op may be compound)
  345.    every unops[!s || "e"] +:= 1
  346.    return
  347. end
  348.  
  349. procedure Until(e)            # until e
  350.    controls["until e"] +:= 1
  351.    return
  352. end
  353.  
  354. procedure UntilDo(e1, e2)        # until e1 do e2
  355.    controls["until e1 do e2"] +:= 1
  356.    return
  357. end
  358.  
  359. procedure Var(s)
  360.    vars[s] +:= 1
  361.    return
  362. end
  363.  
  364. procedure While(e)            # while e
  365.    controls["while e"] +:= 1
  366.    return
  367. end
  368.  
  369. procedure WhileDo(e1, e2)        # while e1 do e2
  370.    controls["while e1 do e2"] +:= 1
  371.    return
  372. end
  373.