objc.st - enscript - GNU Enscript
 (HTM) git clone git://thinkerwim.org/enscript.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       objc.st (5149B)
       ---
            1 /**
            2  * Name: objc
            3  * Description: Objective-C programming language.
            4  * Author: Markku Rossi <mtr@iki.fi> with help of Emacs' `font-lock.el'.
            5  */
            6 
            7 objc_type_re =
            8 /* Types.
            9    (build-re '(auto extern register static typedef struct union enum
           10    signed unsigned short long int char float double void volatile
           11    const id oneway in out inout bycopy byref))
           12  */
           13   /\b(auto|by(copy|ref)|c(har|onst)|double|e(num|xtern)|float\
           14 |i(d|n(|out|t))|long|o(neway|ut)|register|s(hort|igned|t(atic|ruct))\
           15 |typedef|un(ion|signed)|vo(id|latile))\b/;
           16 
           17 
           18 state objc_method_line extends CHighlight
           19 {
           20   /* Argument declarations after the method.
           21    $1      $2                       $3       $4 $5           $6      $7 */
           22   /([ \t]*)([A-Za-z_][A-Za-z_0-9]*)?(:[ \t]*)(\(([^)\n]+)\))?([ \t]*)([A-Za-z_][A-Za-z_0-9]*)/ {
           23     language_print ($1);
           24 
           25     if (length ($2) > 0)
           26       {
           27         function_name_face (true);
           28         language_print ($2);
           29         function_name_face (false);
           30       }
           31 
           32     language_print ($3);
           33 
           34     if (length ($4) > 0)
           35       {
           36         language_print ("(");
           37         type_face (true);
           38         language_print ($5);
           39         type_face (false);
           40         language_print (")");
           41       }
           42 
           43     language_print ($6);
           44 
           45     variable_name_face (true);
           46     language_print ($7);
           47     variable_name_face (false);
           48   }
           49 
           50   /\n/ {
           51     language_print ($0);
           52     return;
           53   }
           54 }
           55 
           56 /* This is *not* inherited from CHighlight. */
           57 state objc_method_continuation_line
           58 {
           59   /* Method names and arguments on lines following the function declaration.
           60     $1      $2                       $3       $4 $5           $6      $7 */
           61   /^([ \t]*)([A-Za-z_][A-Za-z_0-9]*)?(:[ \t]*)(\(([^)\n]+)\))?([ \t]*)\
           62 ([A-Za-z_][A-Za-z_0-9]*)/ {
           63     language_print ($1);
           64 
           65     if (length ($2) > 0)
           66       {
           67         function_name_face (true);
           68         language_print ($2);
           69         function_name_face (false);
           70       }
           71 
           72     language_print ($3);
           73 
           74     if (length ($4) > 0)
           75       {
           76         language_print ("(");
           77         type_face (true);
           78         language_print ($5);
           79         type_face (false);
           80         language_print (")");
           81       }
           82 
           83     language_print ($6);
           84 
           85     variable_name_face (true);
           86     language_print ($7);
           87     variable_name_face (false);
           88 
           89     /* Highlight all remaining arguments on this line. */
           90     call (objc_method_line);
           91   }
           92 
           93   /*
           94    * If the previous one didn't match, we'r done with this method
           95    * declaration.
           96    */
           97   /()/ {
           98     return;
           99   }
          100 }
          101 
          102 /* This is *not* inherited from CHighlight. */
          103 state objc_compiler_directive_line
          104 {
          105   /([ \t:<(,]*)([A-Za-z_][A-Za-z_0-9]*)/ {
          106     language_print ($1);
          107 
          108     function_name_face (true);
          109     language_print ($2);
          110     function_name_face (false);
          111   }
          112 
          113   /*
          114    * If the previous one didn't match, we'r done with this directive.
          115    * Yes, that should match an empty string.
          116    */
          117   /()/ {
          118     return;
          119   }
          120 }
          121 
          122 /*
          123  * We inherit the Objective-C state from the C state.  This gives us
          124  * all the defaults, etc.  All we have to do here is to overwrite
          125  * things that are not implemented, or are broken.
          126  */
          127 state objc extends c
          128 {
          129   BEGIN {
          130     /* See `c.st' for the comments on this one. */
          131     type_re = objc_type_re;
          132   }
          133 
          134   /* One line comments. */
          135   /\/\// {
          136     comment_face (true);
          137     language_print ($0);
          138     call (eat_one_line);
          139     comment_face (false);
          140   }
          141 
          142   /* Compiler directives. */
          143   /(@)([A-Za-z][A-Za-z0-9]*)\>/ {
          144     /* Leading garbage. */
          145     language_print ($1);
          146 
          147     /* The directive. */
          148     keyword_face (true);
          149     language_print ($2);
          150     keyword_face (false);
          151 
          152     /* And all the remaining stuff on this line. */
          153     call (objc_compiler_directive_line);
          154   }
          155 
          156   /* Keywords.  Basicly what's missing from C *but* not goto or case.
          157      (build-re '(self super _cmd id Class SEL IMP BOOL YES NO nil Nil))
          158    */
          159   /\b(BOOL|Class|IMP|N(O|il)|SEL|YES|_cmd|id|nil|s(elf|uper))\b/ {
          160     keyword_face (true);
          161     language_print ($0);
          162     keyword_face (false);
          163   }
          164 
          165   /* Types. */
          166  objc_type_re {
          167     type_face (true);
          168     language_print ($0);
          169     type_face (false);
          170   }
          171 
          172   /* Method names.  First, on the same line as the function declaration.
          173    $1           $2        $3      $4 $5           $6      $7 */
          174   /(^[+-][ \t]*)(PRIVATE)?([ \t]*)(\(([^)\n]+)\))?([ \t]*)([A-Za-z_]\
          175 [A-Za-z_0-9]*)/ {
          176     language_print ($1);
          177 
          178     if (length ($2) > 0)
          179       {
          180         type_face (true);
          181         language_print ($2);
          182         type_face (false);
          183       }
          184 
          185     language_print ($3);
          186 
          187     if (length ($4) > 0)
          188       {
          189         language_print ("(");
          190         type_face (true);
          191         language_print ($5);
          192         type_face (false);
          193         language_print (")");
          194       }
          195 
          196     language_print ($6);
          197 
          198     function_name_face (true);
          199     language_print ($7);
          200     function_name_face (false);
          201 
          202     /* Highlight arguments from the same line. */
          203     call (objc_method_line);
          204 
          205     /*
          206      * Method names and arguments on lines following the function declaration.
          207      */
          208     call (objc_method_continuation_line);
          209   }
          210 
          211   /*
          212    * Labels and case tags.  These must remain as a sole statement on a line,
          213    * otherwise we detect selectors.  Emacs accepts also bare numbers.
          214    */
          215   /^([ \t]*)([a-zA-Z0-9_]+)(:[ \t]*)$/ {
          216     language_print ($1);
          217 
          218     reference_face (true);
          219     language_print ($2);
          220     reference_face (false);
          221 
          222     language_print ($3);
          223   }
          224 }
          225 
          226 
          227 /*
          228 Local variables:
          229 mode: c
          230 End:
          231 */