diff --git a/labs/04/Makefile b/labs/04/Makefile new file mode 100644 index 0000000..66bdd94 --- /dev/null +++ b/labs/04/Makefile @@ -0,0 +1,30 @@ +LDFLAGS = -L/opt/homebrew/opt/flex/lib +CPPFLAGS = -I/opt/homebrew/opt/flex/include + +# generate +example: code_generator.py + python3 code_generator.py > example.ac + +# compile +gen_lex: + lex language_ac.l + gcc $(CPPFLAGS) $(LDFLAGS) lex.yy.c -o lexical_scan -lfl + +test: example.ac + ./lexical_scan < example.ac +# run lex, then compile lex.yy.c then run lexical_scan +# +stress: + lex language_ac.l + gcc $(CPPFLAGS) $(LDFLAGS) lex.yy.c -o lexical_scan -lfl + python3 code_generator.py --stress + ./lexical_scan < random_code.ac +run: + lex language_ac.l + gcc $(CPPFLAGS) $(LDFLAGS) lex.yy.c -o lexical_scan -lfl + python3 code_generator.py > example.ac + ./lexical_scan < example.ac + +# Limpiar archivos generados +clean: + rm -f lex.yy.c lexical_scan example.ac diff --git a/labs/04/code_generator.py b/labs/04/code_generator.py new file mode 100644 index 0000000..4ae97e1 --- /dev/null +++ b/labs/04/code_generator.py @@ -0,0 +1,78 @@ +import string +import random +import argparse + +def id_generator(size=10, chars=string.ascii_uppercase + string.digits): + return ''.join(random.choice(chars) for _ in range(size)) + +opreators = ["+","-","*","/"] + +def get_comment_line(): + comment_line = "//%s" % (id_generator()) + return comment_line + +def get_float_line(): + float_line = "f %s" % (random.choice(string.ascii_lowercase)) + return float_line + +def get_integer_line(): + integer_line = "i %s"% (random.choice(string.ascii_lowercase)) + return integer_line + +def get_asigment_line(): + asigment_line = "%s = %s" %(random.choice(string.ascii_lowercase),\ + random.randint(0,100)) + return asigment_line + +def get_asigment_line_2(): + asigment_line_2 = "%s = %s %s %s" % \ + (random.choice(string.ascii_lowercase),\ + random.choice(string.ascii_lowercase),\ + random.choice(opreators),\ + random.randint(0,100)) + return asigment_line_2 + +def get_print_line(): + print_line = "p %s" % (random.choice(string.ascii_lowercase)) + return print_line + + +parser = argparse.ArgumentParser(description='Generate random AC code') +parser.add_argument('--stress', dest='stress', action='store_true',\ + help='generate HUGE code to stress the lab') +args = parser.parse_args() + +if args.stress: + f= open("random_code.ac","w+") + for x in range(0, 100000): + comment_line = get_comment_line() + float_line = get_float_line() + integer_line = get_integer_line() + asigment_line = get_asigment_line() + asigment_line_2 = get_asigment_line_2() + print_line = get_print_line() + + f.write(comment_line + "\n") + f.write(float_line + "\n") + f.write(integer_line + "\n") + f.write(asigment_line+ "\n") + f.write(asigment_line_2 + "\n") + f.write(print_line + "\n") + + f.close() + +else: + comment_line = get_comment_line() + float_line = get_float_line() + integer_line = get_integer_line() + asigment_line = get_asigment_line() + asigment_line_2 = get_asigment_line_2() + print_line = get_print_line() + + print(comment_line) + print(float_line) + print(integer_line) + print(asigment_line) + print(asigment_line_2) + print(print_line) + diff --git a/labs/04/example.ac b/labs/04/example.ac new file mode 100644 index 0000000..ab2f9f6 --- /dev/null +++ b/labs/04/example.ac @@ -0,0 +1,6 @@ +//OFKZ5W996B +f q +i q +r = 61 +o4 = f - 98 +p k diff --git a/labs/04/language_ac.l b/labs/04/language_ac.l new file mode 100644 index 0000000..fc39afe --- /dev/null +++ b/labs/04/language_ac.l @@ -0,0 +1,30 @@ +%{ +#include +%} + +%option noyywrap + +letter [a-eg-hj-oq-zA-EG-HJ-OQ-Z] +digit [0-9] +number {digit}+ + +%% +\/{2}.* { printf("COMMENT "); } +f { printf("floatdcl "); } +i { printf("intdcl "); } += { printf("assign "); } +\+ { printf("plus "); } +\- { printf("minus "); } +\* { printf("multiplication "); } +\/ { printf("division "); } +p { printf("print "); } +({letter}{digit}*)+ { printf("id "); } +(0|([1-9]{digit}*))\.(({digit}*[1-9])|0) { printf("fnum "); } +{number} { printf("inum "); } +[ \t]+ /* ignore whitespace */ +%% + +int main() { + yylex(); + return 0; +} diff --git a/labs/04/lexical_scan b/labs/04/lexical_scan new file mode 100755 index 0000000..1a20455 Binary files /dev/null and b/labs/04/lexical_scan differ