Using PLY

Maurice LING mauriceling at acm.org
Mon Sep 20 00:23:28 EDT 2004


> 
> Here's a kludgy but quick solution- modify the LexToken class in
> lex.py to keep track of number of type occurences.
> 
> class LexToken(object):  # change to new style class
>     type_count = {}   # store the count here
>     def __setattr__(self, key, value):
>         if key == 'type':
>             # when type attribute is assigned, increment counter
>             if value not in self.type_count:
>                 self.type_count[value] = 1
>             else:
>                 self.type_count[value] += 1
>         object.__setattr__(self, key, value)
> 
>     # ... and proceed with the original definition of LexToken
> 
>     def __str__(self):
>         return "LexToken(%s,%r,%d)" %
> (self.type,self.value,self.lineno)
>     def __repr__(self):
>         return str(self)
>     def skip(self,n):
>         try:
>             self._skipn += n
>         except AttributeError:
>             self._skipn = n
> -----------------------------------------
> 
> After you've run the lexer, lex.LexToken.type_count will the contain
> number of occurences of each token type.
> 
> -----------------------------------------
> 
> (Caveats-  1. I haven't tested this code.   2. I've got PLY 1.3;
> syntax may have changed in newer versions.  In fact, I hope it's
> changed; while PLY works very well, its usage could be way more
> pythonic)

Thank you, it works well. I think this should be included in the next 
release.

I am able to do a "print lex.LexToken.type_count" after each token and 
it did show the incremental numbers of each tokens, except t_ignore.

Thanks again
maurice



More information about the Python-list mailing list