summaryrefslogtreecommitdiffstats
path: root/feed/sse_lex_c.l
blob: e9c2f8e7db099ed935fe7d439a286eee81c24bf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* --*-c-*-- $Id$ */

%{

#include <stdio.h>
#include <ctype.h>

static void print_with_subwords(const char *w) {
    const char *e;

    printf("%s\n", w);

    if ((e = strchr(w, '_'))) {

        /* Split at dashes.*/

        do {
            for (; *e == '_'; e++);

            if (strlen(e) < 3)
                break;
            
            printf("S:%s\n", e);

            e = strchr(e, '_');
        } while (e);

    } else {

        /* Split a place where an uppercase letter follows a lowercase
         * letter */

        e = w;
        for (;;) {
            for (; *e && !(islower(*e) && isupper(*(e+1))); e++);

            if (!*e)
                break;
            
            e++;
            
            if (strlen(e) < 3)
                break;

            printf("S:%s\n", e);
        }
    }
        
}
    
%}

%Start DEF CCOMMENT CPPCOMMENT STRING STRINGESC CHAR CHARESC PREPROC

IDCHAR [_a-zA-Z0-9]
NIDCHAR [^_a-zA-Z0-9]

%%

 BEGIN DEF;

<DEF>^#ifn?def |
<DEF>^#if      |
<DEF>^#define  |
<DEF>^#undef   ;

<DEF>^#. { BEGIN CPPCOMMENT; }

<DEF>"/*" { BEGIN CCOMMENT; }
<CCOMMENT>"*/" { BEGIN DEF; }
<CCOMMENT>\n |
<CCOMMENT>. ;

<DEF>"//" { BEGIN CPPCOMMENT; }
<CPPCOMMENT>\n { BEGIN DEF; }
<CPPCOMMENT>. ;

<DEF>"\"" { BEGIN STRING; }
<STRING>"\\" { BEGIN STRINGESC; }
<STRING>"\"" { BEGIN DEF; }
<STRING>. |
<STRING>\n ;
<STRINGESC>. { BEGIN STRING; }

<DEF>"'" { BEGIN CHAR; }
<CHAR>"\\" { BEGIN CHARESC; }
<CHAR>"'" { BEGIN DEF; }
<CHAR>\n |
<CHAR>. ;
<CHARESC>. { BEGIN CHAR; }

<DEF>[a-zA-Z_][a-zA-Z_0-9]{3,} { print_with_subwords(yytext); }

<DEF>[0-9]+ ;
<DEF>0x[0-9a-fA-F]+ ;

<DEF>"\n" |
<DEF>. ;

%%


int main(int argc, char *argv[]) {

    if (argc <= 1)
        yylex();
    else {
        int i;
        
        for (i = 1; i < argc; i++) {
            if (!(freopen(argv[i], "r", stdin))) {
                fprintf(stderr, "Failed to open file: %s\n", strerror(errno));
                return 1;
            }
            yylex();
        }
    }

    return 0;
}