Du code pascal d'exemple est dans le dossier PascalTestCode
Les fonctions ajoutés par moi même se trouve au ligne 544-784
Les autres parties du code modifiés ou ajoutés par moi même sont entre des commentaires //CODE AJOUTE------------
// ForStatement := "For" ID ":=" Expression ("TO"|"DOWNTO") Expression "DO" Statement
Une boucle for avec un STEP fonctionnel
Exemple: for_loop_to_step.p for_loop_downto_step.p for_loop.p
//CaseListELement := [Constant ":" Statement]
//CaseStatement := "CASE" ID "OF" CaseListElement "END"
Le SwitchCase à été optimisé pour les valeurs entière avec peut d'écart, il utilise une jump table de la même manière que certain compilateur C/C++
Si l'écart est trop grand, le case est simplement une suite de cmp/je
L'écart max d'utilisation de la jump table est défini par la constante MAX_CASE_GAP_JMPT
Exemple: case_big_gap_int.p case_tiny_gap_int.p case_char.p
A simple compiler. From : Pascal-like imperative LL(k) langage To : 64 bit 80x86 assembly langage (AT&T)
Download the repository :
git clone git@framagit.org:jourlin/cericompiler.git
Build the compiler and test it :
make test
Have a look at the output :
gedit test.s
Debug the executable :
ddd ./test
Commit the new version :
git commit -a -m "What's new..."
Send to your framagit :
git push -u origin master
Get from your framagit :
git pull -u origin master
This version Can handle :
// Program := [DeclarationPart] StatementPart
// DeclarationPart := "[" Identifier {"," Identifier} "]"
// StatementPart := Statement {";" Statement} "."
// Statement := AssignementStatement
// AssignementStatement := Identifier ":=" Expression
// Expression := SimpleExpression [RelationalOperator SimpleExpression]
// SimpleExpression := Term {AdditiveOperator Term}
// Term := Factor {MultiplicativeOperator Factor}
// Factor := Number | Letter | "(" Expression ")"| "!" Factor
// Number := Digit{Digit}
// Identifier := Letter {(Letter|Digit)}
// AdditiveOperator := "+" | "-" | "||"
// MultiplicativeOperator := "*" | "/" | "%" | "&&"
// RelationalOperator := "==" | "!=" | "<" | ">" | "<=" | ">="
// Digit := "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
// Letter := "a"|...|"z"