Fixed typos in parsers as per the typo in PARSER_DOC.
[ohcount] / ext / ohcount_native / ragel_parsers / xslt.rl
1 // xslt.rl written by Mitchell Foral. mitchell<att>caladbolg<dott>net.
2
3 /************************* Required for every parser *************************/
4 #ifndef RAGEL_XSLT_PARSER
5 #define RAGEL_XSLT_PARSER
6
7 #include "ragel_parser_macros.h"
8
9 // the name of the language
10 const char *XSLT_LANG = "xslt";
11
12 // the languages entities
13 const char *xslt_entities[] = {
14   "space", "comment", "doctype",
15   "tag", "entity", "any"
16 };
17
18 // constants associated with the entities
19 enum {
20   XSLT_SPACE = 0, XSLT_COMMENT, XSLT_DOCTYPE,
21   XSLT_TAG, XSLT_ENTITY, XSLT_ANY
22 };
23
24 /*****************************************************************************/
25
26 %%{
27   machine xslt;
28   write data;
29   include common "common.rl";
30
31   # Line counting machine
32
33   action xslt_ccallback {
34     switch(entity) {
35     case XSLT_SPACE:
36       ls
37       break;
38     case XSLT_ANY:
39       code
40       break;
41     case INTERNAL_NL:
42       std_internal_newline(XSLT_LANG)
43       break;
44     case NEWLINE:
45       std_newline(XSLT_LANG)
46       break;
47     case CHECK_BLANK_ENTRY:
48       check_blank_entry(XSLT_LANG)
49     }
50   }
51
52   xslt_comment =
53     '<!--' @comment (
54       newline %{ entity = INTERNAL_NL; } %xslt_ccallback
55       |
56       ws
57       |
58       (nonnewline - ws) @comment
59     )* :>> '-->';
60
61   xslt_sq_str =
62     '\'' @code (
63       newline %{ entity = INTERNAL_NL; } %xslt_ccallback
64       |
65       ws
66       |
67       [^\r\n\f\t '\\] @code
68       |
69       '\\' nonnewline @code
70     )* '\'';
71   xslt_dq_str =
72     '"' @code (
73       newline %{ entity = INTERNAL_NL; } %xslt_ccallback
74       |
75       ws
76       |
77       [^\r\n\f\t "\\] @code
78       |
79       '\\' nonnewline @code
80     )* '"';
81   xslt_cdata_str =
82     '<![CDATA[' @code (
83       newline %{ entity = INTERNAL_NL; } %xslt_ccallback
84       |
85       ws
86       |
87       (nonnewline - ws) @code
88     )* :>> ']]>';
89   xslt_string = xslt_sq_str | xslt_dq_str | xslt_cdata_str;
90
91   xslt_line := |*
92     spaces        ${ entity = XSLT_SPACE; } => xslt_ccallback;
93     xslt_comment;
94     xslt_string;
95     newline       ${ entity = NEWLINE;    } => xslt_ccallback;
96     ^space        ${ entity = XSLT_ANY;   } => xslt_ccallback;
97   *|;
98
99   # Entity machine
100
101   action xslt_ecallback {
102     callback(XSLT_LANG, xslt_entities[entity], cint(ts), cint(te));
103   }
104
105   xslt_entity := 'TODO:';
106 }%%
107
108 /************************* Required for every parser *************************/
109
110 /* Parses a string buffer with XSLT markup.
111  *
112  * @param *buffer The string to parse.
113  * @param length The length of the string to parse.
114  * @param count Integer flag specifying whether or not to count lines. If yes,
115  *   uses the Ragel machine optimized for counting. Otherwise uses the Ragel
116  *   machine optimized for returning entity positions.
117  * @param *callback Callback function. If count is set, callback is called for
118  *   every line of code, comment, or blank with 'lcode', 'lcomment', and
119  *   'lblank' respectively. Otherwise callback is called for each entity found.
120  */
121 void parse_xslt(char *buffer, int length, int count,
122   void (*callback) (const char *lang, const char *entity, int start, int end)
123   ) {
124   init
125
126   %% write init;
127   cs = (count) ? xslt_en_xslt_line : xslt_en_xslt_entity;
128   %% write exec;
129
130   // if no newline at EOF; callback contents of last line
131   if (count) { process_last_line(XSLT_LANG) }
132 }
133
134 #endif
135
136 /*****************************************************************************/