summaryrefslogtreecommitdiff
path: root/ipl/procs/tokgen.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/procs/tokgen.icn')
-rw-r--r--ipl/procs/tokgen.icn376
1 files changed, 376 insertions, 0 deletions
diff --git a/ipl/procs/tokgen.icn b/ipl/procs/tokgen.icn
new file mode 100644
index 0000000..aa92811
--- /dev/null
+++ b/ipl/procs/tokgen.icn
@@ -0,0 +1,376 @@
+############################################################################
+#
+# File: tokgen.icn
+#
+# Subject: Procedures for token counting
+#
+# Author: Ralph E. Griswold
+#
+# Date: May 23, 1996
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# These procedures are for use with code produced by a meta-translator.
+# The result of linking these procedures with a program
+# translated by standard the meta-translator and executing the
+# result is a tabulation of the tokens in the program.
+#
+############################################################################
+#
+# Bug: The invocable declaration is not handled properly. "invocable all"
+# will get by, but some other forms produce syntax errors. The
+# problem is in the meta-translator itself, not in this
+# program.
+#
+############################################################################
+#
+# Links: showtbl
+#
+############################################################################
+
+link showtbl
+
+global binops, unops, vars, controls, procs, others, keys
+global clits, ilits, rlits, slits
+global summary, globals, locals, statics, declarations, fields, files, parms
+global fldref
+global all # kludge -- invocable is not handled properly
+
+procedure main()
+ local names, tables, i, total, count
+
+ total := 0 # total number of tokens
+
+ # Build a list of tables for the different types of tokens. The order
+ # of the tables determines the order of output.
+
+ tables := []
+ every put(tables, (unops | binops | others | controls | keys | clits |
+ ilits | rlits | slits | vars | fldref | declarations | globals |
+ locals | statics | parms | fields | files) := table(0))
+
+ # Create a list of names for the different types of tokens. The order
+ # of the names must correspond to the order of the tables above.
+
+ names := ["Unary operators", "Binary operators", "Other operations",
+ "Control structures", "Keywords", "Cset literals", "Integer literals",
+ "Real literals", "String literals", "Variable references",
+ "Field references", "Declarations", "Globals", "Locals", "Statics",
+ "Procedure parameters", "Record fields", "Included files"]
+
+ # Call the procedure corresponding to the target program.
+ # It adds the token counts to the tables.
+
+ Mp()
+
+ every i := 1 to *names do {
+ count := showtbl(names[i],tables[i])[1]
+ total +:= count
+ write("\n", right(count, 8), " total")
+ }
+ write("\nTotal tokens: ", total)
+
+end
+
+procedure Alt(e1, e2) # e1 | e2
+ controls["e1 | e2"] +:= 1
+ return
+end
+
+procedure Apply(e1, e2) # e1 ! e2
+ binops["e1 ! e2"] +:= 1
+ return
+end
+
+procedure Arg(s)
+ return s
+end
+
+procedure Asgnop(op, e1, e2) # e1 op e2
+ binops["e1 " || op || " e2"] +:= 1
+ return
+end
+
+procedure Augscan(e1, e2) # e1 ?:= e2
+ controls["e1 ?:= e2"] +:= 1
+ return
+end
+
+procedure Bamper(e1, e2) # e1 & e2
+ binops["e1 & e2"] +:= 1
+ return
+end
+
+procedure Binop(s)
+ binops["e1 " || s || " e2"] +:= 1
+ return
+end
+
+procedure Body(s[]) # procedure body
+ return
+end
+
+procedure Break(e) # break e
+ controls["break e"] +:= 1
+ return
+end
+
+procedure Case(e, clist) # case e of { caselist }
+ controls["case"] +:= 1
+ return
+end
+
+procedure Cclause(e1, e2) # e1 : e2
+ controls["case selector"] +:= 1
+ return
+end
+
+procedure Clist(e1, e2) # e1 ; e2 in case list
+ return
+end
+
+procedure Clit(s)
+ clits[image(s)] +:= 1
+ return
+end
+
+procedure Compound(es[]) # { e1; e2; ... }
+ every controls["{...}"] +:= 1
+ return
+end
+
+procedure Create(e) # create e
+ controls["create e"] +:= 1
+ return
+end
+
+procedure Default(e) # default: e
+ controls["default"] +:= 1
+ return
+end
+
+procedure End() # end
+ return
+end
+
+procedure Every(e) # every e
+ controls["every e"] +:= 1
+ return
+end
+
+procedure EveryDo(e1, e2) # every e1 do e2
+ controls["every e1 do e2"] +:= 1
+ return
+end
+
+procedure Fail() # fail
+ controls["fail"] +:= 1
+ return
+end
+
+procedure Field(e1, e2) # e . f
+ binops["e1 . e2"] +:= 1
+ fldref[e2] +:= 1
+ return
+end
+
+procedure Global(vs[]) # global v1, v2, ...
+ every globals[!vs] +:= 1
+ declarations["global"] +:= *vs # each name counts as a declaration
+ return
+end
+
+procedure If(e1, e2) # if e1 then e2
+ controls["if e1 then e2"] +:= 1
+ return
+end
+
+procedure IfElse(e1, e2, e3) # if e1 then e2 else e3
+ controls["if e1 then e2 else e3"] +:= 1
+ return
+end
+
+procedure Ilit(s)
+ ilits[s] +:= 1
+ return
+end
+
+procedure Initial(s) # initial e
+ controls["initial"] +:= 1
+ return
+end
+
+procedure Invocable(es[]) # invocable ... (problem)
+ declarations["invocable"] +:= 1
+ return
+end
+
+procedure Invoke(e0, es[]) # e0(e1, e2, ...)
+ others["e(...)"] +:= 1
+ return
+end
+
+procedure Key(s)
+ keys["&" || s] +:= 1
+ return
+end
+
+procedure Limit(e1, e2) # e1 \ e2
+ controls["e1 \\ e2"] +:= 1
+ return
+end
+
+procedure Link(vs[]) # link "v1, v2, ..."
+ every files[!vs] +:= 1
+ declarations["link"] +:= *vs # each file counts as a declaration
+ return
+end
+
+procedure List(es[]) # [e1, e2, ... ]
+ others["[...]"] +:= 1
+ return
+end
+
+procedure Local(vs[]) # local v1, v2, ...
+ every locals[!vs] +:= 1
+ declarations["local"] +:= *vs # each name counts as a declaration
+ return
+end
+
+procedure Next() # next
+ controls["next"] +:= 1
+ return
+end
+
+procedure Not(e) # not e
+ controls["not e"] +:= 1
+ return
+end
+
+procedure Null() # &null
+ return
+end
+
+procedure Paren(es[]) # (e1, e2, ... )
+ if *es > 1 then others["(...)"] +:= 1
+ return
+end
+
+procedure Pdco(e0, es[]) # e0{e1, e2, ... }
+ others["e{...}"] +:= 1
+ return
+end
+
+procedure Proc(s, es[]) # procedure s(v1, v2, ...)
+ local p
+
+ every parms[\!es] +:= 1 do
+ declarations["procedure"] +:= 1
+ return
+end
+
+procedure Record(s, es[]) # record s(v1, v2, ...)
+ every fields[\!es] +:= 1
+ declarations["record"] +:= 1
+ return
+end
+
+procedure Repeat(e) # repeat e
+ controls["repeat e"] +:= 1
+ return
+end
+
+procedure Return(e) # return e
+ controls["return e"] +:= 1
+ return
+end
+
+procedure Rlit(s)
+ rlits[s] +:= 1
+ return
+end
+
+procedure Scan(e1, e2) # e1 ? e2
+ controls["e1 ? e2"] +:= 1
+ return
+end
+
+procedure Section(op, e1, e2, e3) # e1[e2 op e3]
+ others["e1[e2" || op || "e3]"] +:= 1
+ return
+end
+
+procedure Slit(s)
+ slits[image(s)] +:= 1
+ return
+end
+
+procedure Static(ev[]) # static v1, v2, ..
+ every statics[!ev] +:= 1
+ declarations["static"] +:= *ev # each name counts as a declaration
+ return
+end
+
+procedure Subscript(e1, e2) # e1[e2]
+ binops["e1[e2]"] +:= 1
+ return
+end
+
+procedure Suspend(e) # suspend e
+ controls["suspend e"] +:= 1
+ return
+end
+
+procedure SuspendDo(e1, e2) # suspend e1 do e2
+ controls["suspend e1 do e2"] +:= 1
+ return
+end
+
+procedure To(e1, e2) # e1 to e2
+ others["e1 to e2"] +:= 1
+ return
+end
+
+procedure ToBy(e1, e2, e3) # e1 to e2 by e3
+ others["e1 to e2 by e3"] +:= 1
+ return
+end
+
+procedure Repalt(e) # |e
+ controls["|e"] +:= 1
+ return
+end
+
+procedure Unop(s) # op e (op may be compound)
+ every unops[!s || "e"] +:= 1
+ return
+end
+
+procedure Until(e) # until e
+ controls["until e"] +:= 1
+ return
+end
+
+procedure UntilDo(e1, e2) # until e1 do e2
+ controls["until e1 do e2"] +:= 1
+ return
+end
+
+procedure Var(s)
+ vars[s] +:= 1
+ return
+end
+
+procedure While(e) # while e
+ controls["while e"] +:= 1
+ return
+end
+
+procedure WhileDo(e1, e2) # while e1 do e2
+ controls["while e1 do e2"] +:= 1
+ return
+end