Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Définition des variables globales
- opcodes = [
- # fonction entre adresse
- ["nop.", '\0', "\x00\x00"], #
- ["#", '\0', "\x00\x01"], #
- ["if", '(', "\x00\x02"], #
- ["elseif", '(', "\x00\x03"], #
- ["else", '\0', "\x00\x04"], #
- ["end.", '\0', "\x00\x05"], #
- ["continue.", '\0', "\x00\x06"], #
- ["break.", '\0', "\x00\x07"], #
- ["Program.exit.", '\0', "\x01\x00"], #
- ["Console.clean.", '\0', "\x02\x01"], #
- ["Console.print", ' ', "\x02\x01"], #
- ["Console.println", ' ', "\x02\x02"], #
- ["Console.sleep", ' ', "\x02\x03"], #
- ["String.lower", '(', "\x03\x00"], #
- ["String.upper", '(', "\x03\x01"], #
- ["String.length", '(', "\x03\x02"], #
- ["Math.floor", '(', "\x04\x00"], #
- ["Math.round", '(', "\x04\x01"], #
- ["Math.ceil", '(', "\x04\x02"], #
- ["Math.random", '(', "\x04\x03"], #
- ["Array.in", '(', "\x05\x00"], #
- ["Array.empty", '(', "\x05\x01"], # Non obligatoire (car on peut utiliser Array.size(tableau) == 0)
- ["Array.size", '(', "\x05\x02"], #
- ["File.open", '(', "\x06\x00"], #
- ["File.write", '(', "\x06\x01"], #
- ["File.writeLine", '(', "\x06\x02"], #
- ["File.writeFirstLine", '(', "\x06\x03"], #
- ["File.rewrite", '(', "\x06\x04"], #
- ["File.read", '(', "\x06\x05"], #
- ["File.readLine", '(', "\x06\x06"], #
- ["File.close", '(', "\x06\x07"] #
- ["File.countLine", '(', "\x06\x08"] #
- ]
- nbrWarnings = 0
- nbrErrors = 0
- # Fonction de compilation
- compile (File Src, File Dst)
- Data = [][] # contient le fichier source [ligne][colonne]
- nbrLignes = File.lines(Src) # nombre de lignes du fichier
- print "Compilation de \"" . Src . "\" -> \"" . Dst . "\"...\n"
- if (File.open(Src, 'r') == null) # Si le fichier source est inaccessible en lecture on affiche une erreur
- exit "Le fichier source \"" . Src . "\" n'a pu être ouvert en lecture."
- end.
- for (nbrLignes = 0 to nbrLignes)
- if (File.readline(Src, Data[nbrLignes]) != 1)
- exit "Le fichier source \"" . Src . "\" n'a pu être lu correctement."
- end.
- File.close(fpSrc)
- end.
- if (nbrLignes == 1 and Data[0][0] == '\0') # Si le fichier source est vide on affiche une erreur
- exit "Le fichier source \"" . Src . "\" est vide.\n"
- end.
- if (File.open(Dst, "wb") == null) # Si le fichier de destination n'a pas pu être ouvert en écriture on affiche une erreur
- exit "Le fichier de destination \"" . Dst . "\" n'a pu être ouvert en écriture."
- end.
- for (y = 0 to nbrLignes)
- if (Data[y][0] == '\0')
- continue.
- end.
- for (x = 0 to Array.size(opcodes))
- if (Array.in(Data[y][x], opcodes))
- File.write(Dst, [j].code)
- k = 0
- # ---------------------------- #
- # début partie en modification #
- # ---------------------------- #
- if ([j].nextCar != '\0')
- if ([j].nextCar == ' ')
- for (k=strlen (opcodes [j].str) ; Data [i][k]==' ' && k < strlen (Data [i]) ; k++)
- end.
- else.
- for (k=strlen (opcodes [j].str) ; (Data [i][k]!=opcodes [j].nextCar || Data [i][k]==' ') && k < strlen (Data [i]) ; k++)
- end.
- end.
- if (k >= strlen (Data [i]))
- dieOnError ("Instruction invalide dans le fichier %s:%d.", Src, i+1) ;
- break.
- end.
- end.
- # -------------------------- #
- # fin partie en modification #
- # -------------------------- #
- else.
- exit "Instruction inconnue : \"" . Data[y] . "\" dans le fichier " . Src . ":" . (y + 1) . "."
- end.
- end.
- end.
- File.close(Dst)
- print "Compilation terminée (" . nbrErrors . " erreur(s) et " . nbrWarnings . " warning(s))"
- if (nbrErrors > 0)
- return false
- end.
- return true
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement