Abstract:
A method of processing a sequence of characters, the method comprising converting the sequence of characters into a sequence of tokens so that each token comprises a lexeme and one of a plurality of token types. Each of the plurality of token types relates to at least one of a plurality of predetermined functions, wherein at least one said token type relates to multiple functions of the plurality of predetermined functions.

Description:
RELATED APPLICATION 
       [0001]    This application claims the benefit of U.S. Provisional Patent Application No. 61/059,720, filed on Jun. 6, 2008, which is herein incorporated by reference. 
     
    
     FIELD OF THE INVENTION 
       [0002]    The present invention relates to the field of processing sequences of characters and, in addition, to detecting data included in such sequences of characters. 
       BACKGROUND OF THE INVENTION 
       [0003]    The processing of sequences of characters to analyze their grammatical structure is well-known, both for analyzing natural languages and computer languages. In the case of natural languages, the sequences of characters are broken down into words, each word forming a part of speech, such as noun, verb, adjective, adverb, preposition and so on. Thus, each word can be allocated a class according to its function in context. 
         [0004]    For the processing of computer languages, it is well known to process the sequence of characters in a lexer to break the characters into a sequence of tokens and then to parse the tokens to create some form of internal representation, which can then be used in a compiler or an interpreter. 
         [0005]    Such processing has previously been used to analyze sequences of characters to extract useful information from the sequence. For example, techniques have been developed to analyze blocks of text, such as e-mails or other data received by or input to a computer, to extract information such as e-mail addresses, telephone and fax numbers, physical addresses, IP addresses, days, dates, times, names, places and so forth. In one implementation, a so-called data detector routinely analyses incoming e-mails to detect such information. The detected information can then be extracted to update the user&#39;s address book or other records. 
         [0006]    Conventionally, such data detection is performed using a layered engine as shown in  FIG. 1 . The engine is embodied in a processor  1  and comprises a lexical analyzer or lexer  10  and a parser  20 . The lexer  10  receives as its input a sequence of characters, such as the characters in an e-mail message. Note that the characters are not limited to letters or even numbers, but may include any other characters, such as punctuation. 
         [0007]    The lexer  10  stores a vocabulary that allows it to resolve the sequence of characters into a sequence of tokens. Each token comprises a lexeme (analogous to a word) and a token type (which describes its class or function). One token type is provided for each predetermined function. As an example, a simple lexer  10  may include the following vocabulary:
   DIGIT:=[0-9] (A digit is a single number from 0 to 9)   NUMBER:=DIGIT+(A number is two or more digits together)   LETTER:=[a-zA-Z] (A letter is an upper or lower case letter from A-Z)   WORD:=LETTER+(A word is two or more letters together)   
 
         [0012]    The lexer  10  would break down the string of characters “There are 2 books and 15 magazines” into the following tokens: 
         [0000]    
       
         
               
               
               
             
           
               
                   
                   
               
               
                   
                 Lexeme 
                 Token Type 
               
               
                   
                   
               
             
             
               
                   
                 THERE 
                 WORD 
               
               
                   
                 ARE 
                 WORD 
               
               
                   
                 2 
                 DIGIT 
               
               
                   
                 BOOKS 
                 WORD 
               
               
                   
                 AND 
                 WORD 
               
               
                   
                 15 
                 NUMBER 
               
               
                   
                 MAGAZINES 
                 WORD 
               
               
                   
                   
               
             
          
         
       
     
         [0013]    The parser  20  receives the sequence of tokens from the lexer  10 . The parser  20  includes a grammar, which it uses to analyze the tokens to extract predetermined data. For example, if the engine  1  is intended to detect all quantities, the parser  20 &#39;s grammar may be that:
   QUANTITY:=DIGIT WORD|NUMBER WORD
 
where “|” indicates “or”. Thus, on receiving the sequence of tokens from the lexer  10 , the parser  20  will return the quantities “2 books” and “15 magazines”.
   
 
         [0015]    Commonly, both the lexer  10  and the parser  20  use a decision tree. An example of such a decision tree for a further example of a lexer  10  is shown in  FIG. 2 . In this case, the lexer  10  includes the following vocabulary:
   a:=1 9 [0-9]{2}   b:=1 9 5
 
where ‘a’ and ‘b’ are two token types that the lexer  10  can ascribe to different lexemes. The decision tree in  FIG. 2  shows  5  possible states in addition to the start state. As the lexer  10  processes a sequence of characters, it checks the first character in the sequence against the options available at the start state S and proceeds according to the result.
   
 
         [0018]    For example, if the lexer  10  is presented with the sequence of characters ‘1984’, it will process the character ‘1’ first. State S only allows the processing to proceed if the first character is ‘1’. This condition is met so character ‘1’ is consumed and processing proceeds to state 1, where the next character in the sequence (‘9’) is compared with the available conditions. It should be noted that state 1 is represented using a dotted circle. This is indicative that processing may not end at this state without the branch dying, as will become apparent later. 
         [0019]    The only available condition at state 1 is that the next character is ‘9’. This condition is met, so character ‘9’ is consumed and processing proceeds to state 2. 
         [0020]    The conditions at state 2 are that processing should proceed to state 3 if the next character is ‘5’, or that it should proceed to state 4 if the next character is any one of 0, 1, 2, 3, 4, 6, 7, 8 or 9. Again, state 2 is represented using a dotted circle and processing may not end at this state. 
         [0021]    The next character is ‘8’, which meets the condition for processing to proceed to state 4, which is also represented by a dotted circle. Accordingly, the ‘8’ is consumed and processing continues. Since the next character in the sequence (‘4’) meets the only available condition from state 4, processing proceeds to state 5. 
         [0022]    State 5 is represented by a solid circle, indicating that processing may end there. As shown in  FIG. 2 , state 5 has the property of reducing the consumed characters to a token of token type ‘a’. In our example, since all the characters have been used up and there are no more characters, processing ends at state 5 and the consumed sequence of characters is reduced to a token comprising the lexeme ‘1984’ and the token type ‘a’. 
         [0023]    Similarly, the lexer  10  in  FIG. 2  would process the sequence of characters ‘195’ as set out below. First, characters ‘1’ and ‘9’ would be consumed in the same manner as described above. However, at state 2, the next character is ‘5’. This meets the condition for proceeding to state 3, which has the property of reducing the consumed characters to a token of token type ‘b’. In this case, since all the characters have been used up and there are no more characters, processing ends at state 3 and the consumed sequence of characters is reduced to a token comprising the lexeme ‘1985’ and the token type ‘b’. 
         [0024]    By contrast, the lexer  10  in  FIG. 2  would process the sequence of characters ‘1955’ as set out below. First, characters ‘1’, ‘9’ and ‘5’ would be consumed in the same manner as described above. However, at state 3, not all the characters have been used up. Rather, a further ‘5’ remains, which meets the condition for proceeding to state 5, where the consumed sequence of characters is reduced to a token comprising the lexeme ‘1955’ and the token type ‘a’. 
         [0025]    Now consider a parser  20  including the following grammar:
   A:=a|ε   E:=Acd|ce
 
where A and E are predetermined grammatical or data categories that we wish to detect; a, c, d and e are various token types; and ε represents a “nothing”. Thus, the parser  20  outputs a category A if either a lexeme with token type ‘a’ is presented or an unmatched token type is presented. Similarly, the parser  20  outputs an E when it processes Acd or ce. However, since the parser  20  outputs an A when presented with a token type ‘a’ or with a nothing, by substituting the equation for A into the equation for E, it can be seen that in practice the parser  20  outputs an E when it processes any of acd, cd and ce. A decision tree for this grammar is shown in  FIG. 3  and includes start state S, finish state F, and processing states 0-5. As the parser  20  processes a sequence of tokens, it checks the first token in the sequence against the options available at the start state S and proceeds according to the result.
   
 
         [0028]    For example, if the parser  20  is presented with the sequence of tokens comprising a token having token type c, followed by a token having token type e, the parser  20  must process the token-type sequence ‘ce’. The following table represents the processing that takes place. 
         [0000]    
       
         
               
               
               
             
           
               
                   
               
               
                 Current state 
                 Sequence to process 
                 Previous states 
               
               
                   
               
             
             
               
                 S 
                 ce 
                   
               
               
                 0 
                 e 
                 S 
               
               
                 1 
                   
                 S, 0 
               
               
                 S 
                 E 
               
               
                 F 
                   
                 S 
               
               
                   
               
             
          
         
       
     
         [0029]    Put simply, proceeding from the start state S, the parser  20  consumes a ‘c’ and proceeds to state 0, and then consumes an ‘e’ and proceeds to state 1. State 1 allows processing to finish with the reduction to go back two states and replace the consumed letters by an ‘E’. Processing then returns to the start state S, where the E is processed. The E is consumed as processing proceeds to the finish state F. Thus, the token type sequence c followed by e is parsed as having the grammatical or data type E. 
         [0030]    Similarly, the token sequence ‘acd’ is processed using the parsing tree shown in  FIG. 3  as shown in the following table: 
         [0000]    
       
         
               
               
               
             
           
               
                   
               
               
                 Current state 
                 Sequence to process 
                 Previous states 
               
               
                   
               
             
             
               
                 S 
                 acd 
                   
               
               
                 5 
                 cd 
                 S 
               
               
                 S 
                 Acd 
               
               
                 2 
                 cd 
                 S 
               
               
                 3 
                 d 
                 S, 2 
               
               
                 4 
                   
                 S, 2, 3 
               
               
                 S 
                 E 
               
               
                 F 
                   
                 S 
               
               
                   
               
             
          
         
       
     
         [0031]    Here, the first token type to be parsed is ‘a’. Starting at start state S, the ‘a’ is consumed and processing proceeds to state 5, which has the reduction to go back one state and replace the consumed items with an ‘A’. Thus, the sequence is changed from ‘acd’ to ‘Acd’ and processing returns to state S, where the A is consumed and processing proceeds to state 2. Next, as processing proceeds along the middle branch of the tree to states 3 and 4, the c and the d are consumed. At state 4, the consumed sequence Acd is replaced by an E and processing returns to state S, where the E is processed. The E is consumed as processing proceeds to the finish state F. Thus, the token type sequence a followed by c followed by d is also parsed as having the grammatical or data type E. 
         [0032]    Similarly, the token sequence ‘cd’ is processed using the parsing tree shown in  FIG. 3  as shown in the following table: 
         [0000]    
       
         
               
               
               
             
           
               
                   
               
               
                 Current state 
                 Sequence to process 
                 Previous states 
               
               
                   
               
             
             
               
                 S 
                 cd 
                   
               
               
                 S 
                 Acd 
               
               
                 2 
                 cd 
                 S 
               
               
                 3 
                 d 
                 S, 2 
               
               
                 4 
                   
                 S, 2, 3 
               
               
                 S 
                 E 
               
               
                 F 
                   
                 S 
               
               
                   
               
             
          
         
       
     
         [0033]    Here, the first token type to be parsed is ‘c’. Starting at start state S, the ‘c’ is consumed and processing proceeds to state 0. The next token type to be parsed is a ‘d’, but state 0 does not provide an option for proceeding with this token type. Moreover, state 0 is represented by a dotted circle, indicating that processing cannot finish at that state. Accordingly, this branch is a “dead” branch and processing reverts with the entire sequence intact to the start state S. This state is provided with the reduction that an ‘A’ must be placed at the front of the sequence. Thus, the sequence to be parsed is now ‘Acd’. This is the same sequence as is generated during processing of the sequence acd above, and processing proceeds in exactly the same way. Thus, the token sequence c followed by d is also parsed as having the grammatical or data type E. 
         [0034]    In this way, it can be seen that the parsing tree shown in  FIG. 3  is consistent with the grammar:
   A:=a|ε   E:=Acd|ce
       The foregoing is a simple explanation of the basic functionality of lexers  10  and parsers  20 . This functionality can be adapted to detect predetermined types of data from a sequence of characters, for example in an e-mail or a block of text. Imagine that it is intended to detect either a time or a bug identification code in a block of text. In the following example, the format of a time to be detected is that it is always one of AM, PM, A or P followed by two digits, whereas the format of a bug identification code to be detected is always two letters followed by three digits. Accordingly, the lexer  10  may be provided with the vocabulary:   
       INITIALS:=[A-Z]{2} (INITIALS is any two letters together) MERIDIAN:=(A|P) M? (MERIDIAN is the letter A or the letter P, optionally followed by the letter M)   DIGIT:=[0-9] (DIGIT is any character from 0 to 9)
 
whereas the parser  20  may be provided with the grammar:
   BUG_ID:=INITIALS DIGIT{3} (INITIALS token followed by 3 DIGIT tokens)   TIME:=MERIDIAN DIGIT{2} (MERIDIAN token followed by 2 DIGIT tokens)   
 
         [0042]    In more detail, the lexer  10  will output a sequence of a letter from A to Z followed by another letter from A to Z as a token having a lexeme of the two letters and having the token type INITIALS. It will also output the letters AM and PM as a token having the token type MERIDIAN. In this notation ‘?’ indicates that the preceding character(s) may or may not be present. Thus, the lexer  10  will also output the letter A alone, or the letter P alone as a token having the token type MERIDIAN. 
         [0043]      FIG. 4  shows a decision tree of the lexer  10  and  FIG. 5  shows a decision tree of the parser  20 . As will be clear from following the decision tree shown in  FIG. 4 , the lexer  10  will process the sequence of characters AM 02  and output four tokens. The first is a token having the lexeme AM and the token type INITIALS, while the second is a token also having the lexeme AM, but this time the token type MERIDIAN. This is consistent with the vocabulary used by the lexer  10 , since the letters AM can be either INITIALS or a MERIDIAN. The third and fourth tokens have the lexemes ‘0’ and ‘2’ respectively and each has the token type DIGIT. This sequence of four tokens is then operated on by the parser  20 . 
         [0044]    As noted above, the first two tokens both have the lexeme AM and the respective token types INITIALS and MERIDIAN. Accordingly, when the character string AM occurs, two sequences of tokens are processed by the parser  20  using the decision tree shown in  FIG. 5 . One sequence of tokens meets the first condition of the starting state, while the other sequence of tokens meets the other condition. Accordingly both conditions or branches are investigated, either in turn or in parallel. 
         [0045]    In the case of the left-hand INITIALS branch, the processing proceeds to state 1 and then states 2 and 3, since the next two tokens have the token type DIGIT. However, the parser  20  then runs out of tokens to parse and so cannot proceed to state 4. Since state 3 is represented by a dotted circle, processing cannot end there and so a BUG_ID is not detected. 
         [0046]    In the case of the right-hand MERIDIAN branch, the processing proceeds to state 5 and then states 6 and 7, since the next two tokens have the token type DIGIT. At state 7 it is determined that the sequence of tokens MERIDIAN followed by DIGIT and DIGIT represents TIME. In this way, a time is detected. 
         [0047]    In some cases, in real life situations it is possible to detect two different types of information (eg TIME and BUG_IDENTIFICATION) from the same sequence of characters, for example where the results are overlapping. For instance in the BUG_ID/TIME example, consider the character sequences “AM 12 ” in “AM 123 ”. Within “AM 123 ” we could recognize both a time (characters 1 to 4), and a bug identification code (characters 1 to 5). In such an event, it is common practice to provide an additional filter to determine which of the two detected types of information is more likely to be the correct one. One commonly-used heuristic that has proven efficient is to keep only the longest result—in this case, the bug identification code. 
         [0048]    Such a methodology can be applied to many different types of grammar and data structures and has previously been found to be particularly successful in extracting predetermined types of data from sequences of characters. However, in view of the increasing calls on the processors of user and server computers to carry out numerous tasks (including data detection), combined with the increasing volume of information that needs to be scanned and the increasingly complex and numerous types of information it is desired to detect, the conventional methodology typically takes a long time to detect predetermined types of data. 
       SUMMARY OF THE DESCRIPTION 
       [0049]    Methods, systems and machine-readable storage media for processing a sequence of characters are described. In one embodiment, a method for processing a sequence of characters includes converting the sequence of characters into a sequence of tokens, each token comprising a lexeme and one of a plurality of token types, each of the plurality of token types relating to at least one of a plurality of predetermined functions, and at least one of the token types relates to multiple functions of the plurality of predetermined functions, such as functions that describe functions of the lexeme in the context of the sequence of characters. The method may further include parsing the tokens to detect predetermined types of data in the sequence of characters and these predetermined types of data may include at least one of a physical address (e.g. street address), an IP address, an email address, a time, a day, a date, or other contact information. Other methods are also described, and systems and machine-readable storage media which perform these methods are also described. 
     
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
         [0050]    Embodiments of the present invention will now be described by way of further example only and with reference to the accompanying drawings, in which: 
           [0051]      FIG. 1  is a schematic representation of a parsing apparatus; 
           [0052]      FIG. 2  shows a decision tree of a lexer  10  according to the known art; 
           [0053]      FIG. 3  shows a decision tree of a parser  20  according to the known art; 
           [0054]      FIG. 4  shows a decision tree of another lexer  10  according to the known art; 
           [0055]      FIG. 5  shows a decision tree of another parser  20  according to the known art; 
           [0056]      FIG. 6  represents the token space used in the known art; 
           [0057]      FIG. 7  represents the token space using the present invention; 
           [0058]      FIG. 8  shows a decision tree of a lexer  10  according to the present invention; 
           [0059]      FIG. 9  shows a decision tree of a parser  20  according to the present invention; 
           [0060]      FIG. 10  shows a system in the present invention; and 
           [0061]      FIG. 11  shows one embodiment of a computer system. 
       
    
    
     DETAILED DESCRIPTION 
       [0062]    Embodiments of the present invention is generally related to lexing and parsing sequences of characters. In particular, some embodiments of the present invention are related to improving the efficiency of some existing lexer and parser. For instance, referring to the foregoing example of processing the character sequence “AM 02 ”, the procession down the right-hand INITIALS branch in  FIG. 5  represents wasted processing since the branch effectively dies once it is recognized that it is not possible to proceed past state 3. Of itself, such an isolated example is not problematic. However, in real life applications, the number of different token types that the lexer  10  can ascribe to the same lexeme (character string) can be large. For example, in the phrase “Let&#39;s meet at 8.30”, the character ‘8’ could be output as 10 tokens each having the lexeme ‘8’ and a respective one of the token types:
   DIGIT   NUMBER   IP_BLOCK   PHONE_BLOCK   HOURS   MINUTES   STREET_NUMBER   DAY_NUMBER   MONTH_NUMBER   YEAR_NUMBER   
 
         [0073]    Thus, the parser  20  must process the lexeme as ten different tokens. Similarly, the characters ‘30’ could be output as seven tokens each having the lexeme ‘30’ and a respective one of the token types:
   NUMBER   IP_BLOCK   PHONE_BLOCK   MINUTES   STREET_NUMBER   DAY_NUMBER   YEAR_NUMBER   
 
         [0081]    Consequently, the parser  20  has to process the second lexeme as seven different tokens according to the conventional approach. Thus, using the grammar TIME:=HOURS MINUTES, in order to detect the time “8.30” from the sequence of characters, the parser  20  must investigate a branch for each of the token types for the first lexeme together with each of the token types of the second lexeme—a total of 70 (10×7) branches. However, in order to detect the time, only one branch will be correct and 69 of the branches will be dying branches. Further, when it is recognized that some types of data to be detected may comprise three or more token types, it becomes apparent not only that many branches need to be provided, but more importantly that processing through the parsing tree will throw up a huge number of dying branches. These dying branches represent wasted processing time. 
         [0082]    Although the lexer  10  acts entirely as intended and outputs precisely the correct tokens, the possibility of ascribing a large number of token types to each lexeme can be detrimental to the efficiency of the parser  20 . Moreover, it is possible to take advantage of the fact that the lexer  10  and the parser  20  are specifically designed to operate together and can be adapted to each other&#39;s requirements. For example, unlike prior art lexers, it is not necessary for the lexer  10  to make a final decision as to the token type or token types of any particular lexeme. 
         [0083]    Specifically, recalling the grammar
   INITIALS:=[A-Z]{2}   MERIDIAN:=(A|P) M?   DIGIT:=[0-9]   BUG_ID:=INITIALS DIGIT{3}   TIME:=MERIDIAN DIGIT{2}
 
in the foregoing example, the lexer  10  was fed the characters ‘AM’ and output two tokens each having the lexeme AM and a respective one of the token types INITIALS and MERIDIAN. Effectively, the token types can be represented in a Venn diagram, with each token type representing a circle, as shown in  FIG. 6 . In this example, the token type INITIALS intersects with the token type MERIDIAN and, due to this intersection, to the conventional approach ascribes to a lexeme falling in this intersection both token types. This allows the parser  20  to check whether the function of the lexeme is to act as the class INITIALS or the class MERIDIAN.
   
 
         [0089]    However, in at least certain embodiments of the present invention, it is recognized that the lexer  10  and parser  20  can be less formal and that the token types need not be allocated on a one-to-one basis with the functions that the lexemes can carry out. Specifically, the lexer  10  may not have to decide which particular function each lexeme has in order for the parser  20  to detect data. Rather, in at least certain embodiments of the present invention, a third “mixed” token type is used instead to indicate that the lexeme may have any one of a plurality of different functions. 
         [0090]    Thus, in the present example, as shown in  FIG. 7 , three token types are provided—M, MI and I. The token type M means the lexeme has the function of MERIDIAN (and not INITIALS); the token type I means the lexeme has the function of INITIALS (and not MERIDIAN); and the token type MI means that the lexeme can have the function of either INITIALS or MERIDIAN. 
         [0091]    Accordingly, when confronted with a lexeme such as AM, which may have either the function INITIALS or the function MERIDIAN, instead of ascribing both token types INITIALS and MERIDIAN to the lexeme, the lexer  10  ascribes the lexeme AM with the token type MI, meaning that it can have either the function INITIALS or the function MERIDIAN and outputs a single token, according to some embodiments of the present invention. Using a different terminology, a lexeme/token having such a “mixed” token type may be called a “proto-lexeme.” Such a “mixed token type” may similarly be called a “proto-token type.” 
         [0092]    With this ability to output proto-lexemes having mixed token types, it also becomes possible for the lexer  10  to further designate other lexemes as definitively having a single function. Such lexemes and single-function token types may also be termed proto-lexemes and proto-token types. 
         [0093]    Accordingly, the prefix “proto” is indicative of a token, token type or lexeme output by a lexer  10  according to the present invention. 
         [0094]    Thus, the single character ‘A’ by itself can be designated as a proto-lexeme having proto-token type M (MERIDIAN and not INITIALS), and a sequence such as ‘PQ’ can be output as a lexeme having proto-token type I (INITIALS and not MERIDIAN). 
         [0095]    Accordingly, it will be apparent that the lexer  10  is able to ascribe a greater number of types to a lexeme—in this example, three proto-token types, instead of two normal token types. However, in this example, it ascribes only a single proto-token type to a lexeme, whereas a prior art lexer could ascribe multiple, different token types to the same lexeme. 
         [0096]    Continuing with this example, a decision tree for a corresponding lexer  10  of the present invention is shown in  FIG. 8 . At the start state S, it is determined whether the first character is an ‘A’ or a ‘P’ and, if it is, processing proceeds to state 1. If there are no more letters, processing is finished at that state and the sequence is determined to form a token having lexeme A or P and token type M—that is, the lexeme has the MERIDIAN function without a possibility of having the INITIALS function. However, if there are more characters in the sequence and the next character in the sequence is an ‘M’, processing proceeds to state 2, where the sequence is determined to form a token having lexeme AM or PM and token type MI—that is, a mixed token type in which the lexeme can have either the MERIDIAN or INITIALS functions. 
         [0097]    The condition !M at state 1 means “not M”. Accordingly, if there is different character after A or P, processing proceeds to state 3 and the sequence is determined to form a token having lexeme A or P followed by another letter and token type I—that is, the lexeme has the INITIALS function without a possibility of having the MERIDIAN function. It will be evident from the right-hand branch in the figure how the lexer  10  will output other sequences of two letter words as a token having token type I. 
         [0098]    In each case, the lexemes/tokens may be termed proto-lexemes. 
         [0099]    In some embodiments, the parser  20  is tailored to act in tandem with the lexer  10  to handle such proto-lexemes. An example of a modified decision tree for the parser  20  in this example is shown in  FIG. 9 . In particular, an additional branch is provided at the start state S to cope with the mixed token type MI. 
         [0100]    If, for example, the sequence A 02  is entered into the lexer  10 , it forwards to the parser  20  three tokens having the respective token types M, DIGIT, DIGIT. Operating on this, the parser  20  follows the right-hand branch of the decision tree in  FIG. 8  following the route S, 5 , 6 , 7  and detects A 02  as a time. 
         [0101]    If the sequence AQ 023  is entered into the lexer  10 , it forwards to the parser  20  four tokens having the respective token types I, DIGIT, DIGIT, DIGIT. Operating on this, the parser  20  follows the left-hand branch of the decision tree in  FIG. 8  following the route S, 1 , 2 , 3 , 4  and detects AQ 023  as a bug identification code. 
         [0102]    However, if the sequence AM 02  is entered into the lexer  10 , it forwards to the parser  20  three tokens having the respective token types MI, DIGIT, DIGIT. Operating on this, the parser  20  follows the middle branch of the decision tree in  FIG. 8  following the route S, 8 , 9 , 0 . At state 0, there are no more tokens in the sequence matching the available condition so the reduction for state 0 is used. Accordingly, AM 02  is detected as a time. 
         [0103]    Moreover, if the sequence AM 023  is entered into the lexer  10 , it forwards to the parser  20  four tokens having the respective token types MI, DIGIT, DIGIT, DIGIT. Operating on this, the parser  20  again follows the middle branch of the decision tree in  FIG. 8  following the route S, 8 , 9 , 0 . At state 0, a further token in the sequence matches the available condition so the processing proceeds to state 4. Accordingly, AM 023  is detected as a time. 
         [0104]    By contrast, if the sequence AQ 02  is entered into the lexer  10 , it forwards to the parser  20  three tokens having the respective token types I, DIGIT, DIGIT. Operating on this, the parser  20  follows the left-hand branch of the decision tree in  FIG. 8  following the route S, 1 , 2 , 3 . At state 3, there are no more tokens in the sequence matching the available condition. However, as state 3 is represented by a dotted circle, processing cannot finish at this state and neither a time nor a bug identification code is detected. 
         [0105]    As will be clear from the foregoing simple example, a branch from the start state S is provided for the mixed token type. Accordingly, irrespective of whether the lexeme is a normal lexeme or proto-lexeme, it can be processed using a single path. Effectively, there is only one path processing a proto-lexeme and it is no longer necessary to process multiple paths for a single lexeme. Thus, the parser  20  does not process any dying branches for the proto-lexeme. In this way, sequences of characters such as e-mails can be scanned considerably more quickly. 
         [0106]    It can also be noted that while the lexer  10  does not make any definitive decision on whether the lexeme AM has the function MERIDIAN or INITIALS, no such decision is made by the parser  20  either. Instead, it is enough to determine whether the lexeme has a mixed token type in order to detect whether a time or a bug identification code is present. 
         [0107]    In many real life applications, the number of different token types that the prior art lexer  10  can ascribe to the same lexeme can be large. For example, in the phrase “Let&#39;s meet at 8.30”, the character ‘8’ was output as ten tokens each having the lexeme ‘8’ and a respective one of the  10  token types:
   DIGIT   NUMBER   IP_BLOCK   PHONE_BLOCK   HOURS   MINUTES   STREET_NUMBER   DAY_NUMBER   MONTH_NUMBER   YEAR_NUMBER   
 
         [0118]    Similarly, the characters ‘30’ were output as seven tokens each having the lexeme ‘30’ and a respective one of the seven token types:
   NUMBER   IP_BLOCK   PHONE_BLOCK   MINUTES   STREET_NUMBER   DAY_NUMBER   YEAR_NUMBER   
 
         [0126]    However, in the present invention, a token space similar to that illustrated in  FIG. 7  could be constructed. The token type for each lexeme could be a proto-token type that represents a single function exclusively, such as PROTO DIGIT, or a mixed proto-token type, which represents that the lexeme can have two or more functions. For example, one mixed proto-token type for the character ‘8’ could indicate that it has either a DIGIT or NUMBER function; another mixed proto-token type could indicate that it has a DIGIT, NUMBER, HOURS or MINUTES function; and another mixed proto-token type could even indicate that it has any one of the ten possible functions. The precise proto-token types available will depend on the various conjunctions of the sets in a token space diagram similar to the Venn diagram shown in  FIG. 7 . 
         [0127]    Thus, instead of providing the parser  20  with 17 (10+7) tokens to parse in 70 (10×7) combinations, as in the prior art, the lexer  10  of the present invention would output two proto-lexemes each with one proto-token type. As a result, the amount of work needed to be done by the parser  20  is dramatically reduced and hence, the speed of detecting data in a block of text is significantly increased. Indeed, in many real life implementations, the speed of data detection has been more than doubled using some embodiments of the present invention. 
         [0128]    Note that that some embodiments of the present invention require an increased complexity in the vocabulary of the lexer  10  and the grammar of the parser  20 , with a consequent increase in storage capacity required to store them. However, it has been found that, in some embodiments, the increase in storage capacity required is approximately only 25% starting from a requirement for 3.6 MB for a system according to the prior art in order to achieve a more than two fold increase in scanning speed. In general, the greater the number of patterns in the system, the smaller the increase in proportional terms. 
         [0129]    In some embodiments, the lexer  10  ascribes to all tokens a proto-token type—that is, a token type indicating that the lexeme falls in a single category of data, or one of a plurality of categories of data. However, the present invention may also be used in a mixed form with the prior art in some embodiments. That is, a lexer  10  may ascribe a proto-token type to most, only a few or even only one of the tokens it outputs. In this case, the other tokens may be processed in the same way as the prior art—that is, more than one token type can be ascribed to the same lexeme. In such cases, the speed of processing may be reduced but the storage requirements for the lexer  10  and parser  20  may also be reduced. 
         [0130]    Moreover, in this case it would be necessary to set up a parser that would accept both some “lexemes” and some “proto-lexemes” as an input. However, this would have to be done carefully: one part of the token space Venn diagram would be converted to a proto-lexeme partitioning, while the other part would remain unchanged. Therefore, some strings would be lexemized, while some would be proto-lexemized. 
         [0131]    Some embodiments of the present invention may also be used in a mixed form in which two or more proto-token types are ascribed to the same lexeme. In this case, it would be possible, for example, to ascribe both a mixed proto-token type such as
   DIGIT, IP_BLOCK, HOURS, MINUTES
 
and another mixed proto-token type such as
   DIGIT, PHONE-BLOCK, STREET-NUMBER, DAY-NUMBER
 
to the same lexeme, rather than the single proto-token type
   DIGIT, IP_BLOCK, HOURS, MINUTES, PHONE-BLOCK, STREET-NUMBER, DAY-NUMBER   
 
         [0135]    Such an arrangement takes advantage of the above concept of reducing dying branches, but reduces the complexity of the lexer  10  and parser  20  and reduces the requirements for storage space. 
         [0136]    Embodiments of the present invention have a wide variety of applications. For example, it may be used in scanning e-mails and blocks of text, such as those created in word processing packages. Moreover, it can be used in any application where sequences of characters are processed, such as in compilers and interpreters. Embodiments of the present invention may be implemented using any suitable apparatus. Such an apparatus may include, but is not limited, to data processing machines and devices such as laptop or notebook computers, other user and server computers, and mobile communications devices, such as mobile telephones, personal digital assistants and so forth. 
         [0137]    As an example,  FIG. 10  shows an arrangement comprising a user computer  30 , a notebook computer  40 , and a cell phone  60 , where one, some or all devices may have a processor  1  adapted to operate in accordance with the present invention. In the present example, at least the notebook computer  40  and the cell phone  60  have such a processor  1 . A first user may compose a message and send it by e-mail to a second user. The second user may retrieve the message over the Internet  70  using his notebook computer  40 . Upon retrieval of the message, an application embodying one embodiment of the present invention may automatically scan the message to detect whether it includes predetermined data, such as a time, a date, a name, an address and so forth. On detection of a time and a date, the application may notify the second user and provide him with the option of updating his calendar. Similarly, on detection of names, addresses, phone numbers and so forth, the application may notify the second user and provide him with the option of updating his address book. In addition, the second user may retrieve the message using his mobile phone  60  via the Internet  70  and a telecommunications base station  50 . Again, an application embodying the present invention may detect predetermined data and provide the option of updating the user&#39;s records with the detected data. 
         [0138]    It is also conceived that the present invention may be embodied using two or more different devices in some embodiments. For example, one device could carry out the lexing function and the other the parsing function. 
         [0139]    The present invention may also be used to extract data included in mobile phone messages, such as SMS text messages and MMS messages, in some embodiments. 
         [0140]    The present invention may also be embodied in software causing a data processing device to carry out the invention, as well as in computer-readable media on which such software is stored. Moreover, the present invention may be embodied in dedicated hardware or general-purpose hardware. 
         [0141]    Some embodiments of the present invention can relate to an apparatus for performing one or more of the operations described herein. This apparatus may be specially constructed for the required purposes, or it may comprise a general-purpose computer selectively activated or reconfigured by a computer program stored in the computer. Such a computer program may be stored in a machine (e.g. computer) readable storage medium, such as, but is not limited to, any type of disk including floppy disks, optical disks, CDROMs, and magnetic or optical disks, read only memories (ROMs), random access memories (RAMs), erasable programmable ROMs (EPROMs), electrically erasable programmable ROMs (EEPROMs), flash memory, magnetic or optical cards, or any type of media suitable for storing electronic instructions, and each coupled to a bus. 
         [0142]      FIG. 11  shows one example of a data processing system, such as a computer system, which may be used with the present invention. Note that while this figure illustrates various components of a data processing system, it is not intended to represent any particular architecture or manner of interconnecting the components as such details are not germane to the present invention. It will also be appreciated that network computers, personal digital assistants (PDAs), cellular telephones, handheld computers, special purpose computers, entertainment systems and other data processing systems and consumer electronic devices which have fewer components or perhaps more components may also be used with the present invention. The system of this figure may, for example, be a Macintosh computer from Apple, Inc. 
         [0143]    In some embodiments, the computer system  151  may be used as a server computer system or as a client computer system or as a web server computer system. It will be appreciated that such a computer system may be used to perform many of the functions of an Internet service provider, such as ISP  105 . The computer system  151  interfaces to external systems through a modem or network interface  169 . It will be appreciated that the modem or network interface  169  may be considered part of the computer system  151 . This network interface  169  may be an analog modem, an ISDN modem, a cable modem, a token ring interface, a satellite transmission interface (e.g. “Direct PC”), or other interfaces for coupling a digital processing system to other digital processing systems. The computer system  151  includes a processor  153  which may be a conventional microprocessor, such as a Motorola PowerPC microprocessor or an Intel Pentium microprocessor. Memory  155  is coupled to the processor  153  by the bus  157 . Memory  155  may be dynamic random access memory (DRAM) and may also include static RAM (SRAM). The bus  157  couples the processor  153  to the memory  155  and also to mass memory  163  and to display controller  159  and to the I/O (input/output) controller  165 . Display controller  159  controls in the conventional manner a display on the display device  161  which may be a CRT or a liquid crystal display device. The input/output devices  169  may include a keyboard, disk drives, printers, a scanner, a digital camera, and other input and output devices, including a mouse or other pointing device. The display controller  159  and the I/O controller  165  may be implemented with conventional well known technology. The mass memory  163  is often a magnetic hard disk, an optical disk, or another form of storage for large amounts of data. Some of this data is often written, by a direct memory access process, into memory  155  during execution of software in the computer system  151 . It will be appreciated that the computer system  151  is one example of many possible computer systems, which have different architectures. For example, Macintosh or Wintel systems often have multiple busses, one of which may be considered to be a peripheral bus. Network computers may also be considered to be a computer system, which may be used with the present invention. Network computers may not include a hard disk or other mass storage, and the executable programs are loaded from a network connection into the memory  155  for execution by the processor  153 . A Web TV system, which is known in the art, may be considered to be a computer system according to the present invention, but it may not include certain features shown in  FIG. 11 , such as certain input or output devices. A cell phone having a suitable display and a processor and memory may also be considered to be a digital processing system or a computer system, which may be used with the present invention. A typical computer system will usually include at least a processor, memory, and a bus coupling the memory to the processor. It will also be appreciated that the computer system  151  is typically controlled by an operating system, which includes a file management system, such as a disk operating system, which is part of the operating system. 
         [0144]    A machine-readable medium includes any mechanism for storing or transmitting information in a form readable by a machine (e.g., a computer). For example, a machine readable medium includes read only memory (“ROM”); random access memory (“RAM”); magnetic disk storage media; optical storage media; flash memory devices; electrical, optical, or other form of storage systems. 
         [0145]    It will be apparent from this description that aspects of the inventions may be embodied, at least in part, in software. That is, the techniques may be carried out in a computer system or other data processing system in response to its processor or processing system executing sequences of instructions contained in a memory, such as RAM, etc. In various embodiments, hardwired circuitry may be used in combination with the software instructions to implement the present inventions. Thus, the techniques are not limited to any specific combination of hardware circuitry and software, nor to any particular source for the instructions executed by the data processing systems. 
         [0146]    The foregoing description has been given by way of example only and it will be appreciated by a person skilled in the art that modifications can be made without departing from the spirit and scope of the present invention.