/**
 * Simple Example on Using JLex -- Java Version of LEX
 */
import java.io.*;
import java.util.Vector;

class Yytoken extends Object {
    public int code;
    // To do...
}

%%

%full

%{
    int w = 0;  // Number of words
    int c = 0;  // Number of characters
    int l = 0;  // Number of lines

//
//-------------------------------------------------------------
    int v = 0;  // Number of consts
//-------------------------------------------------------------
//

    Vector vec = new Vector();

    public static void main(String args[]) {
        Reader reader;
        try {
            if (args.length == 0) {
                reader = new InputStreamReader(System.in);
            } else {
                reader = new FileReader(args[0]);
            }

            Yylex scanner = new Yylex(reader);
            scanner.yylex();

            System.out.println(
                "Words: " + scanner.w +
                ", characters: " + scanner.c +
                ", lines: " + scanner.l
            );

//
//-----------------------------------------------------------
            System.out.println("Number of const: " + scanner.v);
            System.out.print("Const: ");
            for (int i = 0; i < scanner.v; i++) {
                 System.out.print(scanner.vec.elementAt(i) + "    ");
            }
//-----------------------------------------------------------
//

        } catch (IOException e) {
            System.out.println("I/O error: " + e);
        }
    }
%}

LETTER          [A-Za-z]
SIGN            ((\+|\-)?)
EXP             ((e|E)(\+|\-)?([0-9]+))
INTEGER         ((\+|\-)?([0-9]+))
DOUBLE          (\+|\-)?(([0-9]+\.[0-9]*)|(\.[0-9]+))


%%

({DOUBLE}{EXP}?)|({SIGN}{EXP})|({INTEGER}{EXP}) {v++; vec.addElement(yytext()); c+=yytext().length();}
{LETTER}+                           { w++; c += yytext().length(); }
\r\n                                { c++; l++; }
\n                                  { c++; l++; }
.                                   { c++; }
