summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/automate/lexer.ll
diff options
context:
space:
mode:
Diffstat (limited to '2003/i/buzz/src/automate/lexer.ll')
-rw-r--r--2003/i/buzz/src/automate/lexer.ll73
1 files changed, 73 insertions, 0 deletions
diff --git a/2003/i/buzz/src/automate/lexer.ll b/2003/i/buzz/src/automate/lexer.ll
new file mode 100644
index 0000000..6760aee
--- /dev/null
+++ b/2003/i/buzz/src/automate/lexer.ll
@@ -0,0 +1,73 @@
+%{
+#include <iostream>
+using namespace std;
+
+#include "grafcet.h"
+using namespace Automate;
+
+#include "grammar.tab.hh"
+
+int yyparse (void);
+
+Grafcet *input_grafcet;
+
+%}
+
+ID [_a-zA-Z][-_a-zA-Z0-9]*
+
+NUM [-+]?[0-9]+
+
+FLOAT [-+]?[0-9]*"."[0-9]*
+
+STRING \"[^\n"]\"
+
+%option noyywrap nounput
+
+%%
+
+"goto" return GOTO;
+
+"print" return PRINT;
+
+[-#+=.<>] return yytext[0];
+
+{FLOAT} {
+ yylval.fl = strtod (yytext, 0);
+ return FLOAT;
+}
+
+{NUM} {
+ yylval.num = strtol (yytext, 0, 0);
+ return NUM;
+}
+
+{STRING} {
+ yylval.s = new string (yytext + 1, yyleng - 2);
+ return STRING;
+}
+
+"true" { yylval.boolean = true; return BOOL; }
+"false" { yylval.boolean = false; return BOOL; }
+
+[ \t\n]+ /* Rien à battre. */
+
+. return ERR;
+
+%%
+
+Grafcet *parse_string (const char *s)
+{
+ yy_scan_string (s);
+ return yyparse () ? 0 : input_grafcet;
+}
+
+Grafcet *parse_file (const char *filename)
+{
+ yyin = fopen (filename, "r");
+ if (!yyin) return 0;
+ int r = yyparse ();
+ fclose (yyin);
+ return r ? 0 : input_grafcet;
+}
+
+// vim: ft=lex