aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/tests/flex3test.l
diff options
context:
space:
mode:
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/tests/flex3test.l')
-rw-r--r--gfsm/gfsm/src/libgfsm/tests/flex3test.l232
1 files changed, 232 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/tests/flex3test.l b/gfsm/gfsm/src/libgfsm/tests/flex3test.l
new file mode 100644
index 0000000..27c1cc1
--- /dev/null
+++ b/gfsm/gfsm/src/libgfsm/tests/flex3test.l
@@ -0,0 +1,232 @@
+/*======================================================================
+ * Flex Options
+ */
+%option outfile="flex3test.lex.c"
+%option header-file="flex3test.lex.h"
+%option prefix="testme_yy"
+%option reentrant
+%option 8bit
+%option yylineno
+
+%{
+/*======================================================================
+ * User C Header
+ */
+
+#include <gfsm.h>
+
+typedef enum {
+ T_EOF = 256,
+ T_CHAR = 257,
+ T_BRACKETED = 258,
+ T_BSPACE = 259,
+ T_WEIGHT = 260,
+ T_UINT = 261,
+ T_UTF8 = 262,
+
+ T_LPAREN = '(',
+ T_RPAREN = ')',
+ T_LBRACKET = '[',
+ T_RBRACKET = ']',
+ T_LANGLE = '<',
+ T_RANGLE = '>',
+
+ T_BEQUAL = '=',
+
+ T_OTHER = 65535
+} TokenType;
+
+#define GSTR_BUF ((GString*)((gfsmScanner*)yyextra)->data)
+
+%}
+
+/*======================================================================
+ * Flex Definitions
+ */
+
+DIGIT [0-9]
+SPACE [[:space:]]
+WCHAR [^\<\>\[\]\\ \t\n\r\#]
+BCHAR [^\\\]\ \t\n\r\=]
+UTF8PREFIX "Ã"
+
+%x ESCAPE BRACKETED BESCAPE COMMENT WEIGHT UINT UTF8 BUTF8
+
+/*======================================================================
+ * Rules
+ */
+%%
+
+{UTF8PREFIX} { BEGIN(UTF8); g_string_set_size(GSTR_BUF,1); GSTR_BUF->str[0] = yytext[0]; }
+
+"\\" { BEGIN(ESCAPE); }
+
+"#" { BEGIN(COMMENT); }
+
+"[" { BEGIN(BRACKETED); g_string_truncate(GSTR_BUF,0); return T_LBRACKET; }
+
+"<" { BEGIN(WEIGHT); return T_LANGLE; }
+
+
+"(" { return '('; }
+")" { return ')'; }
+
+"*" { return '*'; }
+"+" { return '+'; }
+"^" { BEGIN(UINT); return '|'; }
+"?" { return '?'; }
+"!" { return '!'; }
+"|" { return '|'; }
+"&" { return '&'; }
+":" { return ':'; }
+"@" { return '@'; }
+"-" { return '-'; }
+
+{SPACE} { /* ignore */ }
+
+{WCHAR} { return T_CHAR; }
+
+
+
+<UTF8>{UTF8PREFIX}+ { g_string_append(GSTR_BUF, yytext); }
+
+<UTF8>. { BEGIN(INITIAL); g_string_append_c(GSTR_BUF, yytext[0]); return T_UTF8; }
+
+
+<WEIGHT>([\+\-])?({DIGIT}*\.)?({DIGIT}+)([Ee]([\+\-]?){DIGIT}+)? { return T_WEIGHT; /* hack */ }
+
+<WEIGHT>\> { BEGIN(INITIAL); return T_RANGLE; }
+
+
+
+<UINT>{DIGIT}+ { BEGIN(INITIAL); return T_UINT; }
+
+
+<COMMENT>[^\n]*\n { BEGIN(INITIAL); /* ignore comments */ }
+
+
+
+
+<ESCAPE>. { BEGIN(INITIAL); return T_CHAR; }
+
+
+
+<BRACKETED>{UTF8PREFIX} { BEGIN(BUTF8); g_string_append_c(GSTR_BUF, yytext[0]); }
+
+<BRACKETED>\] { BEGIN(INITIAL); return T_RBRACKET; }
+
+<BRACKETED>{BCHAR} { g_string_append_c(GSTR_BUF, yytext[0]); }
+
+<BRACKETED>{SPACE} { return T_BSPACE; }
+
+<BRACKETED>"=" { return T_BEQUAL; }
+
+<BRACKETED>\\ { BEGIN(BESCAPE); }
+
+
+<BUTF8>{UTF8PREFIX}+ { g_string_append(GSTR_BUF, yytext); }
+
+<BUTF8>. { BEGIN(BRACKETED); g_string_append_c(GSTR_BUF, yytext[0]); }
+
+
+<BESCAPE>. { BEGIN(BRACKETED); g_string_append_c(GSTR_BUF, yytext[0]); }
+
+
+
+<<EOF>> { return T_EOF; }
+
+
+<*>. {
+ gfsm_scanner_carp(yyextra, "bad character '%s'", yytext);
+ return T_OTHER;
+}
+
+%%
+
+/*======================================================================
+ * User C Code
+ */
+
+void testme(gfsmScanner *scanner) {
+ TokenType tok;
+ double weight;
+ unsigned int uint;
+
+ while ((tok=testme_yylex(scanner->yyscanner)) != T_EOF) {
+ switch (tok) {
+ case T_CHAR:
+ printf("(char) '%s'\n", testme_yyget_text(scanner->yyscanner));
+ break;
+
+ case T_UTF8:
+ printf("(utf8) '%s'\n", ((GString*)scanner->data)->str);
+ break;
+
+ case T_LBRACKET:
+ printf("(lbracket)\n");
+ break;
+
+ case T_RBRACKET:
+ printf("(rbracket) gstr=\"%s\"\n", ((GString*)scanner->data)->str);
+ g_string_truncate(((GString*)scanner->data),0);
+ break;
+ case T_BSPACE:
+ printf("(bspace) gstr=\"%s\"\n", ((GString*)scanner->data)->str);
+ g_string_truncate(((GString*)scanner->data),0);
+ break;
+ case T_BEQUAL:
+ printf("(bequal) gstr=\"%s\"\n", ((GString*)scanner->data)->str);
+ g_string_truncate(((GString*)scanner->data),0);
+ break;
+
+ case T_LANGLE:
+ printf("(langle)\n");
+ break;
+ case T_RANGLE:
+ printf("(rangle)\n");
+ break;
+ case T_WEIGHT:
+ weight = strtod(testme_yyget_text(scanner->yyscanner),NULL);
+ printf("(weight) =%g\n", weight);
+ break;
+
+ case T_UINT:
+ uint = strtol(testme_yyget_text(scanner->yyscanner),NULL,0);
+ printf("(uint) =%d\n", uint);
+ break;
+
+ default:
+ printf("(other=%d~'%c'): (%s)\n", tok, tok, testme_yyget_text(scanner->yyscanner));
+ break;
+ }
+
+ if (scanner->err) {
+ fprintf(stderr, "Error: %s\n", scanner->err->message);
+ g_clear_error(&(scanner->err));
+ break;
+ }
+ }
+}
+
+int main(void) {
+ gfsmScanner *scanner = gfsm_scanner_new("myScanner",testme_yy);
+ scanner->data = g_string_new("");
+
+ //-- first, scan a string
+ /*
+ gfsm_scanner_scan_string(scanner, "line 1\nline 2\nline 3.");
+ scanner->filename = g_strdup("string");
+ testme(scanner);
+ */
+
+ //-- now scan stdin
+ gfsm_scanner_scan_filename(scanner, "-");
+ testme(scanner);
+
+ gfsm_scanner_free(scanner);
+
+ return 0;
+}
+
+//int testme_yywrap(yyscan_t yyscanner) { return 1; }
+GFSM_SCANNER_YYWRAP(testme_yy)