This example shows the number of lines, words and characters of the given file if the filename is given, or of the standard input if no command arguments are given.
{ }
rule count lines words chars = parse
| '\n' { count (lines+1) words (chars+1) lexbuf }
| [^ ' ' '\t' '\n']+ as word
{ count lines (words+1) (chars+ String.length word) lexbuf }
| _ { count lines words (chars+1) lexbuf }
| eof { (lines, words, chars) }
{
let main () =
let cin =
if Array.length Sys.argv > 1
then open_in Sys.argv.(1)
else stdin
in
let lexbuf = Lexing.from_channel cin in
let (lines, words, chars) = count 0 0 0 lexbuf in
Printf.printf "%d lines, %d words, %d chars\n" lines words chars
let _ = Printexc.print main ()
}