Moved common variables into ragel_parser_macros.h.
[ohcount] / ext / ohcount_native / ragel_parsers / java.rl
1 // java.rl written by Mitchell Foral. mitchell<att>caladbolg<dott>net.
2
3 /************************* Required for every parser *************************/
4 #include "ragel_parser_macros.h"
5
6 // the name of the language
7 const char *JAVA_LANG = "java";
8
9 // the languages entities
10 const char *java_entities[] = {
11   "space", "comment", "string", "number",
12   "keyword", "identifier", "operator", "any"
13 };
14
15 // constants associated with the entities
16 enum {
17   JAVA_SPACE = 0, JAVA_COMMENT, JAVA_STRING, JAVA_NUMBER,
18   JAVA_KEYWORD, JAVA_IDENTIFIER, JAVA_OPERATOR, JAVA_ANY
19 };
20
21 /*****************************************************************************/
22
23 %%{
24   machine java;
25   write data;
26   include common "common.rl";
27
28   # Line counting machine
29
30   action java_ccallback {
31     switch(entity) {
32     case JAVA_SPACE:
33       ls
34       break;
35     case JAVA_ANY:
36       code
37       break;
38     case INTERNAL_NL:
39       std_internal_newline(JAVA_LANG)
40       break;
41     case NEWLINE:
42       std_newline(JAVA_LANG)
43     }
44   }
45
46   java_line_comment = '//' @comment nonnewline*;
47   java_block_comment =
48     '/*' @comment (
49       newline %{ entity = INTERNAL_NL; } %java_ccallback
50       |
51       ws
52       |
53       (nonnewline - ws) @comment
54     )* :>> '*/';
55   java_comment = java_line_comment | java_block_comment;
56
57   java_sq_str = '\'' @code ([^'\\] | '\\' nonnewline)* '\'';
58   java_dq_str = '"' @code ([^"\\] | '\\' nonnewline)* '"';
59   java_string = java_sq_str | java_dq_str;
60
61   java_line := |*
62     spaces        ${ entity = JAVA_SPACE; } => java_ccallback;
63     java_comment;
64     java_string;
65     newline       ${ entity = NEWLINE;    } => java_ccallback;
66     ^space        ${ entity = JAVA_ANY;   } => java_ccallback;
67   *|;
68
69   # Entity machine
70
71   action java_ecallback {
72     callback(JAVA_LANG, java_entities[entity], cint(ts), cint(te));
73   }
74
75   java_entity := 'TODO:';
76 }%%
77
78 /* Parses a string buffer with Java code.
79  *
80  * @param *buffer The string to parse.
81  * @param length The length of the string to parse.
82  * @param count Integer flag specifying whether or not to count lines. If yes,
83  *   uses the Ragel machine optimized for counting. Otherwise uses the Ragel
84  *   machine optimized for returning entity positions.
85  * @param *callback Callback function. If count is set, callback is called for
86  *   every line of code, comment, or blank with 'lcode', 'lcomment', and
87  *   'lblank' respectively. Otherwise callback is called for each entity found.
88  */
89 void parse_java(char *buffer, int length, int count,
90   void (*callback) (const char *lang, const char *entity, int start, int end)
91   ) {
92   p = buffer;
93   pe = buffer + length;
94   eof = pe;
95
96   buffer_start = buffer;
97   whole_line_comment = 0;
98   line_contains_code = 0;
99   line_start = 0;
100   entity = 0;
101
102   %% write init;
103   cs = (count) ? java_en_java_line : java_en_java_entity;
104   %% write exec;
105
106   // if no newline at EOF; callback contents of last line
107   if (count) { process_last_line(JAVA_LANG) }
108 }