2019-04-06 20:58:03 -07:00
|
|
|
%option noyywrap
|
|
|
|
|
|
|
|
%{
|
|
|
|
|
|
|
|
#define PRINTJ(format, str, v) printf("%s\t" format "\n", str, v)
|
|
|
|
#define PRINT(format, str, v) { int i; printf(str); i = 1 + (16 - strlen(str)) / 8; while(i--) putc('\t', yyout); printf(format "\n", v); }
|
|
|
|
#define PRINTD(name) PRINT("%s", name, yytext)
|
|
|
|
|
|
|
|
int indent_stack[128];
|
|
|
|
int indent_sp = 0;
|
|
|
|
|
|
|
|
void handle_indent(int l) {
|
|
|
|
while(l != indent_stack[indent_sp]) {
|
|
|
|
if(l > indent_stack[indent_sp]) {
|
|
|
|
indent_stack[++indent_sp] = l;
|
|
|
|
printf("INDENT\n");
|
|
|
|
} else {
|
|
|
|
indent_sp--;
|
|
|
|
printf("DEDENT\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
2019-04-12 11:18:02 -07:00
|
|
|
^[^ ] { handle_indent(0); REJECT }
|
|
|
|
|
2019-04-06 20:58:03 -07:00
|
|
|
^(#[^\n]*)?\n {}
|
|
|
|
\n printf("NEWLINE\n");
|
|
|
|
|
|
|
|
<<EOF>> { handle_indent(0); return 0; }
|
|
|
|
|
|
|
|
^[ ]* handle_indent(yyleng);
|
|
|
|
[ ]* {}
|
|
|
|
-?[0-9]+\.[0-9]* PRINT("%.6g", "FLOAT", atof(yytext));
|
|
|
|
[0-9]+ PRINTD("INTEGER");
|
|
|
|
True|False PRINT("%d", "BOOLEAN", yytext[0] == 'T');
|
|
|
|
and PRINTD("AND");
|
|
|
|
break PRINTD("BREAK");
|
|
|
|
def PRINTD("DEF");
|
|
|
|
elif PRINTD("ELIF");
|
|
|
|
else PRINTD("ELSE");
|
|
|
|
for PRINTD("FOR");
|
|
|
|
if PRINTD("IF");
|
|
|
|
not PRINTD("NOT");
|
|
|
|
or PRINTD("OR");
|
|
|
|
return PRINTD("RETURN");
|
|
|
|
while PRINTD("WHILE");
|
|
|
|
[a-zA-Z_][a-zA-Z_0-9]* PRINTD("IDENTIFIER");
|
|
|
|
"=" PRINTD("ASSIGN");
|
|
|
|
"+" PRINTD("PLUS");
|
|
|
|
"-" PRINTD("MINUS");
|
|
|
|
"*" PRINTD("TIMES");
|
|
|
|
"/" PRINTD("DIVIDEDBY");
|
|
|
|
"==" PRINTD("EQ");
|
|
|
|
"!=" PRINTD("NEQ");
|
|
|
|
">" PRINTD("GT");
|
|
|
|
">=" PRINTD("GTE");
|
|
|
|
"<" PRINTD("LT");
|
|
|
|
"<=" PRINTD("LTE");
|
|
|
|
"(" PRINTD("LPAREN");
|
|
|
|
")" PRINTD("RPAREN");
|
|
|
|
"," PRINTD("COMMA");
|
|
|
|
":" PRINTD("COLON");
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
indent_stack[0] = 0;
|
|
|
|
yylex();
|
|
|
|
}
|