Add solutions to the homework
This commit is contained in:
parent
357d56bc96
commit
5c7f1879bf
73
python.flx
Normal file
73
python.flx
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
%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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
^(#[^\n]*)?\n[^ ] { handle_indent(0); unput(yytext[yyleng-1]); }
|
||||||
|
^(#[^\n]*)?\n {}
|
||||||
|
\n[^ ] { printf("NEWLINE\n"); handle_indent(0); unput(yytext[1]); }
|
||||||
|
\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();
|
||||||
|
}
|
9
test.sh
Executable file
9
test.sh
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
flex python.flx && gcc lex.yy.c
|
||||||
|
mkdir -p real_output
|
||||||
|
mkdir -p diff_results
|
||||||
|
|
||||||
|
for file in $(ls testing_code); do
|
||||||
|
name=$(echo $file | awk -F'[.]' '{print $1}')
|
||||||
|
./a.out < testing_code/$file > real_output/$name.out
|
||||||
|
diff example_output/$name.out real_output/$name.out > diff_results/$name.diff
|
||||||
|
done
|
Loading…
Reference in New Issue
Block a user