-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlsystem_scanner.l
102 lines (94 loc) · 2.38 KB
/
lsystem_scanner.l
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
%{
/* Copyright (c) 2008-2021 Alexey Ozeritskiy
* All rights reserved.
*/
#include <math.h>
#include <string.h>
#include <ctype.h>
#include "lsystem.h"
#include "lsystem_parser.h"
static int comment_caller;
static char * strdup_upper(const char * p)
{
int l = strlen(p);
char * r = (char*)malloc(l + 1);
char *r1 = r;
while ((*r++ = toupper(*p++)));
return r1;
}
%}
%option 8bit noyywrap case-insensitive
%s gen
%s grp
%s comment
%s order
AXIOM axiom
ALPHA alpha
ANGLE angle
THETA theta
PI pi
NUM [0-9]+\.?[0-9]*
VAR [a-zA-Z]
LS [a-zA-Z\+\-\[\]!0-9@\.\|\<\>\\/:\(\)]+
IDT [a-zA-Z\.0-9&\*_@!\+\-]+
OP [=/\*\+\-\(\)]
COMMENT ;.*\n?
WHITESPACE [ \t]
%%
<INITIAL,gen,grp>";" {
comment_caller = YY_START;
BEGIN(comment);
}
<comment>[ \t]*"order"[\ t]+ {
if (comment_caller != INITIAL) {
BEGIN(order);
return ORDER;
}
}
<order>[0-9]+ {
sscanf(yytext, "%lf", &yylval.num);
BEGIN(comment);
return NUM;
}
<comment>"\n" {
BEGIN(comment_caller);
++yylineno;
if (comment_caller != INITIAL) {
return '\n';
}
}
<INITIAL>{IDT} {
yylval.str = strdup(yytext);
return GRPIDT;
}
<grp>{NUM} { sscanf(yytext, "%lf", &yylval.num);
return NUM;
}
<gen>{LS} {
yylval.str = strdup_upper(yytext);
BEGIN(grp); return TURTLE; }
<INITIAL,grp,gen>"{" {
BEGIN(grp); return yytext[0]; }
<grp,gen>"}" {
BEGIN(INITIAL); return yytext[0]; }
<grp>{AXIOM} {
BEGIN(gen); return AXIOM; }
<grp>{ALPHA} { return ALPHA; }
<grp>{THETA} { return THETA; }
<grp>{ANGLE} { return ANGLE; }
<grp>{VAR} {
yylval.str = strdup_upper(yytext);
BEGIN(gen); return VAR;
}
<grp>{PI} { yylval.num = M_PI; return NUM; }
<grp>{OP} { return yytext[0]; }
<grp,gen>"=" { return yytext[0]; }
<grp,gen>"\n" { BEGIN(grp); ++yylineno; return '\n'; }
. {}
"\n" { ++yylineno; }
%%
/*
подсказка:
без указания группы действует во всех группах
<INITIAL> действует в первоначальной группе.
*/