1 // brainfuck.rl written by Boris 'billiob' Faure billiob<att>gmail<dott>com
3 /************************* Required for every parser *************************/
4 #ifndef OHCOUNT_BRAINFUCK_PARSER_H
5 #define OHCOUNT_BRAINFUCK_PARSER_H
7 #include "../parser_macros.h"
9 // the name of the language
10 const char *BRAINFUCK_LANG = LANG_BRAINFUCK;
12 // the languages entities
13 const char *brainfuck_entities[] = {
14 "space", "comment", "operator"
17 // constants associated with the entities
19 BRAINFUCK_SPACE = 0, BRAINFUCK_COMMENT, BRAINFUCK_OPERATOR
22 /*****************************************************************************/
27 include common "common.rl";
29 # Line counting machine
31 action brainfuck_ccallback {
36 case BRAINFUCK_OPERATOR:
39 case BRAINFUCK_COMMENT:
43 std_internal_newline(BRAINFUCK_LANG)
46 std_newline(BRAINFUCK_LANG)
50 brainfuck_operator = [+\-<>.,\[\]] @code;
53 spaces ${ entity = BRAINFUCK_SPACE; } => brainfuck_ccallback;
54 newline ${ entity = NEWLINE; } => brainfuck_ccallback;
55 brainfuck_operator ${ entity = BRAINFUCK_OPERATOR; } => brainfuck_ccallback;
56 ^space ${ entity = BRAINFUCK_COMMENT; } => brainfuck_ccallback;
61 action brainfuck_ecallback {
62 callback(BRAINFUCK_LANG, brainfuck_entities[entity], cint(ts), cint(te), userdata);
65 brainfuck_operator_entity = [+\-<>.,\[\]];
67 brainfuck_comment_entity = !(space | brainfuck_operator_entity);
69 brainfuck_entity := |*
70 space+ ${ entity = BRAINFUCK_SPACE; } => brainfuck_ecallback;
71 brainfuck_operator_entity ${ entity = BRAINFUCK_OPERATOR; } => brainfuck_ecallback;
72 brainfuck_comment_entity ${ entity = BRAINFUCK_COMMENT; } => brainfuck_ecallback;
76 /************************* Required for every parser *************************/
78 /* Parses a string buffer with Brainfuck code.
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.
89 void parse_brainfuck(char *buffer, int length, int count,
90 void (*callback) (const char *lang, const char *entity, int s,
97 cs = (count) ? brainfuck_en_brainfuck_line : brainfuck_en_brainfuck_entity;
100 // if no newline at EOF; callback contents of last line
101 if (count) { process_last_line(BRAINFUCK_LANG) }
106 /*****************************************************************************/