summaryrefslogtreecommitdiff
path: root/tools/d2c/tokens.l
blob: 1e4b7b02f2c6158253cb69353e2c84aaea9dfe7a (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

%top {

#include "grammar.h"

}


%{

#include "manual.h"

%}


%option noyywrap
%option nounput
%option yylineno
%option stack
%option noyy_top_state


%x comments

%x ins_name try_details ins_details
%x encoding encoding_type encoding_content

%x encoding_bits encoding_bits_size

%x raw_line


%%


[ \t\n]+                        { }

"/*"                            { BEGIN(comments); }
<comments>"*/"                  { BEGIN(INITIAL); }
<comments>[^*\n]                { }
<comments>"Copyright"[^\n]*     { yylvalp->string = strdup(yytext); return COPYRIGHT; }
<comments>"*"                   { }
<comments>"\n"                  { }


"@title"                        { BEGIN(ins_name); return TITLE; }

<ins_name>[ ][A-Za-z-]+         { yylvalp->string = strdup(yytext + 1); BEGIN(try_details); return INS_NAME; }
<try_details>[ ,/-]             { BEGIN(ins_details); yylvalp->character = yytext[0]; return INS_SEP; }
<try_details>[\n]               { BEGIN(INITIAL); }

<ins_details>[^\n]*             { yylvalp->cstring = yytext; return INS_DETAILS; }
<ins_details>[\n]               { BEGIN(INITIAL); }



"@encoding"                     { BEGIN(encoding); return ENCODING; }

<encoding>[ ]                   { }
<encoding>"("                   { BEGIN(encoding_type); }

<encoding_type>[A-Za-z]         { yylvalp->string = strdup(yytext); return TYPE; }
<encoding_type>[0-9]+           { yylvalp->integer = atoi(yytext); return NUMBER; }
<encoding_type>")"              { BEGIN(encoding); }

<encoding>"{"                   { BEGIN(encoding_content); }
<encoding_content>[ \t\n]+      { }
<encoding_content>"}"           { BEGIN(INITIAL); }


<encoding_content>"@format"     { yy_push_state(raw_line); return FORMAT; }

<encoding_content>"@half"       { yy_push_state(raw_line); return HALF; }
<encoding_content>"@word"       { yy_push_state(raw_line); return WORD; }

<encoding_content>"@syntax"     { yy_push_state(raw_line); return SYNTAX; }

<encoding_content>"@conv"       { return CONV; }

<encoding_content>"@hooks"      { return HOOKS; }

<encoding_content>"@rules"      { return RULES; }


<raw_line>[^\n]+                { yylvalp->cstring = yytext; return RAW_LINE; }
<raw_line>"\n"                  { yy_pop_state(); }

<encoding_content>"{"           {
                                    read_block(temp);
                                    yylvalp->cstring = temp; return RAW_BLOCK;
                                }


%%