Changeset 3069 for proto/RE


Ignore:
Timestamp:
Apr 25, 2013, 3:07:30 AM (6 years ago)
Author:
ksherdy
Message:

Updated Scatter regular expression grammar to support any, anchors, bounded-repetition, character-by-character processing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/RE/input/grammar/re.scatter

    r2346 r3069  
     1// Author: Tom Shermer, Ken Herdy
     2//
     3// Regular Expression CFG
     4//
     5// Supports context dependent lexical analysis.
     6//
     7// Modified:    31-09-2012      Original definition.
     8// Modified:    04-25-2013              Character-by-character, any character, sos, eos, bounded repetition.
     9//                                                              Context for bounded repetition.
     10//
     11
     12types {}
    113
    214context main {
    315        recognizers {
    416                Whitespace [IGNORE],
    5                 Identifier [IDENTIFIER],        // note: java identifiers.  This also produces LextantTokens for keywords.
    6                 Comment [IGNORE] "//" "\n",
    7                 Punctuator,
     17                Comment [IGNORE] "(?#" ")",
     18                Character [CHARACTER] "(" ")" "[" "|" "?" "*" "+" "." "^" "!" "\\" "{"  , // any non meta-characters
     19                Punctuator,                     
    820                EndOfInput,
    921        }
    1022
    11         tokens {
    12                 LEFTROUND "(",  RIGHTROUND ")",
    13                 LEFTSQUARE "[", RIGHTSQUARE "]",
     23        tokens { 
    1424       
    15 //              EPSILONWORD "epsilon" "ε",
     25                LEFTROUND       "(",    RIGHTROUND              ")",
     26                LEFTSQUARE      "[",    RIGHTSQUARE     "]",
     27                LEFTCURLY       "{",    RIGHTCURLY              "}",
    1628
    17                 OR "|",
    18                 OPTIONAL "?",
    19                 STAR "*",
    20                 PLUS "+",
     29                OR                      "|",
     30                OPTIONAL        "?",
     31                STAR            "*",
     32                PLUS            "+",
     33               
     34                ANY             ".",
     35                SOS             "^",    // start-of-string
     36                EOS                     "!",    // end-of-string, non-standard, '$' is standard
     37
     38                BACKSLASH       "\\",
     39//              HEX                     "x",
     40//              UNICODE         "u",
     41                COMMA           ",",
    2142        }
    2243}
    23 context charClass {
     44
     45context charClass {     
    2446        recognizers {
    2547                Whitespace [IGNORE],
     48                Character [CHARACTER] "]" "^" "-" "\\", // non meta-characters
    2649                Punctuator,
    27                 Character [CHARACTER],
    2850                EndOfInput,
    2951        }       
    30         tokens {
     52        tokens { 
    3153                RIGHTSQUARE "]",
     54                NOT             "^",
     55                THROUGH         "-",
     56                BACKSLASH       "\\",
     57        }
     58}
    3259
    33                 NOT "~",
    34                 THROUGH "-" "..",
    35                 BACKSLASH "\\",
     60context boundedRepetition {
     61        recognizers {
     62                Whitespace [IGNORE],
     63                Integer [INTEGER_CONST],
     64                Punctuator,
     65                EndOfInput,
     66        }       
     67        tokens {
     68                RIGHTCURLY "}",
     69                COMMA           ",",
    3670        }
    3771}
    3872
    3973interfaces {
    40         escapable {boolean escaped = false;},
    41         complementable {boolean complemented = false;},
     74        escapable {boolean isEscape = false;}, //  boolean isHexEscape = false; boolean isUnicodeEscape = false;},
     75        complementable {boolean isComplemented = false;},
     76        repeatable {boolean isRange = false;},
     77         intValued {int value = 0;},
    4278}
    4379
    4480nodes {
    45         char {escapable;} [escapedChar],
     81        char {escapable;} [escapedChar characterClassChar characterClassEscapedChar],
    4682        characterClass {complementable;} [],
     83        lowerBound{intValued;} [],
     84        upperBound{intValued;} [],
     85        boundedRepetitionIndicator{repeatable;} [],
     86       
     87        // escapedChar {} [escapedCharRest],
     88        // hexEscapedChar {} [hexEscapedCharRest],
     89        // unicodeEscapedChar {} [unicodeEscapedCharRest],
    4790}
    4891//
     
    5699// "charClass" context.
    57100grammar {
    58         start → re ;
    59         re ʉ → alternation ;
    60         alternation ʉ → concatenation (OR↑ concatenation)* ;       
    61         concatenation ʉ → repetition+ ;                                             
    62         repetition ʉ → atom repetitionIndicator↑↑!? ;
     101        start                   → re ;
     102        re                              Ê‰ → alternation ;
     103        alternation     ʉ → concatenation (OR↑ concatenation)* ;   
     104        concatenation   ʉ → repetition+ ;                                           
     105        repetition              Ê‰ → atom (repetitionIndicator | boundedRepetitionIndicator)?; // ↑↑!? ;
    63106       
    64         atom ʉ → LEFTROUND re RIGHTROUND | identifier | characterClass ;
    65         identifier → IDENTIFIER;
     107        repetitionIndicator             â†’ OPTIONAL | STAR | PLUS ;
     108                                                       
     109        boundedRepetitionIndicator      → LEFTCURLY◊(boundedRepetition) (lowerBound)? (COMMA {@isRange=true;} (upperBound)? )? RIGHTCURLY◊ ;
    66110       
    67         characterClass → LEFTSQUARE◊(charClass)
    68                                                 (NOT {@complemented=true;})?
    69                                                 range*
    70                                          RIGHTSQUARE◊
    71                                    ;
     111        lowerBound              -> INTEGER_CONST {@value = @@value;} ;
     112        upperBound              -> INTEGER_CONST {@value = @@value;} ;                                         
     113       
     114        atom                    ʉ → LEFTROUND re RIGHTROUND | char | characterClass | any | sos | eos ;
     115       
     116        char                    ʉ → CHARACTER | BACKSLASH escapedChar {@:isEscape = true;} ;
     117    escapedChar         â†’     CHARACTER | LEFTROUND | RIGHTROUND | LEFTSQUARE | LEFTCURLY | COMMA | OR | OPTIONAL | STAR | PLUS | ANY | SOS | EOS | BACKSLASH;
     118               
     119        characterClass  →     LEFTSQUARE◊(charClass)
     120                                                        (NOT {@isComplemented = true;})?
     121                                                        range*
     122                                                RIGHTSQUARE◊ ;
    72123                                         
    73         range ʉ → char (THROUGH↑ char)? ;
     124        range                   Ê‰ → characterClassChar (THROUGH↑ characterClassChar)? ;
     125         
     126        characterClassChar                      ʉ → CHARACTER | BACKSLASH characterClassEscapedChar {@:isEscape = true;} ;
     127    characterClassEscapedChar   â†’ CHARACTER | NOT | THROUGH | BACKSLASH | RIGHTSQUARE;
     128
    74129       
    75         // allows single-char escapes like \n, \t, \\, and even \]
    76         char ʉ → CHARACTER | BACKSLASH escapedChar {@:escaped = true;} ;
    77         escapedChar → CHARACTER | BACKSLASH | RIGHTSQUARE;
     130//      escapedCharRest                                 â†’ (CHARACTER | BACKSLASH | RIGHTSQUARE);
     131//      hexEscapedCharRest                      → char char;
     132//      unicodeEscapedCharRest                  → char char char char;
    78133       
    79         repetitionIndicator → OPTIONAL | STAR | PLUS ;
     134        any                             â†’ ANY ;
     135        sos                             â†’ SOS ;
     136        eos                             â†’ EOS ;
     137
    80138}
Note: See TracChangeset for help on using the changeset viewer.