summaryrefslogtreecommitdiffstats
path: root/fickle/examples/csa.fcl
diff options
context:
space:
mode:
Diffstat (limited to 'fickle/examples/csa.fcl')
-rwxr-xr-xfickle/examples/csa.fcl65
1 files changed, 65 insertions, 0 deletions
diff --git a/fickle/examples/csa.fcl b/fickle/examples/csa.fcl
new file mode 100755
index 0000000..3cd6dc3
--- /dev/null
+++ b/fickle/examples/csa.fcl
@@ -0,0 +1,65 @@
+# $Id: csa.fcl,v 1.1.1.1 2004/07/23 19:22:41 tang Exp $
+
+# Counts the lines of comments, code, and whitespace within a C
+# program.
+
+# This is based upon example 'ch2-09.l' from "lex & yacc" by John
+# R. Levine, Tony Mason, and Doug Brown (by O'Reilly & Associates, ISBN
+# 1-56592-000-7). For more information on using lex and yacc, see
+# http://www.oreilly.com/catalog/lex/.
+
+%{
+#!/usr/bin/tclsh
+
+set comments 0
+set code 0
+set whitespace 0
+
+proc update_count { a b c } {
+ incr ::comments $a
+ incr ::code $b
+ incr ::whitespace $c
+ puts -nonewline "code: $::code, comments: $::comments, whitespace: $::whitespace\r"
+ flush stdout
+}
+
+%}
+
+%option noheaders stack nodefault
+%x COMMENT
+
+%%
+
+^[ \t]*"/*" { BEGIN COMMENT }
+^[ \t]*"/*".*"*/"[ \t]*\n { update_count 1 0 0 }
+<COMMENT>"*/"[ \t]*\n { BEGIN INITIAL; update_count 1 0 0 }
+<COMMENT>"*/" { BEGIN INITIAL }
+<COMMENT>\n { update_count 1 0 0 }
+<COMMENT>.\n { update_count 1 0 0 }
+
+^[ \t]*\n { update_count 0 0 1 }
+
+.+"/*".*"*/".*\n { update_count 0 1 0 }
+.*"/*".*"*/".+\n { update_count 0 1 0 }
+.+"/*".*\n { BEGIN COMMENT; update_count 0 1 0 }
+.\n { update_count 0 1 0 }
+
+<*>. # do nothing
+
+%%
+
+if {[llength $argv] == 0} {
+ puts stderr "C source analyzer needs a filename."
+ exit 0
+}
+
+if {[catch {open [lindex $argv 0] r} yyin]} {
+ puts stderr "Could not open [lindex $argv 0]"
+ exit 0
+}
+
+yylex
+
+close $yyin
+
+puts ""