-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlexer.l
99 lines (97 loc) · 2.32 KB
/
lexer.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
%{
/* Asp applicative language
* J.Cupitt, November 86
* Lexical analyser */
%}
%Start UNARY
%%
[\n\t\b ] ;
"%" { int ch;
while( (ch = input()) != EOF &&
ch != '\n' )
;
return( yylex() );
}
error { BEGIN UNARY; return( TK_ERROR ); }
hd { BEGIN UNARY; return( TK_HD ); }
tl { BEGIN UNARY; return( TK_TL ); }
and { BEGIN UNARY; return( TK_AND ); }
or { BEGIN UNARY; return( TK_OR ); }
code { BEGIN UNARY; return( TK_CODE ); }
decode { BEGIN UNARY; return( TK_DECODE ); }
read { BEGIN UNARY; return( TK_READ ); }
write { BEGIN UNARY; return( TK_WRITE ); }
"#include" { BEGIN UNARY; return( TK_INCLUDE ); }
"[]" { yylval.cons = BuildNilConst();
BEGIN UNARY;
return( TK_CONST );
}
\"\" { yylval.cons = BuildNilConst();
BEGIN UNARY;
return( TK_CONST );
}
<UNARY>"+" return( TK_UPLUS );
<UNARY>"-" return( TK_UMINUS );
"+" |
"-" |
"*" |
"/" |
":" |
"=" |
"<" |
">" |
"[" |
"]" |
"{" |
"}" |
"(" |
"," |
"~" { BEGIN UNARY; return( *yytext ); }
">=" { BEGIN UNARY; return( TK_MOREEQUAL ); }
"<=" { BEGIN UNARY; return( TK_LESSEQUAL ); }
"<>" { BEGIN UNARY; return( TK_NOTEQUAL ); }
".." { BEGIN UNARY; return( TK_DOTS ); }
"." { BEGIN UNARY; return( *yytext ); }
")" |
";" { BEGIN 0; return( *yytext ); }
\"[^"]* { if( yytext[ yyleng-1 ] == '\\')
yymore();
else {
input(); /* Skip closing " */
yylval.cons =
BuildStringConst( yytext+1 );
return( TK_CONST );
}
BEGIN UNARY;
}
[0-9]+ { yylval.cons =
BuildNumConst( atoi( yytext ) );
BEGIN 0;
return( TK_CONST );
}
true { yylval.cons = BuildBoolConst( TRUE );
BEGIN UNARY;
return( TK_CONST );
}
false { yylval.cons =
BuildBoolConst( FALSE );
BEGIN UNARY;
return( TK_CONST );
}
"'"\\?."'" { yylval.cons =
BuildCharConst( yytext+1 );
BEGIN UNARY;
return( TK_CONST );
}
[A-Za-z][A-Za-z0-9_\']* { yylval.cons =
BuildStringConst( yytext );
BEGIN 0;
return( TK_IDENTIFIER );
}
. { errorln( "Illegal character '" );
errorstr( yytext );
errorstr( "'" );
errorend();
quit();
}
%%