summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/automate/lexer.ll
blob: 6760aee8277db9cb8c48344d856246419b916aff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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