summaryrefslogtreecommitdiffstats
path: root/fickle/examples/wc2.fcl
diff options
context:
space:
mode:
Diffstat (limited to 'fickle/examples/wc2.fcl')
-rw-r--r--fickle/examples/wc2.fcl102
1 files changed, 102 insertions, 0 deletions
diff --git a/fickle/examples/wc2.fcl b/fickle/examples/wc2.fcl
new file mode 100644
index 0000000..e887003
--- /dev/null
+++ b/fickle/examples/wc2.fcl
@@ -0,0 +1,102 @@
+%{
+#!/usr/bin/tclsh
+
+# Counts characters, words, and lines, with support for multiple
+# filenames.
+
+# This is based upon example 'ch2-03.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/.
+
+set charCount 0
+set wordCount 0
+set lineCount 0
+
+%}
+
+%option noheaders
+
+word [^ \t\n]+
+eol \n
+
+%%
+
+{word} { incr ::wordCount; incr ::charCount $yyleng }
+{eol} { incr ::charCount; incr ::lineCount }
+. { incr ::charCount }
+
+%%
+
+# lexer calls yywrap to handle EOF conditions (e.g., to
+# connect to a new file, as we do in this case.)
+proc yywrap {} {
+ set file ""
+ if {$::currentFile != 0 && $::nFiles > 1 && $::currentFile < $::nFiles} {
+ # print out statstics for previous file
+ puts [format "%8u %8u %8u %s" $::lineCount $::wordCount $::charCount \
+ [lindex $::fileList [expr {$::currentFile - 1}]]]
+ incr ::totalCC $::charCount
+ incr ::totalWC $::wordCount
+ incr ::totalLC $::lineCount
+ set ::charCount 0
+ set ::wordCount 0
+ set ::lineCount 0
+ close $::yyin
+ }
+ while {$::currentFile < $::nFiles} {
+ if {[catch {open [lindex $::fileList $::currentFile] r} file]} {
+ puts stderr "could not open [lindex $::fileList $::currentFile]"
+ incr ::currentFile
+ } else {
+ set ::yyin $file
+ incr ::currentFile
+ break
+ }
+ }
+ if {$file != ""} {
+ return 0 ;# 0 means there's more input
+ } else {
+ return 1
+ }
+}
+
+set fileList ""
+set currentFile 0
+set nFiles 0
+set totalCC 0
+set totalWC 0
+set totalLC 0
+
+set fileList $argv
+set nFiles [llength $argv]
+
+if {[llength $argv] == 1} {
+ # handle single file case differenly since we don't need to print a
+ # summary line
+ set currentFile 1
+ if {[catch {open [lindex $argv 0] r} file]} {
+ puts stderr "could not open file [lindex $argv 0]"
+ exit 1
+ }
+ set yyin $file
+}
+if {[llength $argv] > 1} {
+ yywrap
+}
+
+yylex
+
+# handle zero or one file differently from multiple files
+if {[llength $argv] > 1} {
+ puts [format "%8u %8u %8u %s" $lineCount $wordCount $charCount \
+ [lindex $argv [expr {$currentFile - 1}]]]
+ incr totalCC $charCount
+ incr totalWC $wordCount
+ incr totalLC $lineCount
+ puts [format "%8u %8u %8u total" $totalLC $totalWC $totalCC]
+} else {
+ puts [format "%8u %8u %8u" $lineCount $wordCount $charCount]
+}
+
+return 0