121 lines
2.3 KiB
Plaintext
121 lines
2.3 KiB
Plaintext
|
|
%option nounput
|
|
%option bison-locations
|
|
|
|
%{
|
|
|
|
#include "parser.tab.hh"
|
|
#include <string>
|
|
using namespace std;
|
|
static string build_string;
|
|
|
|
%}
|
|
|
|
%x str
|
|
|
|
%%
|
|
|
|
/* operators */
|
|
:= return ASSIGN;
|
|
::= return DASSIGN;
|
|
== return DEQUALS;
|
|
\/ return DIVIDE;
|
|
= return EQUALS;
|
|
\> return GREATER;
|
|
\< return LESS;
|
|
=~ return MATCH;
|
|
- return MINUS;
|
|
% return MOD;
|
|
\+ return PLUS;
|
|
\* return STAR;
|
|
|
|
/* punctuation */
|
|
: return COLON;
|
|
, return COMMA;
|
|
:: return DCOLON;
|
|
\$ return DOLLAR;
|
|
\. return DOT;
|
|
\<- return FROM;
|
|
\? return QUESTION;
|
|
; return SEMICOLON;
|
|
|
|
\{ return LCURLY;
|
|
\} return RCURLY;
|
|
\[ return LBRACKET;
|
|
\] return RBRACKET;
|
|
\( return LPAREN;
|
|
\) return RPAREN;
|
|
|
|
/* literals */
|
|
[0-9]+ {
|
|
return INT_LITERAL;
|
|
}
|
|
0x[0-9A-Fa-f]+ {
|
|
return INT_LITERAL;
|
|
}
|
|
0b[01]+ {
|
|
return INT_LITERAL;
|
|
}
|
|
[0-9]*\.[0-9]+([eE]-?[0-9]+)? {
|
|
return REAL_LITERAL;
|
|
}
|
|
|
|
/* primitive types */
|
|
byte return BYTE;
|
|
ubyte return UBYTE;
|
|
char return CHAR;
|
|
wchar return WCHAR;
|
|
short return SHORT;
|
|
ushort return USHORT;
|
|
int return INT;
|
|
uint return UINT;
|
|
long return LONG;
|
|
ulong return ULONG;
|
|
float return FLOAT;
|
|
double return DOUBLE;
|
|
|
|
/* keywords */
|
|
import return IMPORT;
|
|
module return MODULE;
|
|
return return RETURN;
|
|
struct return STRUCT;
|
|
|
|
/* identifiers */
|
|
[a-zA-Z_][a-zA-Z_0-9]* {
|
|
return IDENTIFIER;
|
|
}
|
|
|
|
/* strings */
|
|
\" build_string = ""; BEGIN(str);
|
|
<str>{
|
|
|
|
\" {
|
|
/* end of the string literal */
|
|
BEGIN(INITIAL);
|
|
return STRING_LITERAL;
|
|
}
|
|
\\x[0-9A-Fa-f]{2} {
|
|
/* hexadecimal escape code */
|
|
unsigned int val;
|
|
(void) sscanf(yytext + 2, "%x", &val);
|
|
build_string += (char) val;
|
|
}
|
|
\\n build_string += '\n';
|
|
\\t build_string += '\t';
|
|
\\r build_string += '\r';
|
|
\\b build_string += '\b';
|
|
\\f build_string += '\f';
|
|
\\(.|\n) build_string += yytext[1];
|
|
[^\\\"]+ build_string += yytext;
|
|
|
|
}
|
|
|
|
/* whitespace */
|
|
\n yylloc->first_line++; yylloc->last_line++;
|
|
[ \t\v] /* ignore whitespace */
|
|
|
|
/* anything else */
|
|
. return yytext[0];
|
|
|
|
%%
|