Website Summary Files Commits Branches @commit @diff @stats
path: root / homework / 80095 / js2html / js2html.flex
blob: 4dfe28a183f61951e0793a39486b7e73be1551e1 (plain) (blame)
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
/* scanner for a toy JavaScript-like language */

%{
#define YY_NO_UNISTD_H
%}

DIGIT    [0-9]
ID       [a-z_$][a-z0-9_$]*
STRQ     '([^\']|(\\\'))*'
STRDQ    "([^\"]|(\\\"))*"

%%

{DIGIT}+    {
            printf("<span class=\"number\">%s</span>", yytext);
            }

{DIGIT}+"."{DIGIT}*        {
            printf("<span class=\"number\">%s</span>", yytext);
            }

if|else|for|while|do|break|switch|case|function|return|new|delete|try|throw|catch|class|public|private {
    printf("<span class=\"keyword\">%s</span>", yytext);
}

{ID}    printf("<span class=\"identifier\">%s</span>", yytext);
{STRQ}|{STRDQ}        printf("<span class=\"string\">%s</span>", yytext);

"."|"+"|"-"|"*"|"/"|"="|"!"|">"|"<"|"!=="|"==="|">="|"<="|"++"|"--"|"=>"   printf("<span class=\"operator\">%s</span>", yytext);

[;(){}:? \t\n]+          printf("%s", yytext); /* echo the rest */

.           printf( "Unrecognized character: %s\n", yytext );

%%

int yywrap()
{
    return 1;
}


int main(int argc, const char* argv[])
{
    ++argv, --argc;  /* skip over program name */
    if ( argc > 0 )
            yyin = fopen( argv[0], "r" );
    else
            yyin = stdin;

    puts(
        "<!doctype>"
        "<html>"
        "<head>"
        "    <title>hello.js</title>"
        "    <style>"
        "        .keyword {"
        "            color: red;"
        "        }"
        "        .number {"
        "            color: blue;"
        "        }"
        "        .string {"
        "            color: green;"
        "        }"
        "        .operator {"
        "            font-style: bold;"
        "        }"
        "    </style>"
        "</head>"
        "<body>"
        "    <pre class=\"code\">"
        );
    yylex();
    puts("</pre></body></html>");
    return 0;
}