Untitled
unknown
plain_text
a year ago
5.1 kB
9
Indexable
/*
* The scanner definition for COOL.
*/
/*
* Stuff enclosed in %{ %} in the first section is copied verbatim to the
* output, so headers and global definitions are placed here to be visible
* to the code in the file. Don't remove anything that was here initially
*/
%{
#include <cool-parse.h>
#include <stringtab.h>
#include <utilities.h>
/* The compiler assumes these identifiers. */
#define yylval cool_yylval
#define yylex cool_yylex
/* Max size of string constants */
#define MAX_STR_CONST 1025
#define YY_NO_UNPUT /* keep g++ happy */
/*
The two statements below are here just so this program will compile.
You may need to change or remove them on your final code.
*/
#define yywrap() 1
#define YY_SKIP_YYWRAP
extern FILE *fin; /* we read from this file */
/* define YY_INPUT so we read from the FILE fin:
* This change makes it possible to use this scanner in
* the Cool compiler.
*/
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
if ( (result = fread( (char*)buf, sizeof(char), max_size, fin)) < 0) \
YY_FATAL_ERROR( "read() in flex scanner failed");
char string_buf[MAX_STR_CONST]; /* to assemble string constants */
char *string_buf_ptr;
extern int curr_lineno;
extern int verbose_flag;
extern YYSTYPE cool_yylval;
/*
* Add Your own definitions here
*/
int commentHandler = 0;
std::string readString = "";
int readNullToken = 0;
%}
DARROW =>
LE <=
ASSIGN <-
WHITESPACE (" "|"\t"|"\r"|"\f"|"\v")
DIGIT [0-9]
TOKENS [{|}|(|)|:|;|@|,|.|+|\-|*|/|=|<|~]
INVALIDS ("!"|"#"|"$"|"%"|"^"|"&"|"_"|">"|"?"|"`"|"["|"]"|"|"|"\\")
TYPEID [A-Z][a-zA-Z0-9_]*
OBJECTID [a-z][a-zA-Z0-9_]*
%START LONG_COMMENT
%START COMMENT
%START STRING
%%
<INITIAL,LONG_COMMENT,COMMENT>"(*" {
commentHandler += 1;
BEGIN LONG_COMMENT;
}
<LONG_COMMENT>[^\n(*]* { }
<LONG_COMMENT>[()*] { }
<LONG_COMMENT>"*)" {
commentHandler -= 1;
if (commentHandler == 0) BEGIN INITIAL;
}
<LONG_COMMENT><<EOF>> {
BEGIN INITIAL;
yylval.error_msg = (char*)"EOF in comment";
return (ERROR);
}
"*)" {
yylval.error_msg = (char*)"Unmatched *)";
return (ERROR);
}
<INITIAL>"--" {
BEGIN COMMENT;
}
<COMMENT>[^\n]* { }
<COMMENT>\n {
curr_lineno += 1;
BEGIN INITIAL;
}
<INITIAL>\" {
readString = "";
readNullToken = 0;
BEGIN STRING;
}
<STRING>[^\n\0"\\]* {
readString += yytext;
}
<STRING>\\(.|\n) {
if (yytext[1] == '\n') {
curr_lineno += 1;
readString += '\n';
}
else if (yytext[1] == 'n') `{
readString += '\n';
}
else if (yytext[1] == 't') {
readString += '\t';
}
else if (yytext[1] == 'f') {
readString += '\f';
}
else if (yytext[1] == 'b') {
readString += '\b';
}
else if (yytext[1] == '\0') {
readNullToken = 1;
}
else {
readString += yytext[1];
}
}
<STRING>\n {
BEGIN INITIAL;
curr_lineno += 1;
yylval.error_msg = (char*)"Unterminated string constant";
return (ERROR);
}
<STRING>\0 {
readNullToken = 1;
}
<STRING>\" {
BEGIN INITIAL;
if(readNullToken == 1) {
yylval.error_msg = (char*)"String contains null character";
return (ERROR);
}
if(readString.length() >= MAX_STR_CONST) {
yylval.error_msg = (char*)"String constant too long";
return (ERROR);
}
yylval.symbol = stringtable.add_string((char *) readString.c_str());
return (STR_CONST);
}
<STRING><<EOF>> {
BEGIN INITIAL;
yylval.error_msg = (char*)"EOF in string constant";
return (ERROR);
}
"t"[rR][uU][eE] {
yylval.boolean = 1;
return (BOOL_CONST);
}
"f"[aA][lL][sS][eE] {
yylval.boolean = 0;
return (BOOL_CONST);
}
[cC][lL][aA][sS][sS] { return (CLASS); }
[eE][lL][sS][eE] { return (ELSE); }
[fF][iI] { return (FI); }
[iI][fF] { return (IF); }
[Ii][Nn] { return (IN); }
[iI][nN][hH][eE][rR][iI][tT][sS] { return (INHERITS); }
[iI][sS][vV][oO][iI][dD] { return (ISVOID); }
[lL][eE][tT] { return (LET); }
[lL][oO][oO][pP] { return (LOOP); }
[pP][oO][oO][lL] { return (POOL); }
[tT][hH][eE][nN] { return (THEN); }
[wW][hH][iI][lL][eE] { return (WHILE); }
[cC][aA][sS][eE] { return (CASE); }
[eE][sS][aA][cC] { return (ESAC); }
[nN][eE][wW] { return (NEW); }
[oO][fF] { return (OF); }
[nN][oO][tT] { return (NOT); }
"=>" { return (DARROW); }
"<-" { return (ASSIGN); }
"<=" { return (LE); }
{TOKENS} { return yytext[0]; }
{DIGIT}+ { yylval.symbol = inttable.add_string(yytext); return (INT_CONST); }
{TYPEID} { yylval.symbol = idtable.add_string(yytext); return (TYPEID); }
{OBJECTID} { yylval.symbol = idtable.add_string(yytext); return (OBJECTID); }
\n { curr_lineno += 1; }
{WHITESPACE}+ { }
{INVALIDS} { yylval.error_msg = yytext; return (ERROR); }
. { yylval.error_msg = yytext; return (ERROR); }
%%Editor is loading...
Leave a Comment