From 3fe11684d3f431b4344ab2d1631577eb639078f3 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 23 May 2020 11:22:23 +0200 Subject: [PATCH] Version finale --- .gitignore | 11 + Exemples/cat.c | 27 + Exemples/fact.c | 42 + Exemples/ordre | Bin 0 -> 9504 bytes Exemples/ordre.c | 13 + Exemples/sieve.c | 102 ++ Exemples/test.c | 7 + Exemples/unitest0.c | 1422 ++++++++++++++++ Makefile | 92 ++ README.md | 294 ++++ README.pdf | Bin 0 -> 216927 bytes clex.cmi | Bin 0 -> 2276 bytes clex.cmo | Bin 0 -> 113202 bytes clex.ml | 3859 +++++++++++++++++++++++++++++++++++++++++++ clex.mll | 297 ++++ compile.cmi | Bin 0 -> 425 bytes compile.cmo | Bin 0 -> 74951 bytes compile.ml | 399 +++++ compile.mli | 25 + cparse.cmi | Bin 0 -> 2562 bytes cparse.cmo | Bin 0 -> 27472 bytes cparse.ml | 271 +++ cparse.mli | 73 + cprint.cmi | Bin 0 -> 868 bytes cprint.cmo | Bin 0 -> 4911 bytes cprint.ml | 20 + cprint.mli | 5 + ctab.cmi | Bin 0 -> 2343 bytes ctab.cmo | Bin 0 -> 88277 bytes ctab.ml | 1570 ++++++++++++++++++ ctab.mli | 88 + ctab.mly | 464 ++++++ ctab.output | 3223 ++++++++++++++++++++++++++++++++++++ depend | 24 + error.cmi | Bin 0 -> 1871 bytes error.cmo | Bin 0 -> 10131 bytes error.ml | 95 ++ genlab.cmi | Bin 0 -> 405 bytes genlab.cmo | Bin 0 -> 1900 bytes genlab.ml | 31 + main.cmi | Bin 0 -> 954 bytes main.cmo | Bin 0 -> 7965 bytes main.ml | 82 + verbose.cmi | Bin 0 -> 277 bytes verbose.cmo | Bin 0 -> 329 bytes verbose.ml | 25 + 46 files changed, 12561 insertions(+) create mode 100644 .gitignore create mode 100644 Exemples/cat.c create mode 100644 Exemples/fact.c create mode 100755 Exemples/ordre create mode 100644 Exemples/ordre.c create mode 100644 Exemples/sieve.c create mode 100644 Exemples/test.c create mode 100644 Exemples/unitest0.c create mode 100644 Makefile create mode 100644 README.md create mode 100644 README.pdf create mode 100644 clex.cmi create mode 100644 clex.cmo create mode 100644 clex.ml create mode 100644 clex.mll create mode 100644 compile.cmi create mode 100644 compile.cmo create mode 100644 compile.ml create mode 100644 compile.mli create mode 100644 cparse.cmi create mode 100644 cparse.cmo create mode 100644 cparse.ml create mode 100644 cparse.mli create mode 100644 cprint.cmi create mode 100644 cprint.cmo create mode 100644 cprint.ml create mode 100644 cprint.mli create mode 100644 ctab.cmi create mode 100644 ctab.cmo create mode 100644 ctab.ml create mode 100644 ctab.mli create mode 100644 ctab.mly create mode 100644 ctab.output create mode 100644 depend create mode 100644 error.cmi create mode 100644 error.cmo create mode 100644 error.ml create mode 100644 genlab.cmi create mode 100644 genlab.cmo create mode 100644 genlab.ml create mode 100644 main.cmi create mode 100644 main.cmo create mode 100644 main.ml create mode 100644 verbose.cmi create mode 100644 verbose.cmo create mode 100644 verbose.ml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6476f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.gz +*.o +*.s + +mcc +Exemples/cat +Exemples/fact +Exemples/order +Exemples/sieve +Exemples/test +Exemples/unitest0 diff --git a/Exemples/cat.c b/Exemples/cat.c new file mode 100644 index 0000000..fe08454 --- /dev/null +++ b/Exemples/cat.c @@ -0,0 +1,27 @@ +#ifdef MCC +#define FILE char +// pipeau: un FILE est quelque chose de plus complique, normalement... +#define EOF (-1) +// ca, par contre, c'est la vraie valeur de EOF. + +#else +#include +#include +#endif + +int main (int argc, char **argv) +{ + int i, c; + + for (i=1; i +#include +#endif + +int fact (int n) +{ + int res; + + res = 1; + while (n!=0) + { + res = res * n; + n--; + } + return res; +} + +int main (int argc, char **argv) +{ + if (argc!=2) + { + fprintf (stderr, "Usage: ./fact \ncalcule et affiche la factorielle de .\n"); + fflush (stderr); + exit (10); /* non mais! */ + } + { + int n, res; + + n = atoi (argv[1]); /* conversion chaine -> entier. */ + if (n<0) + { + fprintf (stderr, "Ah non, quand meme, un nombre positif ou nul, s'il-vous-plait...\n"); + fflush (stderr); + exit (10); + } + res = fact (n); + printf ("La factorielle de %d vaut %d (en tout cas, modulo 2^32...).\n", + n, res); + } + return 0; +} diff --git a/Exemples/ordre b/Exemples/ordre new file mode 100755 index 0000000000000000000000000000000000000000..6dc9d621ca71b0216e1b43837d1f74d565c4b480 GIT binary patch literal 9504 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 literal 0 HcmV?d00001 diff --git a/Exemples/ordre.c b/Exemples/ordre.c new file mode 100644 index 0000000..80d8e39 --- /dev/null +++ b/Exemples/ordre.c @@ -0,0 +1,13 @@ +#ifndef MCC +#include +#endif + +int main (int argc, char **argv) +{ + int i, j; + + j = (i=3) + (i=4); + printf ("Valeur de j=%d (normalement 7), valeur de i=%d.\n", j, i); + fflush (stdout); + return 0; +} diff --git a/Exemples/sieve.c b/Exemples/sieve.c new file mode 100644 index 0000000..0f7d8dd --- /dev/null +++ b/Exemples/sieve.c @@ -0,0 +1,102 @@ +#ifdef MCC +#define NULL 0 +#else +#include +#include +#endif + +int main (int argc, char **argv) +{ + if (argc!=2) + { + fprintf (stderr, "Usage: ./sieve \ncalcule et affiche les nombres premiers inferieurs a .\n"); + fflush (stderr); + exit (10); /* non mais! */ + } + { + int n; + int *bits; + + n = atoi (argv[1]); // conversion chaine -> entier. + if (n<2) + { + fprintf (stderr, "Ah non, quand meme, un nombre >=2, s'il-vous-plait...\n"); + fflush (stderr); + exit (10); + } + bits = malloc (8*n); // allouer de la place pour n entiers (booleens). + // Ca prend 32 fois trop de place. Mais C-- n'a pas les operations &, |, + // qui nous permettraient de manipuler des bits individuellement... + if (bits==NULL) + { + fprintf (stderr, "%d est trop gros, je n'ai pas assez de place memoire...\n"); + fflush (stderr); + exit (10); + } + zero_sieve (bits, n); + bits[0] = bits[1] = 1; + fill_sieve (bits, n); + print_sieve (bits, n); + free (bits); // et on libere la place memoire allouee pour bits[]. + } + return 0; +} + +int zero_sieve (int *bits, int n) +{ + int i; + + for (i=0; i=4) + { + printf ("\n"); // retour à la ligne. + k = 0; + delim = " "; + } + else + printf (" "); // espace. + } + } + fflush (stdout); // on vide le tampon de stdout, utilise par printf(). + return 0; +} diff --git a/Exemples/test.c b/Exemples/test.c new file mode 100644 index 0000000..3a9f9c1 --- /dev/null +++ b/Exemples/test.c @@ -0,0 +1,7 @@ +int global1; + +int main() { + global1 = 42; + printf("%d\n", global1); + return 0; +} diff --git a/Exemples/unitest0.c b/Exemples/unitest0.c new file mode 100644 index 0000000..740fb56 --- /dev/null +++ b/Exemples/unitest0.c @@ -0,0 +1,1422 @@ +// Some tests for C-- +// Written by Laurent Prosperi, ENS Cachan, in 2015. + +#ifndef MCC +#include +#include +#endif +#define NULL 0 + + +int global_3; +int global_4; +int* global_5; +int* global_6; + +int test_expr(){ + int i,j,k,l; + int e1,e2,e3,e4,e5,e6,e7,e8,e9; + int* tab; + int l1, l2; + int a, b; + + a=587; + b=-158; + + i=156; + j=129; + k=11; + l=-1; + e1=-(i*j+k-l+2+10/2); + e2=-5*(i+j+k-l)*(l*5+3)+(k/11); + e3=(e1*e2+l-k+8)*7-6; + e4 = e2-(e2++); + e5 = e3-(e3--); + e6 = (++i)-(--i); + e9 = (i++)-(i--); + e7 = ~k; + e8 = e1 % ( l+k ); + + tab = malloc( 8*8); + tab[0]=e1; + tab[1]=e2; + tab[4]= (tab[0]+e3-tab[1]*5) + tab[0] % 3; + tab[6]= 1; + tab[5]= ~(tab[4]*tab[6]); + tab[7]= (5*tab[0] + (tab[3] = e3)); + + l1 = ((0 == 0) < 56 ) <= e8; + l2 = 4 == (((e2 == e1) < e4 ) <= e8); + + j= ((a+b)<5) ? (l1+l2+e6+e7+e3+e2) : (l1*l2+(e6-1)*e7*e3-e2); ///e6-1 compence la différence entre gcc et mcc + k= ((a+b)<5) ? (l1+l2-e6*e7+e3+e2) : (l1*l2+(e6-1)*e7*e3-e2-9*e4+e5); + + + global_1 = j+k*2; + printf("global_1 = %d\n", global_1); + printf("e1 %s\n", (-20143==e1) ? "pass" : "failed"); + printf("e1 th=%d, value=%d\n", -20143, e1); + printf("----------------------\n"); + + printf("e2 %s\n", (2972==e2) ? "pass" : "failed"); + printf("e2 th=%d, value=%d\n", 2972, e2); + printf("----------------------\n"); + + printf("e3 %s\n", (-418914006==e3) ? "pass" : "failed"); + printf("e3 th=%d, value=%d\n", -418914006, e3); + printf("----------------------\n"); + + printf("e4 %s\n", (1==e4) ? "pass" : "failed"); + printf("e4 th=%d, value=%d\n", 1, e4); + printf("----------------------\n"); + + printf("e5 %s\n", (-1==e5) ? "pass" : "failed"); + printf("e5 th=%d, value=%d\n", -1, e5); + printf("----------------------\n"); + + printf("e6 %s\n", (1==e6) ? "pass" : "failed"); ///D'après gcc ça fait 0, sémantique c-- => 1 + printf("e6 th=%d, value=%d\n", 1, e6); + printf("----------------------\n"); + + printf("e7 %s\n", (-12==e7) ? "pass" : "failed"); + printf("e7 th=%d, value=%d\n", -12, e7); + printf("----------------------\n"); + + printf("e8 %s\n", (-3==e8) ? "pass" : "failed"); + printf("e8 th=%d, value=%d\n", -3, e8); + printf("----------------------\n"); + + printf("e9 %s\n", (-1==e9) ? "pass" : "failed"); + printf("e9 th=%d, value=%d\n", -1, e9); + printf("----------------------\n"); + + printf("tab[0] %s\n", (-20143==tab[0]) ? "pass" : "failed"); + printf("tab[0] th=%d, value=%d\n", -20143, tab[0]); + printf("----------------------\n"); + + printf("tab[1] %s\n", (2972==tab[1]) ? "pass" : "failed"); + printf("tab[1] th=%d, value=%d\n", 2972, tab[1]); + printf("----------------------\n"); + + printf("tab[2] %s\n", (0==tab[2]) ? "pass" : "failed"); + printf("tab[2] th=%d, value=%d\n", 0, tab[2]); + printf("----------------------\n"); + + printf("tab[3] %s\n", (-418914006==tab[3]) ? "pass" : "failed"); + printf("tab[3] th=%d, value=%d\n", -418914006, tab[3]); + printf("----------------------\n"); + + printf("tab[4] %s\n", (-418949010==tab[4]) ? "pass" : "failed"); + printf("tab[4] th=%d, value=%d\n", -418949010, tab[4]); + printf("----------------------\n"); + + printf("tab[5] %s\n", (418949009==tab[5]) ? "pass" : "failed"); + printf("tab[5] th=%d, value=%d\n", 418949009, tab[5]); + printf("----------------------\n"); + + printf("tab[7] %s\n", (-419014721==tab[7]) ? "pass" : "failed"); + printf("tab[7] th=%d, value=%d\n", -419014721, tab[7]); + printf("----------------------\n"); + + printf("l1 %s\n", (0==l1) ? "pass" : "failed"); + printf("l1 th=%d, value=%d\n", 0, l1); + printf("----------------------\n"); + + printf("l2 %s\n", (0==l2) ? "pass" : "failed"); + printf("l2 th=%d, value=%d\n", 0, l2); + printf("----------------------\n"); + + printf("j %s\n", (-2972==j) ? "pass" : "failed"); + printf("j th=%d, value=%d\n", -2972, j); + printf("----------------------\n"); + + printf("k %s\n", (-2982==k) ? "pass" : "failed"); + printf("k th=%d, value=%d\n", -2982, k); + printf("----------------------\n"); + + + free( tab ); + + return 56; +} + +int test_code(){ + int i,j,k,l; + int a,b,c,d; + int x,y,z; + + a=0; + b=0; + c=0; + d=0; + i=156; + j=129; + k=11; + l=-1; + + printf("global_1 = %d\n", global_1); + global_2 = i+k-1; + printf("global_1 = %d\n", global_1); + global_1--; + printf("global_1 = %d\n", global_1); + + if( (i+j-3)<10 ){ + x=50; + while(0 depend + +-include depend diff --git a/README.md b/README.md new file mode 100644 index 0000000..49adce9 --- /dev/null +++ b/README.md @@ -0,0 +1,294 @@ +--- +title: Compilateur de C-\- +author: Yohann D'ANELLO +geometry: +- top=0.5in +- bottom=0.5in +- left=1in +- right=1in +... + +\pagenumbering{gobble} + +`MCC` est un compilateur du langage `C--` codé en OCamL. Il prend en entrée un fichier source codé en `C--`, puis le traduit en code assembleur (Intel x86\_64), avant de l'assembler en exécutable machine. La sémantique de `C--` est disponible ici : [http://www.lsv.fr/~goubault/CoursProgrammation/prog1_sem1.pdf](http://www.lsv.fr/~goubault/CoursProgrammation/prog1_sem1.pdf) + +Un analyseur syntaxique commence par analyser le code, et le traduire en un *Abstract Syntax Tree* (AST, arbre de syntaxe abstrait). Le compilateur vient ensuite dérouler l'AST et produire le code assembleur nécessaire. + +La première chose effectuée par le compilateur est de récupérer la liste des fonctions déclarées par le code. Cela permet de savoir quelles sont les fonctions qui renvoient un entier codé sur 32 ou sur 64 bits, avec les fonctions système `malloc`, `calloc`, `realloc`, `fopen` et `exit`. Ensuite, le code est compilé. + +À la lecture du code, le compilateur dispose d'un environnement transmis et mis à jour à chaque appel de fonctions. Un environnement est modélisé par un 9-uplet contenant un compteur de nombre de labels déclarés, la liste des chaîne de caractères déjà rencontré ainsi que leur nombre, la liste des noms des variables globales, un booléen indiquant si le compilateur est actuellement en train de déclarer des paramètres d'une fonction ou non, un dictionnaire des variables locales indiquant à tout nom sa place sur la pile ainsi que la liste des fonctions disposant d'un retour sur 64 bits. + +# Déclaration d'une variable globale + +Les éléments les plus hauts dans l'AST sont les déclarations de variables globales et de fonctions. Pour déclarer une variable, le compilateur ajoute uniquement dans l'environnement le nom de la variable globale déclarée et ne produit aucun code assembleur. Il attendra d'avoir compilé tout le code avant de déclarer les variables globales dans la section `.data` via l'instruction `.comm , 8, 8`. + +# Déclaration d'une fonction + +Le compilateur commence par déclarer créer un label vers la fonction, via `:`{.asm}. Ensuite, la fonction va être parcourue une première fois afin d'estimer la place nécessaire à allouer sur la pile pour déclarer les variables. Pour cela, chaque paramètre et chaque variable déclarée (y compris dans les sous-blocs) compte pour 8 octets), afin de garantir d'avoir toujours de la place pour les besoins nécessaires. Ensuite, l'instruction `ENTERQ $N, 0`{.asm} est ajoutée, où `N` est le plus petit multiple de 16 supérieur ou égal à la place nécessaire pour la fonction. Ensuite, les paramètres sont déclarés, puis c'est au tour du code de la fonction. On convient que la valeur de retour de la fonction doit se trouver dans `%rax`{.asm}. Enfin, l'instruction `LEAVEQ`{.asm} permet d'effectuer l'instruction inverse de `ENTERQ`{.asm}, et donc de remettre `%rbp`{.asm} et `%rsp`{.asm} à leurs bonnes valeurs. L'instruction `RETQ`{.asm} suit ensuite, et va à l'instruction suivante. + +# Déclaration d'une variable locale, d'un paramètre + +Lors de la déclaration d'une variable locale, celle-ci est ajoutée à l'environnement. En mémoire est conservée la position de son adresse relativement à `%rsp`{.asm}, qui vaut alors la première place libre sur la pile. L'adresse de la `n`-ième variable locale est alors `-n(%rbp)`{.asm}. S'il s'agit d'un paramètre, alors cela implique que le paramètre est déjà initialisé, et donc on ajoute une instruction qui permet de récupérer la valeur du paramètre dans le bon registre, ou bien à la bonne position sur la pile s'il s'agit au moins du septième paramètre. + +# Évaluation d'un morceau de code + +Il existe 5 types de morceaux de code : les blocs, les expressions, les tests conditionnels `if`{.C}, les boucles `while`{.C} et les valeurs de retour `return`{.C}. + +## Les blocs de code + +Format : `CBLOCK(declaration list, code)` + +Un bloc de code commence par la déclaration des variables locales du bloc. Chaque variable est déclarée une à une, mettant à jour successivement l'environnement courant. Le code du bloc est ensuite exécuté. À la fin du bloc, les variables locales de l'environnement sont remplacées celles présentes avant l'entrée du code. Le reste est conservé. + +## Les expressions + +Format : `CEXPR(expression)` + +Un bloc d'expression évalue alors une expression. Une fois évaluée, la valeur de retour est toujours envoyée dans `%rax`{.asm}. Il existe 11 types d'expression : l'utilisation de variables, l'utilisation de constantes entières, l'utilisation de chaîne de caractères, l'affection dans une variable, l'affectation dans un tableau, l'appel d'une fonction, une opération unaire (opposé, négation binaire, {post,pré}-{in,dé}crémentation), une opération binaire (multiplication, division, modulo, addition, soustraction, accès à l'élément d'un tableau), la comparaison de deux éléments (infériorité stricte, infériorité large, égalité), les conditions ternaires et enfin les séquences d'expression. + +### Utilisation de variables + +Format : `VAR(name)` + +Une ligne d'assembleur est ajoutée, qui va alors chercher dans l'environnement la position sur la pile de la variable appelée si elle est locale, sinon donner son nom directement, pour placer le contenu dans `%rax`{.asm}. + +`MOVQ -24(%rbp), %rax`{.asm}\newline +`MOVQ stdout(%rip), %rax`{.asm} + +### Utilisation de constantes entières + +Format : `CST(value)` + +La constante indiquée est directement enregistrée dans `%rax`{.asm}. + +`MOVQ $42, %rax`{.asm} + +### Utilisation de chaînes de caractères + +Format : `STRING(string)` + +La chaîne correspondante est ajoutée à l'environnement. Une optimisation du compilateur permet de ne pas enregistrer des chaînes de caractères déjà existantes. Après avoir compilé le code, dans la section `.data`{.asm}, toutes les chaînes de caractères sont ajoutées au code assembleur, sous le label `.strN`{.asm} où `N`{.asm} est le numéro de la chaîne, par ordre d'apparition, via l'instruction : + +`.strN:`{.asm}\newline +` .string STR`{.asm}\newline +` .text`{.asm} + +Le label en question est alors affecté à `%rax`{.asm} : `MOVQ $.strN, %rax`{.asm} + +### Affection dans une variable + +Format : `SET_VAR(name, expression)` + +L'expression à affecter est évaluée, puis le résultat (dans `%rax`{.asm}) est affecté dans la variable. + +`MOVQ %rax, -24(%rbp)`{.asm} + +### Affectation dans un tableau + +Format : `SET_ARRAY(name, expression, expression)` + +La première expression est d'abord évaluée, puis mise sur la pile. La seconde expression est ensuite évaluée, et le résultat est alors dans `%rax`{.asm}. La valeur mise sur la pile est ensuite dépilée dans `%rbx`{.asm}. `%rbx`{.asm} contient alors l'indice du tableau et `%rax`{.asm} la valeur à affecter. On récupère ensuite l'adresse de la case désirée, via des additions, puis on place le contenu `%rax`{.asm} dans la bonne case mémoire. + +`MOVQ $1, %rax`{.asm}\newline +`PUSHQ %rax`{.asm}\newline +`MOVQ $4, %rax`{.asm}\newline +`POPQ %rbx`{.asm}\newline +`MOVQ -24(%rbp), %rdx`{.asm}\newline +`LEAQ 0(, %rbx, 8), %rbx`{.asm}\newline +`ADDQ %rbx, %rdx`{.asm}\newline +`MOVQ %rax, (%rdx)`{.asm} + +### Appel d'une fonction + +Format : `CALL(name, parameter list (expression list))` + +On commence par évaluer chacun des arguments, de droite à gauche, et les placer sur la pile un à un. Les (au plus) six premiers sont ensuite dépilés et mis dans l'ordre dans `%rdi`{.asm}, `%rsi`{.asm}, `%rdx`{.asm}, `%rcx`{.asm}, `%r8`{.asm}, `%r9`{.asm}. Par respect de la norme `C`, on fixe `%rax`{.asm} à `0`{.C}, puis on appelle la fonction. Une fois l'appel terminé, on dépile les arguments résiduels éventuels. Si jamais la fonction n'est pas dans la liste des fonctions ayant un retour sur 64 bits, on étend le signe de `%eax` dans `%rax`{.asm}, via l'instruction `CLTQ`{.asm}. + +`MOVQ $2, %rax`{.asm}\newline +`PUSHQ %rax`{.asm}\newline +`MOVQ $.str1, %rax`{.asm}\newline +`PUSHQ %rax`{.asm}\newline +`POPQ %rsi`{.asm}\newline +`POPQ %rdi`{.asm}\newline +`MOVQ $0, %rax`{.asm}\newline +`CALLQ printf`{.asm}\newline +`CLTQ`{.asm}\newline +`...`{.asm}\newline +`.str1:`{.asm}\newline +` .string "Valeur de deux = %d\n"`{.asm}\newline +` .text`{.asm} + + +Cette suite d'instruction assembleur modélise l'appel `printf("Valeur de deux = %d\n", 2);`{.C}. + +### Opérateur unaire + +Format : `OP1(optype, expression)` + +L'expression est évaluée (le résultat est alors dans `%rax`{.asm}), puis traitée. + +#### Opposé + +Une seule instruction suffit : `NEGQ %rax`{.asm} + +#### Négation logique + +De même, il suffit d'une instruction assembleur : `NOTQ %rax`{.asm} + +#### {Post,Pré}-{in,dé}crémentation + +Si on est en post-{in,dé}crémentation, on commence par empiler la valeur de `%rax`{.asm}, qu'on dépilera plus tard, afin de renvoyer la bonne valeur. Sinon, d'abord on {in,dé}crémente, puis on met dans `%rax`{.asm} la valeur souhaitée. + +Une telle opération est, selon la sémantique `C--`, soit de la forme `s++`{.C} où `s`{.C} est une variable, soit de la forme `t[e]++`{.C} où `e`{.C} est une expression et `t`{.C} une variable. Dans le premier cas, on se contente d'incrémenter ou de décrémenter la variable via `INCQ`{.asm} ou `DECQ`{.asm}. Dans le second cas, on procède de la même manière que l'affectation dans un tableau en récupérant la bonne adresse, puis on {in,dé}crémente la valeur associée. + +### Opérateur binaire + +Format : `OP2(optype, expression1, expression2)` + +La deuxième expression est d'abord évaluée (en accord avec la sémantique de `C--` qui suggère de toujours évaluer de droite à gauche), puis la valeur est placée sur la pile. La première expression est ensuite évaluée, dont le résultat est dans `%rax`{.asm}. On récupère ensuite l'évaluation de la seconde expression dans `%rbx`{.asm}. + +#### Multiplication, addition, soustraction + +L'instruction `IMUL %rbx, %rax`{.asm} permet directement de multiplier `%rbx`{.asm} par `%rax`{.asm} et de placer le résultat dans `%rax`{.asm}, ce qui est ce que nous voulions. Les instructions `ADDQ`{.asm} et `SUBQ`{.asm} permettent la même chose pour l'addition et la soustraction. + +#### Division, modulo + +On commence par étendre le signe de `%rax`{.asm} dans `%rdx`{.asm} via l'instruction `CQO`{.asm}. On ajoute ensuite l'expression `IDIVQ %rbx`{.asm}, qui effectue la division euclidienne de `%rdx:%rax`{.asm} (nombre vu comme la concaténation des deux registres sur 128 bits) par `%rbx`{.asm}, et stocke le quotient dans `%rax`{.asm} et le reste dans `%rdx`{.asm}, selon la sémantique de `C--`. Selon les cas, on met la bonne valeur dans `%rax`{.asm}, puis pour des raisons de sécurité on remet `%rdx`{.asm} à `0`{.C}. + +#### Accès dans un tableau + +Comme précédemment, on récupère l'adresse de la bonne case mémoire, puis on place le contenu dans `%rax`{.asm} : + +`LEAQ (0, %rbx, 8), %rbx`{.asm}\newline +ADDQ %rbx, %rax`{.asm}\newline +MOVQ (%rax), %rax`{.asm} + +### Comparaison + +Format : `CMP(cmptype, expression1, expression 2)` + +On évalue la première expression dans `%rbx`{.asm}, puis la seconde dans `%rax`{.asm}. On compare ensuite `%rax`{.asm} à `rbx`. Puis, selon les cas (`JL` si l'inégalité est stricte, `JLE` si l'inégalité est large, `JE` si on veut l'égalité), on fait un saut vers le prochain label disponible. On se débrouille ensuite pour mettre `1` dans `%rax`{.asm} si la comparaison est concluante, `0` sinon. + +`CMPQ %rax, %rbx`{.asm}\newline +`JE .destjump1`{.asm}\newline +`MOVQ $0, %rax`{.asm}\newline +`JMP .destjump2`{.asm}\newline +`.destjump1:`{.asm}\newline +`MOVQ $1, %rax`{.asm}\newline +`.destjump2:`{.asm} + +### Condition ternaire + +Format : `EIF(expression1, expression2, expression3)` + +On évalue d'abord la première expression, qu'on compare à 0. S'il y a égalité, alors on saute vers un futur label où on évaluera la troisième expression (la partie `else`). Sinon, alors on évalue la deuxième expression, où on ajoute un saut vers la fin de la condition. + +Cette suite d'instruction simule `1 ? 5 : 7` : + +`MOVQ $1, %rax`{.asm}\newline +`CMPQ $0, %rax`{.asm}\newline +`JE .destjump1`{.asm}\newline +`MOVQ $7, %rax`{.asm}\newline +`JMP .destjump2`{.asm}\newline +`.destjump1:`{.asm}\newline +`MOVQ $5, %rax`{.asm}\newline +`.destjump2:`{.asm} + +### Séquence d'expression + +Format : `ESEQ(expression list)` + +Cette expression se contente d'évaluer les sous-expressions et de mettre à jour l'environnement au besoin. + +## Instruction conditionnelle + +Format : `CIF(expression, code1, code2)` + +On procède de la même manière que pour les expressions ternaires, à la différence près qu'on compile des blocs de code au lieu d'évaluer des expressions. + +## Boucles + +Format : `CWHILE(expression, code)` + +On commence par créer un label en haut de la boucle. On en rajoutera un aussi en fin de boucle. On évalue ensuite l'expression, qu'on compare ensuite à `0`. Si la comparaison est concluante, alors on saute directement à la fin de la boucle. Juste avant la fin de boucle, on saute immédiatement en haut de la boucle. + +`.whileloop1:`{.asm}\newline +` MOVQ -8(%rbp), %rax`{.asm}\newline +` CMPQ $0, %rax`{.asm}\newline +` JE .endloop1`{.asm}\newline +` # code`{.asm}\newline +` JMP .whileloop1`{.asm}\newline +`endloop1:`{.asm} + +## Valeurs de retour + +S'il n'y a pas de valeur de retour, alors on ne fait rien. La précédente valeur de `%rax`{.asm} servira de valeur de retour, en accord avec la sémantique qui autorise n'importe quelle valeur de retour si non précisée. Si non, alors on évalue la valeur de retour, qui sera directement dans `%rax`{.asm}. On ajoute ensuite les instructions `LEAVEQ`{.asm} et `RETQ{.asm}`, qui permettent de rétablir les précédentes valeurs de `%rsp`{.asm} et de `%rbp`{.asm} et de sauter à la nouvelle instruction. Il se peut qu'il y ait redondance avec les instructions ajoutées par la déclaration de la fonction, mais cela n'est pas un problème car ces instructions ne seront tout simplement jamais exécutées. Cela évite le problème d'absence d'instruction `return`{.C} dans le code `C`. + +# Optimisations possibles + +Certaines optimisations pourraient être réalisables, notamment celles qu'effectue `GCC` : on pourrait par exemple ne pas avoir à systématiquement affecter le contenu d'une variable dans `%rax`{.asm}, et utiliser directement l'adresse de la variable. Ce type d'optimisation nécessiterait néanmoins une meilleure maitrise de l'AST, quitte à le parcourir plusieurs fois, pour vérifier si certaines précautions sont nécessaires ou non. + +En espérant que ce compilateur vous sera d'une grande aide :) + +\newpage + +# Exemple de compilation + +## Code simple : + +`int main(int argc, char** argv) {`{.C}\newline +`int i;`{.C}\newline +`i = 0;`{.C}\newline +`i = (i++ - --i) + 1 + i;`{.C}\newline +`printf("Valeur de i = %d\n", i);`{.C}\newline +`return i;`{.C}\newline +`}`{.C} + +## Code assembleur généré : + +`.section .text`{.asm}\newline +` .global main`{.asm}\newline +`main:`{.asm}\newline +` ENTERQ $32, $0`{.asm}\newline +` MOVQ %rdi, -8(%rbp) # argc`{.asm}\newline +` MOVQ %rsi, -16(%rbp) # argv`{.asm}\newline +` MOVQ $0, %rax`{.asm}\newline +` MOVQ %rax, -24(%rbp)`{.asm}\newline +` MOVQ -24(%rbp), %rax # i`{.asm}\newline +` PUSHQ %rax`{.asm}\newline +` MOVQ $1, %rax`{.asm}\newline +` PUSHQ %rax`{.asm}\newline +` DECQ -24(%rbp)`{.asm}\newline +` MOVQ -24(%rbp), %rax # i`{.asm}\newline +` PUSHQ %rax`{.asm}\newline +` MOVQ -24(%rbp), %rax # i`{.asm}\newline +` INCQ -24(%rbp)`{.asm}\newline +` POPQ %rbx`{.asm}\newline +` SUBQ %rbx, %rax`{.asm}\newline +` POPQ %rbx`{.asm}\newline +` ADDQ %rbx, %rax`{.asm}\newline +` POPQ %rbx`{.asm}\newline +` ADDQ %rbx, %rax`{.asm}\newline +` MOVQ %rax, -24(%rbp)`{.asm}\newline +` MOVQ -24(%rbp), %rax # i`{.asm}\newline +` PUSHQ %rax`{.asm}\newline +` MOVQ $.str0, %rax`{.asm}\newline +` PUSHQ %rax`{.asm}\newline +` POPQ %rdi`{.asm}\newline +` POPQ %rsi`{.asm}\newline +` MOVQ $0, %rax`{.asm}\newline +` CALLQ printf`{.asm}\newline +` CLTQ`{.asm}\newline +` MOVQ -24(%rbp), %rax # i`{.asm}\newline +` LEAVEQ`{.asm}\newline +` RETQ`{.asm}\newline +`.section .data`{.asm}\newline +`.str0:`{.asm}\newline +` .string "Valeur de i = %d\n"`{.asm}\newline +` .text`{.asm}\newline + +### Sortie standard : + +`Valeur de i = 1\n`{.C}, code de sortie : `1`{.C} + +On peut bien sûr compiler des codes plus longs, mais l'assembleur généré ne tiendrait pas dans une page :) diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c7f84ef34ae22e1a2d5b1cf547dc9130f817836c GIT binary patch literal 216927 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%0D+ph6^& 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 RBSSMIBNHxFRabvEE&%4J@zVeR literal 0 HcmV?d00001 diff --git a/clex.cmi b/clex.cmi new file mode 100644 index 0000000000000000000000000000000000000000..2510be1ad9cd160e63568941037bd6a7e85c3fd1 GIT binary patch literal 2276 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

q;_}6e@dySI3e_q`j7sJL1Fc*! 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 X;AiLm>@Ou16&2o?nVp1qrq}-f@hsBo literal 0 HcmV?d00001 diff --git a/clex.ml b/clex.ml new file mode 100644 index 0000000..9935906 --- /dev/null +++ b/clex.ml @@ -0,0 +1,3859 @@ +# 1 "clex.mll" + + +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification (LSV), + * UMR 8643 CNRS & ENS Cachan. + * Written by Jean Goubault-Larrecq. Derived from the csur project. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + * +*) + +(* Analyse lexicale d'un sous-ensemble (tres) reduit de C. + *) + +open Cparse +open Error +open Ctab + +let string_buf = Buffer.create 256 + +let string_iter f s = (* = String.iter; pas present en OCaml 2.04. *) + let n = String.length s + in for i=0 to n-1 do f (s.[i]) done + +let count yytext = + (oldcline := !cline; oldccol := !ccol; + string_iter (fun c -> match c with + '\n' -> (cline := !cline+1; ccol := 0) + (* | '\t' -> (ccol := !ccol + 8 - (!ccol mod 8)) *) + | _ -> ccol := !ccol+1) yytext) + +let parse_hex yytext tend = + let n = ref 0 + in let len = String.length yytext-tend + in ((for i=2 to len-1 do + let c = yytext.[i] in + match c with + '0'..'9' -> n := 16 * !n + (int_of_char c - int_of_char '0') + | 'a'..'f' -> n := 16 * !n + (int_of_char c + 10 - int_of_char 'a') + | 'A'..'F' -> n := 16 * !n + (int_of_char c + 10 - int_of_char 'A') + | _ -> fatal (Some (!cfile, !cline, !ccol-len, !cline, !ccol)) + ("invalid hexadecimal number " ^ yytext) + done); + !n) + +let parse_oct yytext start tend = + let n = ref 0 + in let len = String.length yytext-tend + in ((for i=start to len-1 do + let c = yytext.[i] in + match c with + '0'..'7' -> n := 8 * !n + (int_of_char c - int_of_char '0') + | _ -> fatal (Some (!cfile, !cline, !ccol-len, !cline, !ccol)) + ("invalid octal number " ^ yytext) + done); + !n) + +let parse_dec yytext tend = + let n = ref 0 + in let len = String.length yytext-tend + in ((for i=0 to len-1 do + let c = yytext.[i] in + match c with + '0'..'9' -> n := 10 * !n + (int_of_char c - int_of_char '0') + | _ -> fatal (Some (!cfile, !cline, !ccol-len, !cline, !ccol)) + ("invalid number " ^ yytext) + done); + !n) + + +# 88 "clex.ml" +let __ocaml_lex_tables = { + Lexing.lex_base = + "\000\000\144\255\145\255\118\000\147\255\148\255\156\255\162\255\ + \163\255\164\255\165\255\002\000\168\255\169\255\170\255\171\255\ + \031\000\035\000\068\000\072\000\096\000\074\000\076\000\093\000\ + \097\000\102\000\080\000\097\000\194\255\105\000\117\000\127\000\ + \209\000\041\001\116\001\191\001\010\002\085\002\160\002\235\002\ + \054\003\129\003\204\003\023\004\098\004\173\004\248\004\067\005\ + \143\000\187\255\254\255\255\255\142\005\217\005\036\006\111\006\ + \186\006\005\007\080\007\155\007\230\007\049\008\124\008\199\008\ + \018\009\093\009\168\009\243\009\062\010\137\010\212\010\031\011\ + \106\011\181\011\000\012\075\012\150\012\225\012\044\013\119\013\ + \194\013\013\014\088\014\163\014\238\014\057\015\132\015\207\015\ + \026\016\101\016\176\016\251\016\070\017\145\017\220\017\039\018\ + \114\018\189\018\008\019\083\019\158\019\233\019\052\020\127\020\ + \202\020\021\021\096\021\171\021\246\021\065\022\140\022\215\022\ + \034\023\109\023\184\023\003\024\078\024\153\024\228\024\047\025\ + \122\025\197\025\016\026\091\026\166\026\241\026\060\027\135\027\ + \210\027\029\028\104\028\179\028\254\028\073\029\148\029\223\029\ + \042\030\117\030\192\030\011\031\086\031\161\031\236\031\055\032\ + \130\032\205\032\024\033\099\033\174\033\249\033\068\034\143\034\ + \218\034\037\035\112\035\187\035\006\036\081\036\156\036\231\036\ + \050\037\125\037\200\037\019\038\094\038\169\038\244\038\063\039\ + \138\039\213\039\032\040\107\040\182\040\001\041\076\041\151\041\ + \226\041\045\042\080\000\083\000\120\042\132\042\190\042\218\255\ + \088\000\110\000\216\255\111\000\113\000\118\000\211\255\207\255\ + \119\000\205\255\166\042\106\000\204\255\107\000\108\000\109\000\ + \110\000\112\000\113\000\114\000\122\000\200\000\203\255\004\043\ + \159\000\202\255\201\255\200\255\199\255\198\255\197\255\196\255\ + \195\255\153\000\193\255\174\255\139\000\192\255\175\255\140\000\ + \191\255\180\255\190\255\178\255\179\255\189\255\188\255\186\255\ + \177\255\185\255\184\255\176\255\183\255\173\255\172\255\174\000\ + \253\255\175\000\158\000\255\255\011\000\012\000\255\255\169\042\ + \242\255\201\042\012\043\001\000\255\255\245\255\246\255\247\255\ + \248\255\249\255\250\255\251\255\252\255\028\001\020\043\253\255\ + \083\043\251\255\252\255\253\255\197\000\028\043\216\042\252\255\ + \253\255\254\255\198\000\013\000\253\255\254\255\255\255"; + Lexing.lex_backtrk = + "\255\255\255\255\255\255\109\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\088\000\255\255\255\255\255\255\255\255\ + \098\000\089\000\096\000\097\000\095\000\104\000\102\000\101\000\ + \100\000\105\000\106\000\094\000\255\255\110\000\045\000\045\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \103\000\255\255\255\255\255\255\034\000\034\000\002\000\034\000\ + \034\000\034\000\003\000\034\000\034\000\034\000\034\000\004\000\ + \034\000\005\000\034\000\034\000\034\000\006\000\034\000\034\000\ + \034\000\007\000\009\000\034\000\034\000\034\000\034\000\034\000\ + \008\000\034\000\034\000\034\000\010\000\034\000\034\000\034\000\ + \034\000\011\000\034\000\012\000\034\000\034\000\034\000\013\000\ + \034\000\034\000\034\000\034\000\014\000\015\000\034\000\034\000\ + \016\000\034\000\017\000\018\000\034\000\034\000\019\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\020\000\034\000\ + \034\000\021\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \022\000\034\000\034\000\034\000\034\000\023\000\034\000\034\000\ + \024\000\034\000\034\000\034\000\034\000\025\000\034\000\034\000\ + \026\000\034\000\034\000\034\000\027\000\034\000\034\000\034\000\ + \034\000\034\000\028\000\034\000\034\000\034\000\034\000\029\000\ + \034\000\034\000\034\000\034\000\030\000\034\000\034\000\034\000\ + \031\000\034\000\034\000\034\000\034\000\032\000\034\000\034\000\ + \034\000\033\000\047\000\046\000\040\000\255\255\035\000\255\255\ + \036\000\038\000\255\255\042\000\041\000\043\000\255\255\255\255\ + \049\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\073\000\255\255\255\255\074\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\001\000\ + \255\255\001\000\255\255\255\255\001\000\001\000\255\255\255\255\ + \255\255\011\000\012\000\001\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\002\000\002\000\255\255\ + \255\255\255\255\255\255\255\255\001\000\000\000\255\255\255\255\ + \255\255\255\255\000\000\255\255\255\255\255\255\255\255"; + Lexing.lex_default = + "\002\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\000\000\195\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\000\000\000\000\000\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\ + \255\255\255\255\000\000\255\255\255\255\255\255\000\000\000\000\ + \255\255\000\000\197\000\255\255\000\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\000\000\255\255\ + \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\255\255\000\000\000\000\255\255\000\000\000\000\255\255\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\ + \000\000\241\000\255\255\000\000\245\000\245\000\000\000\249\000\ + \000\000\249\000\253\000\255\255\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\255\255\255\255\000\000\ + \255\255\000\000\000\000\000\000\255\255\255\255\255\255\000\000\ + \000\000\000\000\255\255\021\001\000\000\000\000\000\000"; + Lexing.lex_trans = + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\251\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\246\000\255\255\022\001\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\016\000\028\000\004\000\000\000\021\000\020\000\029\000\ + \010\000\009\000\022\000\024\000\012\000\023\000\027\000\048\000\ + \031\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ + \030\000\030\000\011\000\015\000\025\000\017\000\026\000\005\000\ + \007\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\008\000\238\000\007\000\019\000\032\000\ + \237\000\047\000\046\000\045\000\044\000\043\000\042\000\041\000\ + \032\000\040\000\032\000\032\000\039\000\032\000\032\000\032\000\ + \032\000\032\000\038\000\037\000\036\000\035\000\034\000\033\000\ + \032\000\032\000\032\000\014\000\018\000\013\000\006\000\003\000\ + \003\000\236\000\003\000\003\000\003\000\234\000\232\000\231\000\ + \013\000\230\000\228\000\014\000\225\000\219\000\220\000\217\000\ + \255\255\196\000\216\000\215\000\214\000\213\000\003\000\212\000\ + \211\000\210\000\229\000\227\000\191\000\233\000\226\000\192\000\ + \008\000\209\000\223\000\222\000\185\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\030\000\180\000\ + \180\000\180\000\180\000\180\000\180\000\180\000\180\000\030\000\ + \030\000\051\000\186\000\191\000\191\000\189\000\050\000\192\000\ + \235\000\178\000\190\000\193\000\185\000\194\000\206\000\218\000\ + \221\000\224\000\179\000\178\000\049\000\243\000\012\001\018\001\ + \000\000\000\000\000\000\000\000\179\000\000\000\000\000\181\000\ + \242\000\255\255\186\000\191\000\000\000\189\000\000\000\000\000\ + \000\000\178\000\190\000\193\000\000\000\012\001\018\001\000\000\ + \000\000\000\000\179\000\178\000\000\000\000\000\000\000\206\000\ + \000\000\000\000\000\000\000\000\179\000\000\000\000\000\181\000\ + \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\ + \001\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\255\255\255\255\020\001\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\006\001\006\001\006\001\006\001\ + \006\001\006\001\006\001\006\001\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\174\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\240\000\255\255\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\165\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\155\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\149\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\125\000\124\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\123\000\032\000\032\000\122\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\111\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\108\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\106\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\105\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \102\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \097\000\032\000\032\000\096\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\087\000\032\000\086\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\085\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\075\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\074\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\061\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\060\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\059\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\055\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \052\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\053\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \054\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\056\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\057\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \058\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\066\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\064\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\062\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\063\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\065\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\068\000\067\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\070\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\069\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\071\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\072\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\073\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\081\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\076\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\077\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\078\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \079\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\080\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\082\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\083\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \084\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\092\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\090\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\088\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\089\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\091\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\093\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\094\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\095\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\101\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\098\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\099\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\100\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \103\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\104\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\107\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\109\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \110\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\113\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\112\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\119\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\114\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\115\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\116\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\117\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\118\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\120\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \121\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\145\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\138\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\137\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\130\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \129\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \126\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\127\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\128\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\134\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\131\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \132\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\133\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\135\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\136\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\142\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\139\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\140\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\141\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\143\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\144\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\146\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\147\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\148\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\150\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\151\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\152\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\153\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\154\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\157\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\156\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\160\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \158\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\159\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\161\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\162\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\163\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\164\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\167\000\032\000\032\000\166\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\169\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\168\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\170\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\171\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\172\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\ + \032\000\032\000\032\000\173\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\175\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\176\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\ + \000\000\032\000\000\000\032\000\032\000\032\000\032\000\177\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\ + \030\000\030\000\000\000\251\000\182\000\182\000\182\000\182\000\ + \182\000\182\000\182\000\182\000\182\000\182\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\187\000\182\000\182\000\182\000\ + \182\000\182\000\182\000\252\000\000\000\188\000\000\000\000\000\ + \000\000\000\000\000\000\255\255\000\000\000\000\205\000\205\000\ + \205\000\205\000\205\000\205\000\205\000\205\000\000\000\000\000\ + \000\000\018\001\017\001\000\000\187\000\182\000\182\000\182\000\ + \182\000\182\000\182\000\255\255\000\000\188\000\182\000\182\000\ + \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\ + \018\001\000\000\016\001\000\000\000\000\000\000\000\000\182\000\ + \182\000\182\000\182\000\182\000\182\000\250\000\000\000\204\000\ + \203\000\000\000\183\000\000\000\202\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\184\000\201\000\000\000\000\000\000\000\ + \200\000\000\000\199\000\000\000\198\000\000\000\000\000\182\000\ + \182\000\182\000\182\000\182\000\182\000\255\255\000\000\000\000\ + \000\000\000\000\183\000\206\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\184\000\208\000\208\000\208\000\208\000\ + \208\000\208\000\208\000\208\000\005\001\005\001\005\001\005\001\ + \005\001\005\001\005\001\005\001\007\001\007\001\007\001\007\001\ + \007\001\007\001\007\001\007\001\013\001\013\001\013\001\013\001\ + \013\001\013\001\013\001\013\001\013\001\013\001\000\000\000\000\ + \000\000\000\000\000\000\000\000\012\001\011\001\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\004\001\003\001\000\000\ + \000\000\000\000\002\001\012\001\000\000\010\001\000\000\000\000\ + \000\000\000\000\001\001\000\000\000\000\000\000\000\001\000\000\ + \255\000\000\000\254\000\013\001\013\001\013\001\013\001\013\001\ + \013\001\013\001\013\001\013\001\013\001\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\ + \000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \015\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\009\001"; + Lexing.lex_check = + "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\000\000\000\000\251\000\000\000\000\000\000\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\244\000\245\000\019\001\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\ + \017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\018\000\003\000\003\000\003\000\019\000\020\000\021\000\ + \021\000\022\000\023\000\025\000\024\000\026\000\026\000\027\000\ + \029\000\195\000\197\000\198\000\199\000\200\000\003\000\201\000\ + \202\000\203\000\023\000\023\000\178\000\020\000\024\000\179\000\ + \025\000\204\000\025\000\025\000\184\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\030\000\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \031\000\048\000\185\000\187\000\178\000\188\000\048\000\179\000\ + \018\000\030\000\189\000\192\000\184\000\029\000\208\000\217\000\ + \220\000\223\000\030\000\031\000\048\000\242\000\012\001\018\001\ + \255\255\255\255\255\255\255\255\031\000\255\255\255\255\031\000\ + \239\000\241\000\185\000\187\000\255\255\188\000\255\255\255\255\ + \255\255\030\000\189\000\192\000\255\255\012\001\018\001\255\255\ + \255\255\255\255\030\000\031\000\255\255\255\255\255\255\205\000\ + \255\255\255\255\255\255\255\255\031\000\255\255\255\255\031\000\ + \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ + \000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\244\000\245\000\019\001\255\255\255\255\ + \255\255\255\255\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\255\255\255\255\255\255\255\255\ + \032\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\005\001\005\001\005\001\005\001\ + \005\001\005\001\005\001\005\001\255\255\255\255\255\255\255\255\ + \255\255\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\029\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\255\255\255\255\255\255\255\255\ + \033\000\255\255\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\239\000\241\000\ + \255\255\255\255\255\255\255\255\255\255\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\255\255\ + \255\255\255\255\255\255\034\000\255\255\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\255\255\255\255\255\255\255\255\035\000\255\255\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\255\255\255\255\255\255\ + \255\255\036\000\255\255\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \255\255\255\255\255\255\255\255\037\000\255\255\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\255\255\255\255\255\255\255\255\038\000\ + \255\255\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\255\255\255\255\ + \255\255\255\255\039\000\255\255\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\255\255\255\255\255\255\255\255\040\000\255\255\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\255\255\255\255\255\255\255\255\ + \041\000\255\255\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\255\255\ + \255\255\255\255\255\255\042\000\255\255\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\255\255\255\255\255\255\255\255\043\000\255\255\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\255\255\255\255\255\255\ + \255\255\044\000\255\255\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \255\255\255\255\255\255\255\255\045\000\255\255\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\255\255\255\255\255\255\255\255\046\000\ + \255\255\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\255\255\255\255\ + \255\255\255\255\047\000\255\255\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\255\255\255\255\255\255\255\255\052\000\255\255\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\255\255\255\255\255\255\255\255\ + \053\000\255\255\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\255\255\ + \255\255\255\255\255\255\054\000\255\255\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\255\255\255\255\255\255\255\255\055\000\255\255\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\255\255\255\255\255\255\ + \255\255\056\000\255\255\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \255\255\255\255\255\255\255\255\057\000\255\255\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\255\255\255\255\255\255\255\255\058\000\ + \255\255\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\255\255\255\255\ + \255\255\255\255\059\000\255\255\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\255\255\255\255\255\255\255\255\060\000\255\255\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\255\255\255\255\255\255\255\255\ + \061\000\255\255\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\255\255\ + \255\255\255\255\255\255\062\000\255\255\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\255\255\255\255\255\255\255\255\063\000\255\255\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\255\255\255\255\255\255\ + \255\255\064\000\255\255\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \255\255\255\255\255\255\255\255\065\000\255\255\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\255\255\255\255\255\255\255\255\066\000\ + \255\255\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\255\255\255\255\ + \255\255\255\255\067\000\255\255\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\255\255\255\255\255\255\255\255\068\000\255\255\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\255\255\255\255\255\255\255\255\ + \069\000\255\255\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\255\255\ + \255\255\255\255\255\255\070\000\255\255\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\255\255\255\255\255\255\255\255\071\000\255\255\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\255\255\255\255\255\255\ + \255\255\072\000\255\255\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\073\000\073\000\073\000\ + \073\000\073\000\073\000\073\000\073\000\073\000\073\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\073\000\073\000\ + \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ + \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ + \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ + \255\255\255\255\255\255\255\255\073\000\255\255\073\000\073\000\ + \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ + \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ + \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ + \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ + \074\000\074\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ + \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ + \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ + \074\000\074\000\074\000\255\255\255\255\255\255\255\255\074\000\ + \255\255\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ + \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ + \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ + \074\000\074\000\074\000\075\000\075\000\075\000\075\000\075\000\ + \075\000\075\000\075\000\075\000\075\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\075\000\075\000\075\000\075\000\ + \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ + \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ + \075\000\075\000\075\000\075\000\075\000\075\000\255\255\255\255\ + \255\255\255\255\075\000\255\255\075\000\075\000\075\000\075\000\ + \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ + \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ + \075\000\075\000\075\000\075\000\075\000\075\000\076\000\076\000\ + \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\076\000\ + \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ + \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ + \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ + \076\000\255\255\255\255\255\255\255\255\076\000\255\255\076\000\ + \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ + \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ + \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ + \076\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ + \077\000\077\000\077\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\077\000\077\000\077\000\077\000\077\000\077\000\ + \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ + \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ + \077\000\077\000\077\000\077\000\255\255\255\255\255\255\255\255\ + \077\000\255\255\077\000\077\000\077\000\077\000\077\000\077\000\ + \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ + \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ + \077\000\077\000\077\000\077\000\078\000\078\000\078\000\078\000\ + \078\000\078\000\078\000\078\000\078\000\078\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\078\000\078\000\078\000\ + \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ + \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ + \078\000\078\000\078\000\078\000\078\000\078\000\078\000\255\255\ + \255\255\255\255\255\255\078\000\255\255\078\000\078\000\078\000\ + \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ + \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ + \078\000\078\000\078\000\078\000\078\000\078\000\078\000\079\000\ + \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ + \079\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ + \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ + \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ + \079\000\079\000\255\255\255\255\255\255\255\255\079\000\255\255\ + \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ + \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ + \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ + \079\000\079\000\080\000\080\000\080\000\080\000\080\000\080\000\ + \080\000\080\000\080\000\080\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\080\000\080\000\080\000\080\000\080\000\ + \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ + \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ + \080\000\080\000\080\000\080\000\080\000\255\255\255\255\255\255\ + \255\255\080\000\255\255\080\000\080\000\080\000\080\000\080\000\ + \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ + \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ + \080\000\080\000\080\000\080\000\080\000\081\000\081\000\081\000\ + \081\000\081\000\081\000\081\000\081\000\081\000\081\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\081\000\081\000\ + \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ + \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ + \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ + \255\255\255\255\255\255\255\255\081\000\255\255\081\000\081\000\ + \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ + \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ + \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ + \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ + \082\000\082\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ + \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ + \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ + \082\000\082\000\082\000\255\255\255\255\255\255\255\255\082\000\ + \255\255\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ + \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ + \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ + \082\000\082\000\082\000\083\000\083\000\083\000\083\000\083\000\ + \083\000\083\000\083\000\083\000\083\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\083\000\083\000\083\000\083\000\ + \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ + \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ + \083\000\083\000\083\000\083\000\083\000\083\000\255\255\255\255\ + \255\255\255\255\083\000\255\255\083\000\083\000\083\000\083\000\ + \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ + \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ + \083\000\083\000\083\000\083\000\083\000\083\000\084\000\084\000\ + \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\084\000\ + \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ + \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ + \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ + \084\000\255\255\255\255\255\255\255\255\084\000\255\255\084\000\ + \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ + \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ + \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ + \084\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ + \085\000\085\000\085\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\085\000\085\000\085\000\085\000\085\000\085\000\ + \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ + \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ + \085\000\085\000\085\000\085\000\255\255\255\255\255\255\255\255\ + \085\000\255\255\085\000\085\000\085\000\085\000\085\000\085\000\ + \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ + \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ + \085\000\085\000\085\000\085\000\086\000\086\000\086\000\086\000\ + \086\000\086\000\086\000\086\000\086\000\086\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\086\000\086\000\086\000\ + \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ + \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ + \086\000\086\000\086\000\086\000\086\000\086\000\086\000\255\255\ + \255\255\255\255\255\255\086\000\255\255\086\000\086\000\086\000\ + \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ + \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ + \086\000\086\000\086\000\086\000\086\000\086\000\086\000\087\000\ + \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ + \087\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ + \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ + \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ + \087\000\087\000\255\255\255\255\255\255\255\255\087\000\255\255\ + \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ + \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ + \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ + \087\000\087\000\088\000\088\000\088\000\088\000\088\000\088\000\ + \088\000\088\000\088\000\088\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\088\000\088\000\088\000\088\000\088\000\ + \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ + \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ + \088\000\088\000\088\000\088\000\088\000\255\255\255\255\255\255\ + \255\255\088\000\255\255\088\000\088\000\088\000\088\000\088\000\ + \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ + \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ + \088\000\088\000\088\000\088\000\088\000\089\000\089\000\089\000\ + \089\000\089\000\089\000\089\000\089\000\089\000\089\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\089\000\089\000\ + \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ + \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ + \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ + \255\255\255\255\255\255\255\255\089\000\255\255\089\000\089\000\ + \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ + \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ + \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ + \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ + \090\000\090\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ + \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ + \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ + \090\000\090\000\090\000\255\255\255\255\255\255\255\255\090\000\ + \255\255\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ + \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ + \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ + \090\000\090\000\090\000\091\000\091\000\091\000\091\000\091\000\ + \091\000\091\000\091\000\091\000\091\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\091\000\091\000\091\000\091\000\ + \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\ + \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\ + \091\000\091\000\091\000\091\000\091\000\091\000\255\255\255\255\ + \255\255\255\255\091\000\255\255\091\000\091\000\091\000\091\000\ + \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\ + \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\ + \091\000\091\000\091\000\091\000\091\000\091\000\092\000\092\000\ + \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\092\000\ + \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\ + \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\ + \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\ + \092\000\255\255\255\255\255\255\255\255\092\000\255\255\092\000\ + \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\ + \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\ + \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\ + \092\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\ + \093\000\093\000\093\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\093\000\093\000\093\000\093\000\093\000\093\000\ + \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\ + \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\ + \093\000\093\000\093\000\093\000\255\255\255\255\255\255\255\255\ + \093\000\255\255\093\000\093\000\093\000\093\000\093\000\093\000\ + \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\ + \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\ + \093\000\093\000\093\000\093\000\094\000\094\000\094\000\094\000\ + \094\000\094\000\094\000\094\000\094\000\094\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\094\000\094\000\094\000\ + \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\ + \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\ + \094\000\094\000\094\000\094\000\094\000\094\000\094\000\255\255\ + \255\255\255\255\255\255\094\000\255\255\094\000\094\000\094\000\ + \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\ + \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\ + \094\000\094\000\094\000\094\000\094\000\094\000\094\000\095\000\ + \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\ + \095\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\ + \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\ + \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\ + \095\000\095\000\255\255\255\255\255\255\255\255\095\000\255\255\ + \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\ + \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\ + \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\ + \095\000\095\000\096\000\096\000\096\000\096\000\096\000\096\000\ + \096\000\096\000\096\000\096\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\096\000\096\000\096\000\096\000\096\000\ + \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\ + \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\ + \096\000\096\000\096\000\096\000\096\000\255\255\255\255\255\255\ + \255\255\096\000\255\255\096\000\096\000\096\000\096\000\096\000\ + \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\ + \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\ + \096\000\096\000\096\000\096\000\096\000\097\000\097\000\097\000\ + \097\000\097\000\097\000\097\000\097\000\097\000\097\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\097\000\097\000\ + \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\ + \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\ + \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\ + \255\255\255\255\255\255\255\255\097\000\255\255\097\000\097\000\ + \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\ + \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\ + \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\ + \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\ + \098\000\098\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\098\000\098\000\098\000\098\000\098\000\098\000\098\000\ + \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\ + \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\ + \098\000\098\000\098\000\255\255\255\255\255\255\255\255\098\000\ + \255\255\098\000\098\000\098\000\098\000\098\000\098\000\098\000\ + \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\ + \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\ + \098\000\098\000\098\000\099\000\099\000\099\000\099\000\099\000\ + \099\000\099\000\099\000\099\000\099\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\099\000\099\000\099\000\099\000\ + \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\ + \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\ + \099\000\099\000\099\000\099\000\099\000\099\000\255\255\255\255\ + \255\255\255\255\099\000\255\255\099\000\099\000\099\000\099\000\ + \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\ + \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\ + \099\000\099\000\099\000\099\000\099\000\099\000\100\000\100\000\ + \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\100\000\ + \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ + \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ + \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ + \100\000\255\255\255\255\255\255\255\255\100\000\255\255\100\000\ + \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ + \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ + \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ + \100\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\ + \101\000\101\000\101\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\101\000\101\000\101\000\101\000\101\000\101\000\ + \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\ + \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\ + \101\000\101\000\101\000\101\000\255\255\255\255\255\255\255\255\ + \101\000\255\255\101\000\101\000\101\000\101\000\101\000\101\000\ + \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\ + \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\ + \101\000\101\000\101\000\101\000\102\000\102\000\102\000\102\000\ + \102\000\102\000\102\000\102\000\102\000\102\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\102\000\102\000\102\000\ + \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\ + \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\ + \102\000\102\000\102\000\102\000\102\000\102\000\102\000\255\255\ + \255\255\255\255\255\255\102\000\255\255\102\000\102\000\102\000\ + \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\ + \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\ + \102\000\102\000\102\000\102\000\102\000\102\000\102\000\103\000\ + \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\ + \103\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\ + \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\ + \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\ + \103\000\103\000\255\255\255\255\255\255\255\255\103\000\255\255\ + \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\ + \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\ + \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\ + \103\000\103\000\104\000\104\000\104\000\104\000\104\000\104\000\ + \104\000\104\000\104\000\104\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\104\000\104\000\104\000\104\000\104\000\ + \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\ + \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\ + \104\000\104\000\104\000\104\000\104\000\255\255\255\255\255\255\ + \255\255\104\000\255\255\104\000\104\000\104\000\104\000\104\000\ + \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\ + \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\ + \104\000\104\000\104\000\104\000\104\000\105\000\105\000\105\000\ + \105\000\105\000\105\000\105\000\105\000\105\000\105\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\105\000\105\000\ + \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\ + \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\ + \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\ + \255\255\255\255\255\255\255\255\105\000\255\255\105\000\105\000\ + \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\ + \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\ + \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\ + \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ + \106\000\106\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ + \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ + \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ + \106\000\106\000\106\000\255\255\255\255\255\255\255\255\106\000\ + \255\255\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ + \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ + \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ + \106\000\106\000\106\000\107\000\107\000\107\000\107\000\107\000\ + \107\000\107\000\107\000\107\000\107\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\107\000\107\000\107\000\107\000\ + \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\ + \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\ + \107\000\107\000\107\000\107\000\107\000\107\000\255\255\255\255\ + \255\255\255\255\107\000\255\255\107\000\107\000\107\000\107\000\ + \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\ + \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\ + \107\000\107\000\107\000\107\000\107\000\107\000\108\000\108\000\ + \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\108\000\ + \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\ + \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\ + \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\ + \108\000\255\255\255\255\255\255\255\255\108\000\255\255\108\000\ + \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\ + \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\ + \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\ + \108\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\ + \109\000\109\000\109\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\109\000\109\000\109\000\109\000\109\000\109\000\ + \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\ + \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\ + \109\000\109\000\109\000\109\000\255\255\255\255\255\255\255\255\ + \109\000\255\255\109\000\109\000\109\000\109\000\109\000\109\000\ + \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\ + \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\ + \109\000\109\000\109\000\109\000\110\000\110\000\110\000\110\000\ + \110\000\110\000\110\000\110\000\110\000\110\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\110\000\110\000\110\000\ + \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\ + \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\ + \110\000\110\000\110\000\110\000\110\000\110\000\110\000\255\255\ + \255\255\255\255\255\255\110\000\255\255\110\000\110\000\110\000\ + \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\ + \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\ + \110\000\110\000\110\000\110\000\110\000\110\000\110\000\111\000\ + \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\ + \111\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\ + \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\ + \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\ + \111\000\111\000\255\255\255\255\255\255\255\255\111\000\255\255\ + \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\ + \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\ + \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\ + \111\000\111\000\112\000\112\000\112\000\112\000\112\000\112\000\ + \112\000\112\000\112\000\112\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\112\000\112\000\112\000\112\000\112\000\ + \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\ + \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\ + \112\000\112\000\112\000\112\000\112\000\255\255\255\255\255\255\ + \255\255\112\000\255\255\112\000\112\000\112\000\112\000\112\000\ + \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\ + \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\ + \112\000\112\000\112\000\112\000\112\000\113\000\113\000\113\000\ + \113\000\113\000\113\000\113\000\113\000\113\000\113\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\113\000\113\000\ + \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\ + \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\ + \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\ + \255\255\255\255\255\255\255\255\113\000\255\255\113\000\113\000\ + \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\ + \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\ + \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\ + \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\ + \114\000\114\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\114\000\114\000\114\000\114\000\114\000\114\000\114\000\ + \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\ + \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\ + \114\000\114\000\114\000\255\255\255\255\255\255\255\255\114\000\ + \255\255\114\000\114\000\114\000\114\000\114\000\114\000\114\000\ + \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\ + \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\ + \114\000\114\000\114\000\115\000\115\000\115\000\115\000\115\000\ + \115\000\115\000\115\000\115\000\115\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\115\000\115\000\115\000\115\000\ + \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\ + \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\ + \115\000\115\000\115\000\115\000\115\000\115\000\255\255\255\255\ + \255\255\255\255\115\000\255\255\115\000\115\000\115\000\115\000\ + \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\ + \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\ + \115\000\115\000\115\000\115\000\115\000\115\000\116\000\116\000\ + \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\116\000\ + \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\ + \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\ + \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\ + \116\000\255\255\255\255\255\255\255\255\116\000\255\255\116\000\ + \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\ + \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\ + \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\ + \116\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\ + \117\000\117\000\117\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\117\000\117\000\117\000\117\000\117\000\117\000\ + \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\ + \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\ + \117\000\117\000\117\000\117\000\255\255\255\255\255\255\255\255\ + \117\000\255\255\117\000\117\000\117\000\117\000\117\000\117\000\ + \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\ + \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\ + \117\000\117\000\117\000\117\000\118\000\118\000\118\000\118\000\ + \118\000\118\000\118\000\118\000\118\000\118\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\118\000\118\000\118\000\ + \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\ + \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\ + \118\000\118\000\118\000\118\000\118\000\118\000\118\000\255\255\ + \255\255\255\255\255\255\118\000\255\255\118\000\118\000\118\000\ + \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\ + \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\ + \118\000\118\000\118\000\118\000\118\000\118\000\118\000\119\000\ + \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\ + \119\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\ + \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\ + \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\ + \119\000\119\000\255\255\255\255\255\255\255\255\119\000\255\255\ + \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\ + \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\ + \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\ + \119\000\119\000\120\000\120\000\120\000\120\000\120\000\120\000\ + \120\000\120\000\120\000\120\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\120\000\120\000\120\000\120\000\120\000\ + \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\ + \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\ + \120\000\120\000\120\000\120\000\120\000\255\255\255\255\255\255\ + \255\255\120\000\255\255\120\000\120\000\120\000\120\000\120\000\ + \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\ + \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\ + \120\000\120\000\120\000\120\000\120\000\121\000\121\000\121\000\ + \121\000\121\000\121\000\121\000\121\000\121\000\121\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\121\000\121\000\ + \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\ + \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\ + \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\ + \255\255\255\255\255\255\255\255\121\000\255\255\121\000\121\000\ + \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\ + \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\ + \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\ + \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\ + \122\000\122\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\122\000\122\000\122\000\122\000\122\000\122\000\122\000\ + \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\ + \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\ + \122\000\122\000\122\000\255\255\255\255\255\255\255\255\122\000\ + \255\255\122\000\122\000\122\000\122\000\122\000\122\000\122\000\ + \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\ + \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\ + \122\000\122\000\122\000\123\000\123\000\123\000\123\000\123\000\ + \123\000\123\000\123\000\123\000\123\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\123\000\123\000\123\000\123\000\ + \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ + \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ + \123\000\123\000\123\000\123\000\123\000\123\000\255\255\255\255\ + \255\255\255\255\123\000\255\255\123\000\123\000\123\000\123\000\ + \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ + \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ + \123\000\123\000\123\000\123\000\123\000\123\000\124\000\124\000\ + \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\124\000\ + \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\ + \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\ + \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\ + \124\000\255\255\255\255\255\255\255\255\124\000\255\255\124\000\ + \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\ + \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\ + \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\ + \124\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\ + \125\000\125\000\125\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\125\000\125\000\125\000\125\000\125\000\125\000\ + \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\ + \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\ + \125\000\125\000\125\000\125\000\255\255\255\255\255\255\255\255\ + \125\000\255\255\125\000\125\000\125\000\125\000\125\000\125\000\ + \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\ + \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\ + \125\000\125\000\125\000\125\000\126\000\126\000\126\000\126\000\ + \126\000\126\000\126\000\126\000\126\000\126\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\126\000\126\000\126\000\ + \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\ + \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\ + \126\000\126\000\126\000\126\000\126\000\126\000\126\000\255\255\ + \255\255\255\255\255\255\126\000\255\255\126\000\126\000\126\000\ + \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\ + \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\ + \126\000\126\000\126\000\126\000\126\000\126\000\126\000\127\000\ + \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ + \127\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ + \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ + \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ + \127\000\127\000\255\255\255\255\255\255\255\255\127\000\255\255\ + \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ + \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ + \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ + \127\000\127\000\128\000\128\000\128\000\128\000\128\000\128\000\ + \128\000\128\000\128\000\128\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\128\000\128\000\128\000\128\000\128\000\ + \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\ + \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\ + \128\000\128\000\128\000\128\000\128\000\255\255\255\255\255\255\ + \255\255\128\000\255\255\128\000\128\000\128\000\128\000\128\000\ + \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\ + \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\ + \128\000\128\000\128\000\128\000\128\000\129\000\129\000\129\000\ + \129\000\129\000\129\000\129\000\129\000\129\000\129\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\129\000\129\000\ + \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\ + \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\ + \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\ + \255\255\255\255\255\255\255\255\129\000\255\255\129\000\129\000\ + \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\ + \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\ + \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\ + \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ + \130\000\130\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ + \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ + \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ + \130\000\130\000\130\000\255\255\255\255\255\255\255\255\130\000\ + \255\255\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ + \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ + \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ + \130\000\130\000\130\000\131\000\131\000\131\000\131\000\131\000\ + \131\000\131\000\131\000\131\000\131\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\131\000\131\000\131\000\131\000\ + \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\ + \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\ + \131\000\131\000\131\000\131\000\131\000\131\000\255\255\255\255\ + \255\255\255\255\131\000\255\255\131\000\131\000\131\000\131\000\ + \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\ + \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\ + \131\000\131\000\131\000\131\000\131\000\131\000\132\000\132\000\ + \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\132\000\ + \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\ + \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\ + \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\ + \132\000\255\255\255\255\255\255\255\255\132\000\255\255\132\000\ + \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\ + \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\ + \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\ + \132\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\ + \133\000\133\000\133\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\133\000\133\000\133\000\133\000\133\000\133\000\ + \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\ + \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\ + \133\000\133\000\133\000\133\000\255\255\255\255\255\255\255\255\ + \133\000\255\255\133\000\133\000\133\000\133\000\133\000\133\000\ + \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\ + \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\ + \133\000\133\000\133\000\133\000\134\000\134\000\134\000\134\000\ + \134\000\134\000\134\000\134\000\134\000\134\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\134\000\134\000\134\000\ + \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\ + \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\ + \134\000\134\000\134\000\134\000\134\000\134\000\134\000\255\255\ + \255\255\255\255\255\255\134\000\255\255\134\000\134\000\134\000\ + \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\ + \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\ + \134\000\134\000\134\000\134\000\134\000\134\000\134\000\135\000\ + \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\ + \135\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\ + \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\ + \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\ + \135\000\135\000\255\255\255\255\255\255\255\255\135\000\255\255\ + \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\ + \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\ + \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\ + \135\000\135\000\136\000\136\000\136\000\136\000\136\000\136\000\ + \136\000\136\000\136\000\136\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\136\000\136\000\136\000\136\000\136\000\ + \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\ + \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\ + \136\000\136\000\136\000\136\000\136\000\255\255\255\255\255\255\ + \255\255\136\000\255\255\136\000\136\000\136\000\136\000\136\000\ + \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\ + \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\ + \136\000\136\000\136\000\136\000\136\000\137\000\137\000\137\000\ + \137\000\137\000\137\000\137\000\137\000\137\000\137\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\137\000\137\000\ + \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ + \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ + \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ + \255\255\255\255\255\255\255\255\137\000\255\255\137\000\137\000\ + \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ + \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ + \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ + \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ + \138\000\138\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ + \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ + \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ + \138\000\138\000\138\000\255\255\255\255\255\255\255\255\138\000\ + \255\255\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ + \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ + \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ + \138\000\138\000\138\000\139\000\139\000\139\000\139\000\139\000\ + \139\000\139\000\139\000\139\000\139\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\139\000\139\000\139\000\139\000\ + \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ + \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ + \139\000\139\000\139\000\139\000\139\000\139\000\255\255\255\255\ + \255\255\255\255\139\000\255\255\139\000\139\000\139\000\139\000\ + \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ + \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ + \139\000\139\000\139\000\139\000\139\000\139\000\140\000\140\000\ + \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\140\000\ + \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ + \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ + \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ + \140\000\255\255\255\255\255\255\255\255\140\000\255\255\140\000\ + \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ + \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ + \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ + \140\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\ + \141\000\141\000\141\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\141\000\141\000\141\000\141\000\141\000\141\000\ + \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\ + \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\ + \141\000\141\000\141\000\141\000\255\255\255\255\255\255\255\255\ + \141\000\255\255\141\000\141\000\141\000\141\000\141\000\141\000\ + \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\ + \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\ + \141\000\141\000\141\000\141\000\142\000\142\000\142\000\142\000\ + \142\000\142\000\142\000\142\000\142\000\142\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\142\000\142\000\142\000\ + \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\ + \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\ + \142\000\142\000\142\000\142\000\142\000\142\000\142\000\255\255\ + \255\255\255\255\255\255\142\000\255\255\142\000\142\000\142\000\ + \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\ + \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\ + \142\000\142\000\142\000\142\000\142\000\142\000\142\000\143\000\ + \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\ + \143\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\ + \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\ + \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\ + \143\000\143\000\255\255\255\255\255\255\255\255\143\000\255\255\ + \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\ + \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\ + \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\ + \143\000\143\000\144\000\144\000\144\000\144\000\144\000\144\000\ + \144\000\144\000\144\000\144\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\144\000\144\000\144\000\144\000\144\000\ + \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\ + \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\ + \144\000\144\000\144\000\144\000\144\000\255\255\255\255\255\255\ + \255\255\144\000\255\255\144\000\144\000\144\000\144\000\144\000\ + \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\ + \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\ + \144\000\144\000\144\000\144\000\144\000\145\000\145\000\145\000\ + \145\000\145\000\145\000\145\000\145\000\145\000\145\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\145\000\145\000\ + \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\ + \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\ + \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\ + \255\255\255\255\255\255\255\255\145\000\255\255\145\000\145\000\ + \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\ + \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\ + \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\ + \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\ + \146\000\146\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\146\000\146\000\146\000\146\000\146\000\146\000\146\000\ + \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\ + \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\ + \146\000\146\000\146\000\255\255\255\255\255\255\255\255\146\000\ + \255\255\146\000\146\000\146\000\146\000\146\000\146\000\146\000\ + \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\ + \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\ + \146\000\146\000\146\000\147\000\147\000\147\000\147\000\147\000\ + \147\000\147\000\147\000\147\000\147\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\147\000\147\000\147\000\147\000\ + \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\ + \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\ + \147\000\147\000\147\000\147\000\147\000\147\000\255\255\255\255\ + \255\255\255\255\147\000\255\255\147\000\147\000\147\000\147\000\ + \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\ + \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\ + \147\000\147\000\147\000\147\000\147\000\147\000\148\000\148\000\ + \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\148\000\ + \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\ + \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\ + \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\ + \148\000\255\255\255\255\255\255\255\255\148\000\255\255\148\000\ + \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\ + \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\ + \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\ + \148\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\ + \149\000\149\000\149\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\149\000\149\000\149\000\149\000\149\000\149\000\ + \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\ + \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\ + \149\000\149\000\149\000\149\000\255\255\255\255\255\255\255\255\ + \149\000\255\255\149\000\149\000\149\000\149\000\149\000\149\000\ + \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\ + \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\ + \149\000\149\000\149\000\149\000\150\000\150\000\150\000\150\000\ + \150\000\150\000\150\000\150\000\150\000\150\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\150\000\150\000\150\000\ + \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\ + \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\ + \150\000\150\000\150\000\150\000\150\000\150\000\150\000\255\255\ + \255\255\255\255\255\255\150\000\255\255\150\000\150\000\150\000\ + \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\ + \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\ + \150\000\150\000\150\000\150\000\150\000\150\000\150\000\151\000\ + \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\ + \151\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\ + \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\ + \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\ + \151\000\151\000\255\255\255\255\255\255\255\255\151\000\255\255\ + \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\ + \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\ + \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\ + \151\000\151\000\152\000\152\000\152\000\152\000\152\000\152\000\ + \152\000\152\000\152\000\152\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\152\000\152\000\152\000\152\000\152\000\ + \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\ + \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\ + \152\000\152\000\152\000\152\000\152\000\255\255\255\255\255\255\ + \255\255\152\000\255\255\152\000\152\000\152\000\152\000\152\000\ + \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\ + \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\ + \152\000\152\000\152\000\152\000\152\000\153\000\153\000\153\000\ + \153\000\153\000\153\000\153\000\153\000\153\000\153\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\153\000\153\000\ + \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\ + \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\ + \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\ + \255\255\255\255\255\255\255\255\153\000\255\255\153\000\153\000\ + \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\ + \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\ + \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\ + \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\ + \154\000\154\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\154\000\154\000\154\000\154\000\154\000\154\000\154\000\ + \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\ + \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\ + \154\000\154\000\154\000\255\255\255\255\255\255\255\255\154\000\ + \255\255\154\000\154\000\154\000\154\000\154\000\154\000\154\000\ + \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\ + \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\ + \154\000\154\000\154\000\155\000\155\000\155\000\155\000\155\000\ + \155\000\155\000\155\000\155\000\155\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\155\000\155\000\155\000\155\000\ + \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\ + \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\ + \155\000\155\000\155\000\155\000\155\000\155\000\255\255\255\255\ + \255\255\255\255\155\000\255\255\155\000\155\000\155\000\155\000\ + \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\ + \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\ + \155\000\155\000\155\000\155\000\155\000\155\000\156\000\156\000\ + \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\156\000\ + \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ + \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ + \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ + \156\000\255\255\255\255\255\255\255\255\156\000\255\255\156\000\ + \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ + \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ + \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ + \156\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\ + \157\000\157\000\157\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\157\000\157\000\157\000\157\000\157\000\157\000\ + \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\ + \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\ + \157\000\157\000\157\000\157\000\255\255\255\255\255\255\255\255\ + \157\000\255\255\157\000\157\000\157\000\157\000\157\000\157\000\ + \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\ + \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\ + \157\000\157\000\157\000\157\000\158\000\158\000\158\000\158\000\ + \158\000\158\000\158\000\158\000\158\000\158\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\158\000\158\000\158\000\ + \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\ + \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\ + \158\000\158\000\158\000\158\000\158\000\158\000\158\000\255\255\ + \255\255\255\255\255\255\158\000\255\255\158\000\158\000\158\000\ + \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\ + \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\ + \158\000\158\000\158\000\158\000\158\000\158\000\158\000\159\000\ + \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\ + \159\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\ + \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\ + \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\ + \159\000\159\000\255\255\255\255\255\255\255\255\159\000\255\255\ + \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\ + \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\ + \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\ + \159\000\159\000\160\000\160\000\160\000\160\000\160\000\160\000\ + \160\000\160\000\160\000\160\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\160\000\160\000\160\000\160\000\160\000\ + \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\ + \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\ + \160\000\160\000\160\000\160\000\160\000\255\255\255\255\255\255\ + \255\255\160\000\255\255\160\000\160\000\160\000\160\000\160\000\ + \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\ + \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\ + \160\000\160\000\160\000\160\000\160\000\161\000\161\000\161\000\ + \161\000\161\000\161\000\161\000\161\000\161\000\161\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\161\000\161\000\ + \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\ + \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\ + \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\ + \255\255\255\255\255\255\255\255\161\000\255\255\161\000\161\000\ + \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\ + \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\ + \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\ + \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\ + \162\000\162\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\162\000\162\000\162\000\162\000\162\000\162\000\162\000\ + \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\ + \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\ + \162\000\162\000\162\000\255\255\255\255\255\255\255\255\162\000\ + \255\255\162\000\162\000\162\000\162\000\162\000\162\000\162\000\ + \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\ + \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\ + \162\000\162\000\162\000\163\000\163\000\163\000\163\000\163\000\ + \163\000\163\000\163\000\163\000\163\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\163\000\163\000\163\000\163\000\ + \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\ + \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\ + \163\000\163\000\163\000\163\000\163\000\163\000\255\255\255\255\ + \255\255\255\255\163\000\255\255\163\000\163\000\163\000\163\000\ + \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\ + \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\ + \163\000\163\000\163\000\163\000\163\000\163\000\164\000\164\000\ + \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\164\000\ + \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ + \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ + \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ + \164\000\255\255\255\255\255\255\255\255\164\000\255\255\164\000\ + \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ + \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ + \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ + \164\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\ + \165\000\165\000\165\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\165\000\165\000\165\000\165\000\165\000\165\000\ + \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\ + \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\ + \165\000\165\000\165\000\165\000\255\255\255\255\255\255\255\255\ + \165\000\255\255\165\000\165\000\165\000\165\000\165\000\165\000\ + \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\ + \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\ + \165\000\165\000\165\000\165\000\166\000\166\000\166\000\166\000\ + \166\000\166\000\166\000\166\000\166\000\166\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\166\000\166\000\166\000\ + \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\ + \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\ + \166\000\166\000\166\000\166\000\166\000\166\000\166\000\255\255\ + \255\255\255\255\255\255\166\000\255\255\166\000\166\000\166\000\ + \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\ + \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\ + \166\000\166\000\166\000\166\000\166\000\166\000\166\000\167\000\ + \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ + \167\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ + \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ + \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ + \167\000\167\000\255\255\255\255\255\255\255\255\167\000\255\255\ + \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ + \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ + \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ + \167\000\167\000\168\000\168\000\168\000\168\000\168\000\168\000\ + \168\000\168\000\168\000\168\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\168\000\168\000\168\000\168\000\168\000\ + \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\ + \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\ + \168\000\168\000\168\000\168\000\168\000\255\255\255\255\255\255\ + \255\255\168\000\255\255\168\000\168\000\168\000\168\000\168\000\ + \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\ + \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\ + \168\000\168\000\168\000\168\000\168\000\169\000\169\000\169\000\ + \169\000\169\000\169\000\169\000\169\000\169\000\169\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\169\000\169\000\ + \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\ + \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\ + \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\ + \255\255\255\255\255\255\255\255\169\000\255\255\169\000\169\000\ + \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\ + \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\ + \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\ + \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\ + \170\000\170\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\170\000\170\000\170\000\170\000\170\000\170\000\170\000\ + \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\ + \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\ + \170\000\170\000\170\000\255\255\255\255\255\255\255\255\170\000\ + \255\255\170\000\170\000\170\000\170\000\170\000\170\000\170\000\ + \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\ + \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\ + \170\000\170\000\170\000\171\000\171\000\171\000\171\000\171\000\ + \171\000\171\000\171\000\171\000\171\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\171\000\171\000\171\000\171\000\ + \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\ + \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\ + \171\000\171\000\171\000\171\000\171\000\171\000\255\255\255\255\ + \255\255\255\255\171\000\255\255\171\000\171\000\171\000\171\000\ + \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\ + \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\ + \171\000\171\000\171\000\171\000\171\000\171\000\172\000\172\000\ + \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\172\000\ + \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\ + \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\ + \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\ + \172\000\255\255\255\255\255\255\255\255\172\000\255\255\172\000\ + \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\ + \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\ + \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\ + \172\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\ + \173\000\173\000\173\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\173\000\173\000\173\000\173\000\173\000\173\000\ + \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\ + \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\ + \173\000\173\000\173\000\173\000\255\255\255\255\255\255\255\255\ + \173\000\255\255\173\000\173\000\173\000\173\000\173\000\173\000\ + \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\ + \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\ + \173\000\173\000\173\000\173\000\174\000\174\000\174\000\174\000\ + \174\000\174\000\174\000\174\000\174\000\174\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\174\000\174\000\174\000\ + \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\ + \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\ + \174\000\174\000\174\000\174\000\174\000\174\000\174\000\255\255\ + \255\255\255\255\255\255\174\000\255\255\174\000\174\000\174\000\ + \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\ + \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\ + \174\000\174\000\174\000\174\000\174\000\174\000\174\000\175\000\ + \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ + \175\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ + \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ + \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ + \175\000\175\000\255\255\255\255\255\255\255\255\175\000\255\255\ + \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ + \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ + \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ + \175\000\175\000\176\000\176\000\176\000\176\000\176\000\176\000\ + \176\000\176\000\176\000\176\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\176\000\176\000\176\000\176\000\176\000\ + \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\ + \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\ + \176\000\176\000\176\000\176\000\176\000\255\255\255\255\255\255\ + \255\255\176\000\255\255\176\000\176\000\176\000\176\000\176\000\ + \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\ + \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\ + \176\000\176\000\176\000\176\000\176\000\177\000\177\000\177\000\ + \177\000\177\000\177\000\177\000\177\000\177\000\177\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\177\000\177\000\ + \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ + \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ + \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ + \255\255\255\255\255\255\255\255\177\000\255\255\177\000\177\000\ + \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ + \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ + \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ + \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\ + \180\000\180\000\255\255\247\000\181\000\181\000\181\000\181\000\ + \181\000\181\000\181\000\181\000\181\000\181\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\180\000\181\000\181\000\181\000\ + \181\000\181\000\181\000\247\000\255\255\180\000\255\255\255\255\ + \255\255\255\255\255\255\249\000\255\255\255\255\194\000\194\000\ + \194\000\194\000\194\000\194\000\194\000\194\000\255\255\255\255\ + \255\255\014\001\014\001\255\255\180\000\181\000\181\000\181\000\ + \181\000\181\000\181\000\249\000\255\255\180\000\182\000\182\000\ + \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\ + \014\001\255\255\014\001\255\255\255\255\255\255\255\255\182\000\ + \182\000\182\000\182\000\182\000\182\000\247\000\255\255\194\000\ + \194\000\255\255\182\000\255\255\194\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\182\000\194\000\255\255\255\255\255\255\ + \194\000\255\255\194\000\255\255\194\000\255\255\255\255\182\000\ + \182\000\182\000\182\000\182\000\182\000\249\000\255\255\255\255\ + \255\255\255\255\182\000\207\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\182\000\207\000\207\000\207\000\207\000\ + \207\000\207\000\207\000\207\000\250\000\250\000\250\000\250\000\ + \250\000\250\000\250\000\250\000\006\001\006\001\006\001\006\001\ + \006\001\006\001\006\001\006\001\013\001\013\001\013\001\013\001\ + \013\001\013\001\013\001\013\001\013\001\013\001\255\255\255\255\ + \255\255\255\255\255\255\255\255\008\001\008\001\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\250\000\250\000\255\255\ + \255\255\255\255\250\000\008\001\255\255\008\001\255\255\255\255\ + \255\255\255\255\250\000\255\255\255\255\255\255\250\000\255\255\ + \250\000\255\255\250\000\008\001\008\001\008\001\008\001\008\001\ + \008\001\008\001\008\001\008\001\008\001\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\194\000\255\255\ + \255\255\247\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\249\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \014\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\250\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\008\001"; + Lexing.lex_base_code = + ""; + Lexing.lex_backtrk_code = + ""; + Lexing.lex_default_code = + ""; + Lexing.lex_trans_code = + ""; + Lexing.lex_check_code = + ""; + Lexing.lex_code = + ""; +} + +let rec ctoken lexbuf = + __ocaml_lex_ctoken_rec lexbuf 0 +and __ocaml_lex_ctoken_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 95 "clex.mll" + ( count (Lexing.lexeme lexbuf); comment lexbuf; ctoken lexbuf ) +# 3059 "clex.ml" + + | 1 -> +# 96 "clex.mll" + ( count (Lexing.lexeme lexbuf); inlcomment lexbuf; ctoken lexbuf ) +# 3064 "clex.ml" + + | 2 -> +# 97 "clex.mll" + ( count (Lexing.lexeme lexbuf); AUTO ) +# 3069 "clex.ml" + + | 3 -> +# 98 "clex.mll" + ( count (Lexing.lexeme lexbuf); BREAK ) +# 3074 "clex.ml" + + | 4 -> +# 99 "clex.mll" + ( count (Lexing.lexeme lexbuf); CASE ) +# 3079 "clex.ml" + + | 5 -> +# 100 "clex.mll" + ( count (Lexing.lexeme lexbuf); CHAR ) +# 3084 "clex.ml" + + | 6 -> +# 101 "clex.mll" + ( count (Lexing.lexeme lexbuf); CONST ) +# 3089 "clex.ml" + + | 7 -> +# 102 "clex.mll" + ( count (Lexing.lexeme lexbuf); CONTINUE ) +# 3094 "clex.ml" + + | 8 -> +# 103 "clex.mll" + ( count (Lexing.lexeme lexbuf); DEFAULT ) +# 3099 "clex.ml" + + | 9 -> +# 104 "clex.mll" + ( count (Lexing.lexeme lexbuf); DO ) +# 3104 "clex.ml" + + | 10 -> +# 105 "clex.mll" + ( count (Lexing.lexeme lexbuf); DOUBLE ) +# 3109 "clex.ml" + + | 11 -> +# 106 "clex.mll" + ( count (Lexing.lexeme lexbuf); ELSE ) +# 3114 "clex.ml" + + | 12 -> +# 107 "clex.mll" + ( count (Lexing.lexeme lexbuf); ENUM ) +# 3119 "clex.ml" + + | 13 -> +# 108 "clex.mll" + ( count (Lexing.lexeme lexbuf); EXTERN ) +# 3124 "clex.ml" + + | 14 -> +# 109 "clex.mll" + ( count (Lexing.lexeme lexbuf); FLOATING ) +# 3129 "clex.ml" + + | 15 -> +# 110 "clex.mll" + ( count (Lexing.lexeme lexbuf); FOR ) +# 3134 "clex.ml" + + | 16 -> +# 111 "clex.mll" + ( count (Lexing.lexeme lexbuf); GOTO ) +# 3139 "clex.ml" + + | 17 -> +# 112 "clex.mll" + ( count (Lexing.lexeme lexbuf); IF ) +# 3144 "clex.ml" + + | 18 -> +# 113 "clex.mll" + ( count (Lexing.lexeme lexbuf); INTEGER ) +# 3149 "clex.ml" + + | 19 -> +# 114 "clex.mll" + ( count (Lexing.lexeme lexbuf); LONG ) +# 3154 "clex.ml" + + | 20 -> +# 115 "clex.mll" + ( count (Lexing.lexeme lexbuf); REGISTER ) +# 3159 "clex.ml" + + | 21 -> +# 116 "clex.mll" + ( count (Lexing.lexeme lexbuf); RETURN ) +# 3164 "clex.ml" + + | 22 -> +# 117 "clex.mll" + ( count (Lexing.lexeme lexbuf); SHORT ) +# 3169 "clex.ml" + + | 23 -> +# 118 "clex.mll" + ( count (Lexing.lexeme lexbuf); SIGNED ) +# 3174 "clex.ml" + + | 24 -> +# 119 "clex.mll" + ( count (Lexing.lexeme lexbuf); SIZEOF ) +# 3179 "clex.ml" + + | 25 -> +# 120 "clex.mll" + ( count (Lexing.lexeme lexbuf); STATIC ) +# 3184 "clex.ml" + + | 26 -> +# 121 "clex.mll" + ( count (Lexing.lexeme lexbuf); STRUCT ) +# 3189 "clex.ml" + + | 27 -> +# 122 "clex.mll" + ( count (Lexing.lexeme lexbuf); SWITCH ) +# 3194 "clex.ml" + + | 28 -> +# 123 "clex.mll" + ( count (Lexing.lexeme lexbuf); TYPEDEF ) +# 3199 "clex.ml" + + | 29 -> +# 124 "clex.mll" + ( count (Lexing.lexeme lexbuf); UNION ) +# 3204 "clex.ml" + + | 30 -> +# 125 "clex.mll" + ( count (Lexing.lexeme lexbuf); UNSIGNED ) +# 3209 "clex.ml" + + | 31 -> +# 126 "clex.mll" + ( count (Lexing.lexeme lexbuf); VOID ) +# 3214 "clex.ml" + + | 32 -> +# 127 "clex.mll" + ( count (Lexing.lexeme lexbuf); VOLATILE ) +# 3219 "clex.ml" + + | 33 -> +# 128 "clex.mll" + ( count (Lexing.lexeme lexbuf); WHILE ) +# 3224 "clex.ml" + + | 34 -> +# 129 "clex.mll" + ( count (Lexing.lexeme lexbuf); + let yytext = Lexing.lexeme lexbuf in + IDENTIFIER yytext + ) +# 3232 "clex.ml" + + | 35 -> +# 133 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 0) ) +# 3238 "clex.ml" + + | 36 -> +# 135 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 1) ) +# 3244 "clex.ml" + + | 37 -> +# 137 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 1) ) +# 3250 "clex.ml" + + | 38 -> +# 139 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 2) ) +# 3256 "clex.ml" + + | 39 -> +# 142 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 3) ) +# 3262 "clex.ml" + + | 40 -> +# 146 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 0) ) +# 3268 "clex.ml" + + | 41 -> +# 148 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 1) ) +# 3274 "clex.ml" + + | 42 -> +# 150 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 1) ) +# 3280 "clex.ml" + + | 43 -> +# 153 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 2) ) +# 3286 "clex.ml" + + | 44 -> +# 156 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 3) ) +# 3292 "clex.ml" + + | 45 -> +# 159 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 0) ) +# 3298 "clex.ml" + + | 46 -> +# 161 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 1) ) +# 3304 "clex.ml" + + | 47 -> +# 163 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 1) ) +# 3310 "clex.ml" + + | 48 -> +# 166 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 1) ) +# 3316 "clex.ml" + + | 49 -> +# 169 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 2) ) +# 3322 "clex.ml" + + | 50 -> +# 172 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 3) ) +# 3328 "clex.ml" + + | 51 -> +# 175 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char (Lexing.lexeme_char lexbuf 1)) ) +# 3334 "clex.ml" + + | 52 -> +# 177 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 2 1) ) +# 3340 "clex.ml" + + | 53 -> +# 179 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT 7 (* bell, ^G *) ) +# 3346 "clex.ml" + + | 54 -> +# 181 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\b') ) +# 3352 "clex.ml" + + | 55 -> +# 183 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT 12 (* form feed, ^L *) ) +# 3358 "clex.ml" + + | 56 -> +# 185 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\n') ) +# 3364 "clex.ml" + + | 57 -> +# 187 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\r') ) +# 3370 "clex.ml" + + | 58 -> +# 189 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\t') + (* bell, ^G *) ) +# 3377 "clex.ml" + + | 59 -> +# 192 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT 11 (* vertical tab, ^K *) ) +# 3383 "clex.ml" + + | 60 -> +# 194 "clex.mll" + ( count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char (Lexing.lexeme_char lexbuf 2)) ) +# 3389 "clex.ml" + + | 61 -> +# 197 "clex.mll" + ( + count (Lexing.lexeme lexbuf); Buffer.reset string_buf; + string lexbuf; + STRING_LITERAL (Buffer.contents string_buf) + ) +# 3398 "clex.ml" + + | 62 -> +# 202 "clex.mll" + ( count (Lexing.lexeme lexbuf); ELLIPSIS ) +# 3403 "clex.ml" + + | 63 -> +# 203 "clex.mll" + ( count (Lexing.lexeme lexbuf); RIGHT_ASSIGN ) +# 3408 "clex.ml" + + | 64 -> +# 204 "clex.mll" + ( count (Lexing.lexeme lexbuf); LEFT_ASSIGN ) +# 3413 "clex.ml" + + | 65 -> +# 205 "clex.mll" + ( count (Lexing.lexeme lexbuf); ADD_ASSIGN ) +# 3418 "clex.ml" + + | 66 -> +# 206 "clex.mll" + ( count (Lexing.lexeme lexbuf); SUB_ASSIGN ) +# 3423 "clex.ml" + + | 67 -> +# 207 "clex.mll" + ( count (Lexing.lexeme lexbuf); MUL_ASSIGN ) +# 3428 "clex.ml" + + | 68 -> +# 208 "clex.mll" + ( count (Lexing.lexeme lexbuf); DIV_ASSIGN ) +# 3433 "clex.ml" + + | 69 -> +# 209 "clex.mll" + ( count (Lexing.lexeme lexbuf); MOD_ASSIGN ) +# 3438 "clex.ml" + + | 70 -> +# 210 "clex.mll" + ( count (Lexing.lexeme lexbuf); AND_ASSIGN ) +# 3443 "clex.ml" + + | 71 -> +# 211 "clex.mll" + ( count (Lexing.lexeme lexbuf); XOR_ASSIGN ) +# 3448 "clex.ml" + + | 72 -> +# 212 "clex.mll" + ( count (Lexing.lexeme lexbuf); OR_ASSIGN ) +# 3453 "clex.ml" + + | 73 -> +# 213 "clex.mll" + ( count (Lexing.lexeme lexbuf); RIGHT_OP ) +# 3458 "clex.ml" + + | 74 -> +# 214 "clex.mll" + ( count (Lexing.lexeme lexbuf); LEFT_OP ) +# 3463 "clex.ml" + + | 75 -> +# 215 "clex.mll" + ( count (Lexing.lexeme lexbuf); INC_OP ) +# 3468 "clex.ml" + + | 76 -> +# 216 "clex.mll" + ( count (Lexing.lexeme lexbuf); DEC_OP ) +# 3473 "clex.ml" + + | 77 -> +# 217 "clex.mll" + ( count (Lexing.lexeme lexbuf); PTR_OP ) +# 3478 "clex.ml" + + | 78 -> +# 218 "clex.mll" + ( count (Lexing.lexeme lexbuf); AND_OP ) +# 3483 "clex.ml" + + | 79 -> +# 219 "clex.mll" + ( count (Lexing.lexeme lexbuf); OR_OP ) +# 3488 "clex.ml" + + | 80 -> +# 220 "clex.mll" + ( count (Lexing.lexeme lexbuf); LE_OP ) +# 3493 "clex.ml" + + | 81 -> +# 221 "clex.mll" + ( count (Lexing.lexeme lexbuf); GE_OP ) +# 3498 "clex.ml" + + | 82 -> +# 222 "clex.mll" + ( count (Lexing.lexeme lexbuf); EQ_OP ) +# 3503 "clex.ml" + + | 83 -> +# 223 "clex.mll" + ( count (Lexing.lexeme lexbuf); NE_OP ) +# 3508 "clex.ml" + + | 84 -> +# 224 "clex.mll" + ( count (Lexing.lexeme lexbuf); SEMI_CHR ) +# 3513 "clex.ml" + + | 85 -> +# 225 "clex.mll" + ( count (Lexing.lexeme lexbuf); OPEN_BRACE_CHR ) +# 3518 "clex.ml" + + | 86 -> +# 226 "clex.mll" + ( count (Lexing.lexeme lexbuf); CLOSE_BRACE_CHR ) +# 3523 "clex.ml" + + | 87 -> +# 227 "clex.mll" + ( count (Lexing.lexeme lexbuf); COMMA_CHR ) +# 3528 "clex.ml" + + | 88 -> +# 228 "clex.mll" + ( count (Lexing.lexeme lexbuf); COLON_CHR ) +# 3533 "clex.ml" + + | 89 -> +# 229 "clex.mll" + ( count (Lexing.lexeme lexbuf); EQ_CHR ) +# 3538 "clex.ml" + + | 90 -> +# 230 "clex.mll" + ( count (Lexing.lexeme lexbuf); OPEN_PAREN_CHR ) +# 3543 "clex.ml" + + | 91 -> +# 231 "clex.mll" + ( count (Lexing.lexeme lexbuf); CLOSE_PAREN_CHR ) +# 3548 "clex.ml" + + | 92 -> +# 232 "clex.mll" + ( count (Lexing.lexeme lexbuf); OPEN_BRACKET_CHR ) +# 3553 "clex.ml" + + | 93 -> +# 233 "clex.mll" + ( count (Lexing.lexeme lexbuf); CLOSE_BRACKET_CHR ) +# 3558 "clex.ml" + + | 94 -> +# 234 "clex.mll" + ( count (Lexing.lexeme lexbuf); DOT_CHR ) +# 3563 "clex.ml" + + | 95 -> +# 235 "clex.mll" + ( count (Lexing.lexeme lexbuf); AND_CHR ) +# 3568 "clex.ml" + + | 96 -> +# 236 "clex.mll" + ( count (Lexing.lexeme lexbuf); OR_CHR ) +# 3573 "clex.ml" + + | 97 -> +# 237 "clex.mll" + ( count (Lexing.lexeme lexbuf); XOR_CHR ) +# 3578 "clex.ml" + + | 98 -> +# 238 "clex.mll" + ( count (Lexing.lexeme lexbuf); BANG_CHR ) +# 3583 "clex.ml" + + | 99 -> +# 239 "clex.mll" + ( count (Lexing.lexeme lexbuf); TILDE_CHR ) +# 3588 "clex.ml" + + | 100 -> +# 240 "clex.mll" + ( count (Lexing.lexeme lexbuf); ADD_CHR ) +# 3593 "clex.ml" + + | 101 -> +# 241 "clex.mll" + ( count (Lexing.lexeme lexbuf); SUB_CHR ) +# 3598 "clex.ml" + + | 102 -> +# 242 "clex.mll" + ( count (Lexing.lexeme lexbuf); STAR_CHR ) +# 3603 "clex.ml" + + | 103 -> +# 243 "clex.mll" + ( count (Lexing.lexeme lexbuf); DIV_CHR ) +# 3608 "clex.ml" + + | 104 -> +# 244 "clex.mll" + ( count (Lexing.lexeme lexbuf); MOD_CHR ) +# 3613 "clex.ml" + + | 105 -> +# 245 "clex.mll" + ( count (Lexing.lexeme lexbuf); OPEN_ANGLE_CHR ) +# 3618 "clex.ml" + + | 106 -> +# 246 "clex.mll" + ( count (Lexing.lexeme lexbuf); CLOSE_ANGLE_CHR ) +# 3623 "clex.ml" + + | 107 -> +# 247 "clex.mll" + ( count (Lexing.lexeme lexbuf); QUES_CHR ) +# 3628 "clex.ml" + + | 108 -> +# 248 "clex.mll" + ( count (Lexing.lexeme lexbuf); line lexbuf ) +# 3633 "clex.ml" + + | 109 -> +# 249 "clex.mll" + ( count (Lexing.lexeme lexbuf); ctoken lexbuf ) +# 3638 "clex.ml" + + | 110 -> +# 250 "clex.mll" + ( fatal (Some (!cfile, !cline, !ccol, !cline, !ccol+1)) + ("bad character '" ^ (Lexing.lexeme lexbuf) ^ "'") ) +# 3644 "clex.ml" + + | 111 -> +# 252 "clex.mll" + ( EOF ) +# 3649 "clex.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_ctoken_rec lexbuf __ocaml_lex_state + +and comment lexbuf = + __ocaml_lex_comment_rec lexbuf 239 +and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 254 "clex.mll" + ( count (Lexing.lexeme lexbuf) ) +# 3661 "clex.ml" + + | 1 -> +# 255 "clex.mll" + ( count (Lexing.lexeme lexbuf); comment lexbuf ) +# 3666 "clex.ml" + + | 2 -> +# 256 "clex.mll" + ( fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside comment" ) +# 3671 "clex.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_comment_rec lexbuf __ocaml_lex_state + +and inlcomment lexbuf = + __ocaml_lex_inlcomment_rec lexbuf 244 +and __ocaml_lex_inlcomment_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 258 "clex.mll" + ( count (Lexing.lexeme lexbuf) ) +# 3683 "clex.ml" + + | 1 -> +# 259 "clex.mll" + ( count (Lexing.lexeme lexbuf); inlcomment lexbuf ) +# 3688 "clex.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_inlcomment_rec lexbuf __ocaml_lex_state + +and string lexbuf = + __ocaml_lex_string_rec lexbuf 247 +and __ocaml_lex_string_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 261 "clex.mll" + ( () ) +# 3700 "clex.ml" + + | 1 -> +# 262 "clex.mll" + ( string lexbuf ) +# 3705 "clex.ml" + + | 2 -> +# 263 "clex.mll" + ( Buffer.add_char string_buf (Char.chr (parse_oct (Lexing.lexeme lexbuf) 1 0)); string lexbuf ) +# 3710 "clex.ml" + + | 3 -> +# 264 "clex.mll" + ( Buffer.add_char string_buf '\007'; string lexbuf ) +# 3715 "clex.ml" + + | 4 -> +# 265 "clex.mll" + ( Buffer.add_char string_buf '\b'; string lexbuf ) +# 3720 "clex.ml" + + | 5 -> +# 266 "clex.mll" + ( Buffer.add_char string_buf '\014'; string lexbuf ) +# 3725 "clex.ml" + + | 6 -> +# 267 "clex.mll" + ( Buffer.add_char string_buf '\n'; string lexbuf ) +# 3730 "clex.ml" + + | 7 -> +# 268 "clex.mll" + ( Buffer.add_char string_buf '\r'; string lexbuf ) +# 3735 "clex.ml" + + | 8 -> +# 269 "clex.mll" + ( Buffer.add_char string_buf '\t'; string lexbuf ) +# 3740 "clex.ml" + + | 9 -> +# 270 "clex.mll" + ( Buffer.add_char string_buf '\013'; string lexbuf ) +# 3745 "clex.ml" + + | 10 -> +# 271 "clex.mll" + ( Buffer.add_char string_buf (Lexing.lexeme_char lexbuf 1); string lexbuf ) +# 3750 "clex.ml" + + | 11 -> +# 272 "clex.mll" + ( Buffer.add_string string_buf (Lexing.lexeme lexbuf); string lexbuf ) +# 3755 "clex.ml" + + | 12 -> +# 273 "clex.mll" + ( Buffer.add_char string_buf (Lexing.lexeme_char lexbuf 0); string lexbuf ) +# 3760 "clex.ml" + + | 13 -> +# 274 "clex.mll" + ( fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside string literal" ) +# 3765 "clex.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_string_rec lexbuf __ocaml_lex_state + +and line lexbuf = + __ocaml_lex_line_rec lexbuf 264 +and __ocaml_lex_line_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 276 "clex.mll" + ( cline := parse_dec (Lexing.lexeme lexbuf) 0 - 1; line2 lexbuf ) +# 3777 "clex.ml" + + | 1 -> +# 277 "clex.mll" + ( count (Lexing.lexeme lexbuf); line lexbuf ) +# 3782 "clex.ml" + + | 2 -> +# 278 "clex.mll" + ( count (Lexing.lexeme lexbuf); ctoken lexbuf ) +# 3787 "clex.ml" + + | 3 -> +# 279 "clex.mll" + ( count (Lexing.lexeme lexbuf); Buffer.reset string_buf; + string lexbuf; + cfile := Buffer.contents string_buf; + ctoken lexbuf + ) +# 3796 "clex.ml" + + | 4 -> +# 284 "clex.mll" + ( fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside # directive" ) +# 3801 "clex.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_line_rec lexbuf __ocaml_lex_state + +and line2 lexbuf = + __ocaml_lex_line2_rec lexbuf 270 +and __ocaml_lex_line2_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 286 "clex.mll" + ( count (Lexing.lexeme lexbuf); line2 lexbuf ) +# 3813 "clex.ml" + + | 1 -> +# 287 "clex.mll" + ( count (Lexing.lexeme lexbuf); ctoken lexbuf ) +# 3818 "clex.ml" + + | 2 -> +# 288 "clex.mll" + ( count (Lexing.lexeme lexbuf); Buffer.reset string_buf; + string lexbuf; + cfile := Buffer.contents string_buf; + line3 lexbuf + ) +# 3827 "clex.ml" + + | 3 -> +# 293 "clex.mll" + ( fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside # directive" ) +# 3832 "clex.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_line2_rec lexbuf __ocaml_lex_state + +and line3 lexbuf = + __ocaml_lex_line3_rec lexbuf 275 +and __ocaml_lex_line3_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 295 "clex.mll" + ( count (Lexing.lexeme lexbuf); ctoken lexbuf ) +# 3844 "clex.ml" + + | 1 -> +# 296 "clex.mll" + ( count (Lexing.lexeme lexbuf); line3 lexbuf ) +# 3849 "clex.ml" + + | 2 -> +# 297 "clex.mll" + ( fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside # directive" ) +# 3854 "clex.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_line3_rec lexbuf __ocaml_lex_state + +;; + diff --git a/clex.mll b/clex.mll new file mode 100644 index 0000000..513ffbd --- /dev/null +++ b/clex.mll @@ -0,0 +1,297 @@ +{ + +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification (LSV), + * UMR 8643 CNRS & ENS Cachan. + * Written by Jean Goubault-Larrecq. Derived from the csur project. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + * +*) + +(* Analyse lexicale d'un sous-ensemble (tres) reduit de C. + *) + +open Cparse +open Error +open Ctab + +let string_buf = Buffer.create 256 + +let string_iter f s = (* = String.iter; pas present en OCaml 2.04. *) + let n = String.length s + in for i=0 to n-1 do f (s.[i]) done + +let count yytext = + (oldcline := !cline; oldccol := !ccol; + string_iter (fun c -> match c with + '\n' -> (cline := !cline+1; ccol := 0) + (* | '\t' -> (ccol := !ccol + 8 - (!ccol mod 8)) *) + | _ -> ccol := !ccol+1) yytext) + +let parse_hex yytext tend = + let n = ref 0 + in let len = String.length yytext-tend + in ((for i=2 to len-1 do + let c = yytext.[i] in + match c with + '0'..'9' -> n := 16 * !n + (int_of_char c - int_of_char '0') + | 'a'..'f' -> n := 16 * !n + (int_of_char c + 10 - int_of_char 'a') + | 'A'..'F' -> n := 16 * !n + (int_of_char c + 10 - int_of_char 'A') + | _ -> fatal (Some (!cfile, !cline, !ccol-len, !cline, !ccol)) + ("invalid hexadecimal number " ^ yytext) + done); + !n) + +let parse_oct yytext start tend = + let n = ref 0 + in let len = String.length yytext-tend + in ((for i=start to len-1 do + let c = yytext.[i] in + match c with + '0'..'7' -> n := 8 * !n + (int_of_char c - int_of_char '0') + | _ -> fatal (Some (!cfile, !cline, !ccol-len, !cline, !ccol)) + ("invalid octal number " ^ yytext) + done); + !n) + +let parse_dec yytext tend = + let n = ref 0 + in let len = String.length yytext-tend + in ((for i=0 to len-1 do + let c = yytext.[i] in + match c with + '0'..'9' -> n := 10 * !n + (int_of_char c - int_of_char '0') + | _ -> fatal (Some (!cfile, !cline, !ccol-len, !cline, !ccol)) + ("invalid number " ^ yytext) + done); + !n) + +} + +let digit = ['0'-'9'] +let letter = ['a'-'z' 'A'-'Z' '_'] +let hex = ['a'-'f' 'A'-'F' '0'-'9'] +let expo = ['E' 'e'] ['+' '-']? digit+ +let fs = ['f' 'F' 'l' 'L'] +let is = ['u' 'U' 'l' 'L']* + +rule ctoken = parse + "/*" { count (Lexing.lexeme lexbuf); comment lexbuf; ctoken lexbuf } + | "//" { count (Lexing.lexeme lexbuf); inlcomment lexbuf; ctoken lexbuf } + | "auto" { count (Lexing.lexeme lexbuf); AUTO } + | "break" { count (Lexing.lexeme lexbuf); BREAK } + | "case" { count (Lexing.lexeme lexbuf); CASE } + | "char" { count (Lexing.lexeme lexbuf); CHAR } + | "const" { count (Lexing.lexeme lexbuf); CONST } + | "continue" { count (Lexing.lexeme lexbuf); CONTINUE } + | "default" { count (Lexing.lexeme lexbuf); DEFAULT } + | "do" { count (Lexing.lexeme lexbuf); DO } + | "double" { count (Lexing.lexeme lexbuf); DOUBLE } + | "else" { count (Lexing.lexeme lexbuf); ELSE } + | "enum" { count (Lexing.lexeme lexbuf); ENUM } + | "extern" { count (Lexing.lexeme lexbuf); EXTERN } + | "float" { count (Lexing.lexeme lexbuf); FLOATING } + | "for" { count (Lexing.lexeme lexbuf); FOR } + | "goto" { count (Lexing.lexeme lexbuf); GOTO } + | "if" { count (Lexing.lexeme lexbuf); IF } + | "int" { count (Lexing.lexeme lexbuf); INTEGER } + | "long" { count (Lexing.lexeme lexbuf); LONG } + | "register" { count (Lexing.lexeme lexbuf); REGISTER } + | "return" { count (Lexing.lexeme lexbuf); RETURN } + | "short" { count (Lexing.lexeme lexbuf); SHORT } + | "signed" { count (Lexing.lexeme lexbuf); SIGNED } + | "sizeof" { count (Lexing.lexeme lexbuf); SIZEOF } + | "static" { count (Lexing.lexeme lexbuf); STATIC } + | "struct" { count (Lexing.lexeme lexbuf); STRUCT } + | "switch" { count (Lexing.lexeme lexbuf); SWITCH } + | "typedef" { count (Lexing.lexeme lexbuf); TYPEDEF } + | "union" { count (Lexing.lexeme lexbuf); UNION } + | "unsigned" { count (Lexing.lexeme lexbuf); UNSIGNED } + | "void" { count (Lexing.lexeme lexbuf); VOID } + | "volatile" { count (Lexing.lexeme lexbuf); VOLATILE } + | "while" { count (Lexing.lexeme lexbuf); WHILE } + | letter (letter | digit)* { count (Lexing.lexeme lexbuf); + let yytext = Lexing.lexeme lexbuf in + IDENTIFIER yytext + } + | '0' ['x' 'X'] hex+ { count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 0) } + | '0' ['x' 'X'] hex+ ['u' 'U'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 1) } + | '0' ['x' 'X'] hex+ ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 1) } + | '0' ['x' 'X'] hex+ ['u' 'U'] ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 2) } + + | '0' ['x' 'X'] hex+ ['u' 'U'] ['l' 'L'] ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_hex (Lexing.lexeme lexbuf) 3) } + + + | '0' ['0'-'7']+ { count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 0) } + | '0' ['0'-'7']+ ['u' 'U'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 1) } + | '0' ['0'-'7']+ ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 1) } + + | '0' ['0'-'7']+ ['u' 'U'] ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 2) } + + | '0' ['0'-'7']+ ['u' 'U'] ['l' 'L'] ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 1 3) } + + | digit+ { count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 0) } + | digit+ ['u' 'U'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 1) } + | digit+ ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 1) } + + | digit+ ['l' 'L' ] ['l' 'L' ] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 1) } + + | digit+ ['u' 'U'] ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 2) } + + | digit+ ['u' 'U'] ['l' 'L'] ['l' 'L'] { count (Lexing.lexeme lexbuf); + CONSTANT (parse_dec (Lexing.lexeme lexbuf) 3) } + + | '\'' [^ '\'' '\\'] '\'' { count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char (Lexing.lexeme_char lexbuf 1)) } + | '\'' '\\' ['0'-'7'] ['0'-'7']? ['0'-'7']? '\'' { count (Lexing.lexeme lexbuf); + CONSTANT (parse_oct (Lexing.lexeme lexbuf) 2 1) } + | '\'' '\\' 'a' '\'' { count (Lexing.lexeme lexbuf); + CONSTANT 7 (* bell, ^G *) } + | '\'' '\\' 'b' '\'' { count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\b') } + | '\'' '\\' 'f' '\'' { count (Lexing.lexeme lexbuf); + CONSTANT 12 (* form feed, ^L *) } + | '\'' '\\' 'n' '\'' { count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\n') } + | '\'' '\\' 'r' '\'' { count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\r') } + | '\'' '\\' 't' '\'' { count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char '\t') + (* bell, ^G *) } + | '\'' '\\' 'v' '\'' { count (Lexing.lexeme lexbuf); + CONSTANT 11 (* vertical tab, ^K *) } + | '\'' '\\' _ '\'' { count (Lexing.lexeme lexbuf); + CONSTANT (int_of_char (Lexing.lexeme_char lexbuf 2)) } + | "\"" + { + count (Lexing.lexeme lexbuf); Buffer.reset string_buf; + string lexbuf; + STRING_LITERAL (Buffer.contents string_buf) + } + | "..." { count (Lexing.lexeme lexbuf); ELLIPSIS } + | ">>=" { count (Lexing.lexeme lexbuf); RIGHT_ASSIGN } + | "<<=" { count (Lexing.lexeme lexbuf); LEFT_ASSIGN } + | "+=" { count (Lexing.lexeme lexbuf); ADD_ASSIGN } + | "-=" { count (Lexing.lexeme lexbuf); SUB_ASSIGN } + | "*=" { count (Lexing.lexeme lexbuf); MUL_ASSIGN } + | "/=" { count (Lexing.lexeme lexbuf); DIV_ASSIGN } + | "%=" { count (Lexing.lexeme lexbuf); MOD_ASSIGN } + | "&=" { count (Lexing.lexeme lexbuf); AND_ASSIGN } + | "^=" { count (Lexing.lexeme lexbuf); XOR_ASSIGN } + | "|=" { count (Lexing.lexeme lexbuf); OR_ASSIGN } + | ">>" { count (Lexing.lexeme lexbuf); RIGHT_OP } + | "<<" { count (Lexing.lexeme lexbuf); LEFT_OP } + | "++" { count (Lexing.lexeme lexbuf); INC_OP } + | "--" { count (Lexing.lexeme lexbuf); DEC_OP } + | "->" { count (Lexing.lexeme lexbuf); PTR_OP } + | "&&" { count (Lexing.lexeme lexbuf); AND_OP } + | "||" { count (Lexing.lexeme lexbuf); OR_OP } + | "<=" { count (Lexing.lexeme lexbuf); LE_OP } + | ">=" { count (Lexing.lexeme lexbuf); GE_OP } + | "==" { count (Lexing.lexeme lexbuf); EQ_OP } + | "!=" { count (Lexing.lexeme lexbuf); NE_OP } + | ";" { count (Lexing.lexeme lexbuf); SEMI_CHR } + | ("{" | "<%") { count (Lexing.lexeme lexbuf); OPEN_BRACE_CHR } + | ("}" | "%>") { count (Lexing.lexeme lexbuf); CLOSE_BRACE_CHR } + | "," { count (Lexing.lexeme lexbuf); COMMA_CHR } + | ":" { count (Lexing.lexeme lexbuf); COLON_CHR } + | "=" { count (Lexing.lexeme lexbuf); EQ_CHR } + | "(" { count (Lexing.lexeme lexbuf); OPEN_PAREN_CHR } + | ")" { count (Lexing.lexeme lexbuf); CLOSE_PAREN_CHR } + | ("[" | "<:") { count (Lexing.lexeme lexbuf); OPEN_BRACKET_CHR } + | ("]" | ":>") { count (Lexing.lexeme lexbuf); CLOSE_BRACKET_CHR } + | "." { count (Lexing.lexeme lexbuf); DOT_CHR } + | "&" { count (Lexing.lexeme lexbuf); AND_CHR } + | "|" { count (Lexing.lexeme lexbuf); OR_CHR } + | "^" { count (Lexing.lexeme lexbuf); XOR_CHR } + | "!" { count (Lexing.lexeme lexbuf); BANG_CHR } + | "~" { count (Lexing.lexeme lexbuf); TILDE_CHR } + | "+" { count (Lexing.lexeme lexbuf); ADD_CHR } + | "-" { count (Lexing.lexeme lexbuf); SUB_CHR } + | "*" { count (Lexing.lexeme lexbuf); STAR_CHR } + | "/" { count (Lexing.lexeme lexbuf); DIV_CHR } + | "%" { count (Lexing.lexeme lexbuf); MOD_CHR } + | "<" { count (Lexing.lexeme lexbuf); OPEN_ANGLE_CHR } + | ">" { count (Lexing.lexeme lexbuf); CLOSE_ANGLE_CHR } + | "?" { count (Lexing.lexeme lexbuf); QUES_CHR } + | '#' { count (Lexing.lexeme lexbuf); line lexbuf } + | [' ' '\t' '\012' '\013' '\n' '\014']+ { count (Lexing.lexeme lexbuf); ctoken lexbuf } + | _ { fatal (Some (!cfile, !cline, !ccol, !cline, !ccol+1)) + ("bad character '" ^ (Lexing.lexeme lexbuf) ^ "'") } + | eof { EOF } +and comment = parse + "*/" { count (Lexing.lexeme lexbuf) } + | [^ '*']* { count (Lexing.lexeme lexbuf); comment lexbuf } + | eof { fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside comment" } +and inlcomment = parse + "\n" { count (Lexing.lexeme lexbuf) } + | [^ '\n']* { count (Lexing.lexeme lexbuf); inlcomment lexbuf } +and string = parse + '"' { () } + | '\n'+ { string lexbuf } + | '\\' ['0'-'7'] ['0'-'7']? ['0'-'7']? { Buffer.add_char string_buf (Char.chr (parse_oct (Lexing.lexeme lexbuf) 1 0)); string lexbuf } + | '\\' 'a' { Buffer.add_char string_buf '\007'; string lexbuf } + | '\\' 'b' { Buffer.add_char string_buf '\b'; string lexbuf } + | '\\' 'f' { Buffer.add_char string_buf '\014'; string lexbuf } + | '\\' 'n' { Buffer.add_char string_buf '\n'; string lexbuf } + | '\\' 'r' { Buffer.add_char string_buf '\r'; string lexbuf } + | '\\' 't' { Buffer.add_char string_buf '\t'; string lexbuf } + | '\\' 'v' { Buffer.add_char string_buf '\013'; string lexbuf } + | '\\' _ { Buffer.add_char string_buf (Lexing.lexeme_char lexbuf 1); string lexbuf } + | [^ '\\' '\n' '"']+ { Buffer.add_string string_buf (Lexing.lexeme lexbuf); string lexbuf } + | _ { Buffer.add_char string_buf (Lexing.lexeme_char lexbuf 0); string lexbuf } + | eof { fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside string literal" } +and line = parse + ['0'-'9']+ { cline := parse_dec (Lexing.lexeme lexbuf) 0 - 1; line2 lexbuf } + | [' ' '\t']+ { count (Lexing.lexeme lexbuf); line lexbuf } + | '\n' { count (Lexing.lexeme lexbuf); ctoken lexbuf } + | "\"" { count (Lexing.lexeme lexbuf); Buffer.reset string_buf; + string lexbuf; + cfile := Buffer.contents string_buf; + ctoken lexbuf + } + | eof { fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside # directive" } +and line2 = parse + [' ' '\t']+ { count (Lexing.lexeme lexbuf); line2 lexbuf } + | '\n' { count (Lexing.lexeme lexbuf); ctoken lexbuf } + | "\"" { count (Lexing.lexeme lexbuf); Buffer.reset string_buf; + string lexbuf; + cfile := Buffer.contents string_buf; + line3 lexbuf + } + | eof { fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside # directive" } +and line3 = parse + '\n' { count (Lexing.lexeme lexbuf); ctoken lexbuf } + | _ { count (Lexing.lexeme lexbuf); line3 lexbuf } + | eof { fatal (Some (!cfile, !cline, !ccol, !cline, !ccol)) "end of file reached inside # directive" } diff --git a/compile.cmi b/compile.cmi new file mode 100644 index 0000000000000000000000000000000000000000..21c837fbb13447df85fbd7e5b0cd951b5012d073 GIT binary patch literal 425 zcmZ=x%*`>hw6ydzFf?zOx@;c<1H&O8)&b&~K-|AT-8nzEATuX*!GaBp%pcX0Av}iz z8xAUL*t~JV1_!Nx)S|M);>@ztVn^-#(vtY(jKsXW)EtKY4ig-hSie4GVEDP=APe_~ z%@a0ws^nxAmpCkd=u~qqNGvK&b<{6QEQ(J_P0mRyN-W9D&qLDr3vR}5kbXCn(!9(P z2e{xLs0Dwa^go9U2h`&8^7B&T9UU0{voJY2I6!?h59k|7AdUuNuLW>#O)zNqvu@tJ z4ab%Jbv&iMwtqjqU;&bkCK&KCMnx%_rOxJkVz{qf)OFv21*)z^MfpV&4CLoeY4-V< zdoB6{fxfm=WkwIB);}i({n# literal 0 HcmV?d00001 diff --git a/compile.cmo b/compile.cmo new file mode 100644 index 0000000000000000000000000000000000000000..b3f0dda96dd4d03cc78cb2030949f8df5ee2341b GIT binary patch literal 74951 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 W3ucdBWj4HvI8)Sb#g5iLto%Py`}x-Z literal 0 HcmV?d00001 diff --git a/compile.ml b/compile.ml new file mode 100644 index 0000000..37bc503 --- /dev/null +++ b/compile.ml @@ -0,0 +1,399 @@ +open Cparse +open Genlab + +let number_str s strings = + let rec aux n l = match l with + | [] -> n, [s] + | s' :: l' when s' = s -> n, l + | s' :: l' -> let n', l = aux (n + 1) l' in n', s' :: l + in aux 0 strings;; + + +(* Un dictionnaire est soit vide, soit un couple (clé, valeur) suivi de la suite du dictionnaire *) +type ('a, 'b) dict = NIL | D of 'a * 'b * ('a, 'b) dict;; + +let new_dict = NIL;; + +type env = Env of int * string list * string list * bool * bool * int * (string, int) dict * string list;; (* jumpcount, strings, string count, global variables, declaring parameters, in_function, variables dictionary, functions that return a 64bit output *) + +(* On recherche si une clé est présente dans le dictionnaire. Renvoie un booléen. *) +let rec contains d key = match d with + | NIL -> false + | D(k, _, _) when k = key -> true + | D(_, _, d') -> contains d' key;; + +(* On récupère, si elle existe, la valeur associée à une clé dans un dictionnaire. Si ce n'est pas possible, on renvoie une erreur. Cas d'erreur : utilisation d'une variable locale non déclarée. *) +let rec search d key = match d with + | NIL -> failwith ("Var " ^ key ^ " not found") + | D(k, v, _) when k = key -> v + | D(_, _, d') -> search d' key;; + +(* On ajoute un couple (clé, valeur) dans un dictionnaire, et si la clé existe déjà, on se contente de remplacer la valeur. *) +let rec append d key value = match d with + | NIL -> D(key, value, NIL) + | D(k, v, d') when k = key -> D(key, value, d') + | D(k, v, d') -> D(k, v, (append d' key value));; + +(* Tableau des registres d'arguments utiles lors d'un appel de fonction, trié dans l'ordre. *) +let args = [|"%rdi"; "%rsi"; "%rdx"; "%rcx"; "%r8"; "%r9"|];; + +(* Tableau des fonctions systèmes disposant d'un retour sur 64 bits. *) +let system_funs_64 = [|"malloc"; "calloc"; "realloc"; "exit"; "fopen"|];; + +(* Récupère le nom en assembleur d'une variable. Si la variable est déclarée, alors on renvoie -8n(%rbp) où n est le numéro de la variable, sinon on renvoie s(%rip) où s est le nom de la variable, en supposant que s est une variable globale préalablement déclarée (peut être une variable sytème comme stdout ou stderr *) +let get_name_var vars key = + if contains vars key then (string_of_int (8 * (search vars key)) ^ "(%rbp)") else key ^ "(%rip)";; + +(* Écris le code assembleur d'une fonction. Se référer au README pour plus de détails. *) +let compile out decl_list = + Printf.fprintf out ".section\t.text\n\t\t.global main\n\n"; + (* Évalue une expression dans un certain environement. Le résultat de l'évaluation est placé dans %rax. On renvoie le nouvel environnement. *) + let rec evaluate e env = match env with Env(loopcount, strings, globals, decl_params, in_function, var_count, vars, funs) -> match e with + | VAR(s) -> begin + Printf.fprintf out "\t\tMOVQ\t\t%s,\t%%rax\t\t# %s\n" (get_name_var vars s) s; + env + end + | CST(i) -> begin + Printf.fprintf out "\t\tMOVQ\t\t$%d,\t\t%%rax\n" i; + env + end + | STRING(s) -> begin + let n, l = number_str s strings in + Printf.fprintf out "\t\tMOVQ\t\t$.str%d,\t\t%%rax\n" n; + Env(loopcount, l, globals, decl_params, in_function, var_count, vars, funs) + end; + | SET_VAR(s, e) -> begin + let new_env = evaluate (e_of_expr e) env in + Printf.fprintf out "\t\tMOVQ\t\t%%rax,\t\t%s\n" (get_name_var vars s); + new_env + end + | SET_ARRAY(s, e1, e2) -> begin + let new_env = evaluate (e_of_expr e1) env in + Printf.fprintf out "\t\tPUSHQ\t\t%%rax\n"; + let new_new_env = evaluate (e_of_expr e2) new_env in + Printf.fprintf out "\t\tPOPQ\t\t%%rbx\n"; + Printf.fprintf out "\t\tMOVQ\t\t%s,\t%%rdx\n" (get_name_var vars s); + Printf.fprintf out "\t\tLEAQ\t\t0(, %%rbx, 8),\t%%rbx\n"; + Printf.fprintf out "\t\tADDQ\t\t%%rbx,\t\t%%rdx\n"; + Printf.fprintf out "\t\tMOVQ\t\t%%rax,\t\t(%%rdx)\n"; + new_new_env + end + | CALL(s, l) -> begin + let rec empile_args env i = function + | [] -> env + | e :: l' -> begin + let new_env = empile_args env (i + 1) l' in + let new_new_env = evaluate (e_of_expr e) new_env in + Printf.fprintf out "\t\tPUSHQ\t\t%%rax\n"; + new_new_env + end + in let rec depile_args env i = function + | [] -> env + | e :: l' -> if i >= 6 then env else begin + Printf.fprintf out "\t\tPOPQ\t\t%s\n" args.(i); + depile_args env (i + 1) l' + end + in let newenv = empile_args env 0 l in + let new_env = depile_args newenv 0 l in + Printf.fprintf out "\t\tMOVQ\t\t$0,\t\t%%rax\n"; + Printf.fprintf out "\t\tCALLQ\t\t%s\n" s; + for i = 0 to (List.length l) - 7 do + Printf.fprintf out "\t\tPOPQ\t\t%%rbx\n"; + done; + if not (List.mem s funs) then + Printf.fprintf out "\t\tCLTQ\n"; + new_env + end + | OP1(mop, e) -> (match mop with + | M_MINUS -> begin + let new_env = evaluate (e_of_expr e) env in + Printf.fprintf out "\t\tNEGQ\t\t%%rax\n"; + new_env + end + | M_NOT -> begin + let new_env = evaluate (e_of_expr e) env in + Printf.fprintf out "\t\tNOTQ\t\t%%rax\n"; + new_env + end + | M_POST_INC -> begin + let new_env = evaluate (e_of_expr e) env in + (match (e_of_expr e) with + | VAR(s) -> begin + Printf.fprintf out "\t\tINCQ\t\t%s\n" (get_name_var vars s); + new_env + end + | OP2(S_INDEX, e1, e2) -> (match (e_of_expr e1) with + | VAR(s) -> begin + Printf.fprintf out "\t\tPUSHQ\t\t%%rax\n"; + let new_new_env = evaluate (e_of_expr e2) env in + Printf.fprintf out "\t\tMOVQ\t\t%s,\t%%rdx\n" (get_name_var vars s); + Printf.fprintf out "\t\tLEAQ\t\t0(, %%rax, 8),\t%%rax\n"; + Printf.fprintf out "\t\tADDQ\t\t%%rax,\t\t%%rdx\n"; + Printf.fprintf out "\t\tINCQ\t\t(%%rdx)\n"; + Printf.fprintf out "\t\tPOPQ\t\t%%rax\n"; + new_new_env + end + | _ -> new_env) + | _ -> new_env) + end + | M_POST_DEC -> begin + let new_env = evaluate (e_of_expr e) env in + match (e_of_expr e) with + | VAR(s) -> begin + Printf.fprintf out "\t\tDECQ\t\t%s\n" (get_name_var vars s); + new_env + end + | OP2(S_INDEX, e1, e2) -> (match (e_of_expr e1) with + | VAR(s) -> begin + Printf.fprintf out "\t\tPUSHQ\t\t%%rax\n"; + let new_new_env = evaluate (e_of_expr e2) env in + Printf.fprintf out "\t\tMOVQ\t\t%s,\t%%rdx\n" (get_name_var vars s); + Printf.fprintf out "\t\tLEAQ\t\t0(, %%rax, 8),\t%%rax\n"; + Printf.fprintf out "\t\tADDQ\t\t%%rax,\t\t%%rdx\n"; + Printf.fprintf out "\t\tDECQ\t\t(%%rdx)\n"; + Printf.fprintf out "\t\tPOPQ\t\t%%rax\n"; + new_new_env + end + | _ -> new_env) + | _ -> new_env + end + | M_PRE_INC -> begin + let new_env = (match (e_of_expr e) with + | VAR(s) -> begin + Printf.fprintf out "\t\tINCQ\t\t%s\n" (get_name_var vars s); + env + end + | OP2(S_INDEX, e1, e2) -> (match (e_of_expr e1) with + | VAR(s) -> begin + let new_new_env = evaluate (e_of_expr e2) env in + Printf.fprintf out "\t\tMOVQ\t\t%s,\t%%rdx\n" (get_name_var vars s); + Printf.fprintf out "\t\tLEAQ\t\t0(, %%rax, 8),\t%%rax\n"; + Printf.fprintf out "\t\tADDQ\t\t%%rax,\t\t%%rdx\n"; + Printf.fprintf out "\t\tINCQ\t\t(%%rdx)\n"; + Printf.fprintf out "\t\tMOVQ\t\t(%%rdx),\t\t%%rax\n"; + new_new_env + end + | _ -> env); + | _ -> env) in + evaluate (e_of_expr e) new_env + end + | M_PRE_DEC -> begin + let new_env = (match (e_of_expr e) with + | VAR(s) -> begin + Printf.fprintf out "\t\tDECQ\t\t%s\n" (get_name_var vars s); + env + end + | OP2(S_INDEX, e1, e2) -> (match (e_of_expr e1) with + | VAR(s) -> begin + let new_new_env = evaluate (e_of_expr e2) env in + Printf.fprintf out "\t\tMOVQ\t\t%s,\t%%rdx\n" (get_name_var vars s); + Printf.fprintf out "\t\tLEAQ\t\t0(, %%rax, 8),\t%%rax\n"; + Printf.fprintf out "\t\tADDQ\t\t%%rax,\t\t%%rdx\n"; + Printf.fprintf out "\t\tDECQ\t\t(%%rdx)\n"; + Printf.fprintf out "\t\tMOVQ\t\t(%%rdx),\t\t%%rax\n"; + new_new_env + end + | _ -> env); + | _ -> env) in + evaluate (e_of_expr e) new_env + end) + | OP2(bop, e1, e2) -> begin + let new_env = evaluate (e_of_expr e2) env in + Printf.fprintf out "\t\tPUSHQ\t\t%%rax\n"; + let new_new_env = evaluate (e_of_expr e1) new_env in match new_new_env with Env(loopcount, strings, _, _, _, _, _, _) -> + Printf.fprintf out "\t\tPOPQ\t\t%%rbx\n"; + (match bop with + | S_MUL -> begin + Printf.fprintf out "\t\tIMULQ\t\t%%rbx,\t\t%%rax\n"; + new_new_env + end + | S_DIV -> begin + Printf.fprintf out "\t\tCQO\n"; + Printf.fprintf out "\t\tIDIVQ\t\t%%rbx\n"; + Printf.fprintf out "\t\tMOVQ\t\t$0,\t\t%%rdx\n"; + Env(loopcount + 2, strings, globals, decl_params, in_function, var_count, vars, funs) + end + | S_MOD -> begin + Printf.fprintf out "\t\tCQO\n"; + Printf.fprintf out "\t\tIDIVQ\t\t%%rbx\n"; + Printf.fprintf out "\t\tMOVQ\t\t%%rdx,\t\t%%rax\n"; + Printf.fprintf out "\t\tMOVQ\t\t$0,\t\t%%rdx\n"; + Env(loopcount + 2, strings, globals, decl_params, in_function, var_count, vars, funs) + end + | S_ADD -> begin + Printf.fprintf out "\t\tADDQ\t\t%%rbx,\t\t%%rax\n"; + new_new_env + end + | S_SUB -> begin + Printf.fprintf out "\t\tSUBQ\t\t%%rbx,\t\t%%rax\n"; + new_new_env + end + | S_INDEX -> begin + Printf.fprintf out "\t\tLEAQ\t\t0(,%%rbx,8),\t%%rbx\n"; + Printf.fprintf out "\t\tADDQ\t\t%%rbx,\t\t%%rax\n"; + Printf.fprintf out "\t\tMOVQ\t\t(%%rax),\t\t%%rax\n"; + new_new_env + end) + end + | CMP(cop, e1, e2) -> begin + let new_env = evaluate (e_of_expr e1) env in + Printf.fprintf out "\t\tPUSHQ\t\t%%rax\n"; + let new_new_env = evaluate (e_of_expr e2) new_env in match new_new_env with Env(loopcount, strings, _, _, _, _, _, _) -> + Printf.fprintf out "\t\tPOPQ\t\t%%rbx\n"; + Printf.fprintf out "\t\tCMPQ\t\t%%rax,\t\t%%rbx\n"; + (match cop with + | C_LT -> Printf.fprintf out "\t\tJL\t\t"; + | C_LE -> Printf.fprintf out "\t\tJLE\t\t"; + | C_EQ -> Printf.fprintf out "\t\tJE\t\t";); + Printf.fprintf out ".destjump%d\n" (loopcount + 1); + Printf.fprintf out "\t\tMOVQ\t\t$0,\t\t%%rax\n"; + Printf.fprintf out "\t\tJMP\t\t.destjump%d\n" (loopcount + 2); + Printf.fprintf out "\t.destjump%d:\n" (loopcount + 1); + Printf.fprintf out "\t\tMOVQ\t\t$1,\t\t%%rax\n"; + Printf.fprintf out "\t.destjump%d:\n" (loopcount + 2); + Env(loopcount + 2, strings, globals, decl_params, in_function, var_count, vars, funs) + end + | EIF(e1, e2, e3) -> begin + let new_env = evaluate (e_of_expr e1) env in match new_env with Env(loopcount, strings, _, _, _, _, _, _) -> + Printf.fprintf out "\t\tCMPQ\t\t$0,\t\t%%rax\n"; + let x = (loopcount + 1) in + Printf.fprintf out "\t\tJE\t\t.destjump%d\n" x; + let new_new_env = evaluate (e_of_expr e2) (Env(loopcount + 1, strings, globals, decl_params, in_function, var_count, vars, funs)) in match new_new_env with Env(loopcount2, strings2, _, _, _, _, _, _) -> + let y = (loopcount2 + 1) in + Printf.fprintf out "\t\tJMP\t\t.destjump%d\n" y; + Printf.fprintf out "\t.destjump%d:\n" x; + let new_new_env = evaluate (e_of_expr e3) (Env(loopcount2 + 1, strings2, globals, decl_params, in_function, var_count, vars, funs)) in + Printf.fprintf out "\t.destjump%d:\n" y; + new_new_env + end + | ESEQ(l) -> begin + let rec aux env l = match l with + | [] -> env + | e :: l' -> aux (evaluate (e_of_expr e) env) l' + in aux env l + end + (* Déclare une liste de variables ou de fonctions, en mettant bien à jour l'environnement. *) + in let rec compile_decl_list env = function + | [] -> env + | h :: t -> let new_env = compile_decl env h in compile_decl_list new_env t + (* Compte la place nécessaire pour les variables au sein d'un bloc de code. *) + and count_vars (_, c) = match c with + | CBLOCK(vdl, lcl) -> let vars = (List.length vdl) in + let rec aux lcl = match lcl with + | [] -> 0, 0 + | c :: l -> let v, p = count_vars c in let v2, p2 = aux l in (v + v2), (max p p2) + in let v, p = aux lcl in (v + vars), p + | CIF(_, c1, c2) -> let i1, j1 = (count_vars c1) in let i2, j2 = (count_vars c2) in (max i1 i2), (max j1 j2) + | CEXPR(_) -> 0, 0 + | CWHILE(_, c) -> count_vars c + | CRETURN(_) -> 0, 0 + (* Déclare une variable locale en distingant si c'est un paramètre ou non, ou une fonction. *) + and compile_decl env decl = match env with Env(loopcount, strings, globals, decl_params, in_function, var_count, vars, funs) -> match decl with + | CDECL(l, s) -> begin + if decl_params then begin + if var_count < 6 then begin + Printf.fprintf out "\t\tMOVQ\t\t%s,\t\t%d(%%rbp)\t# %s\n" args.(var_count) (-8 * (var_count + 1)) s; + Env(loopcount, strings, globals, decl_params, in_function, var_count + 1, (append vars s (-(var_count + 1))), funs) + end + else begin + Printf.fprintf out "\t\tMOVQ\t\t%d(%%rbp),\t%%rax\n" (8 * (var_count - 4)); + Printf.fprintf out "\t\tMOVQ\t\t%%rax,\t\t%d(%%rbp)\t# %s\n" (-8 * (var_count + 1)) s; + Env(loopcount, strings, globals, decl_params, in_function, var_count + 1, (append vars s (-(var_count + 1))), funs) + end + end + else begin + if in_function then begin + Env(loopcount, strings, globals, decl_params, in_function, var_count + 1, (append vars s (-(var_count + 1))), funs) + end + else begin + Env(loopcount, strings, (s :: globals), decl_params, in_function, var_count, vars, funs) + end + end + end + | CFUN (l, s, vdl, lc) -> begin + Printf.fprintf out "\n%s:\n" s; + let nb_decl = List.length vdl in + let total_vars, max_params = count_vars lc in + let size = total_vars + nb_decl + max_params in + let real_size = size + (size mod 2) in + Printf.fprintf out "\t\tENTERQ\t\t$%d,\t\t$0\n" (8 * real_size); + let new_env = compile_decl_list (Env(loopcount, strings, globals, true, true, 0, new_dict, funs)) vdl in match new_env with Env(_, _, _, _, _, var_count, vars, _) -> + let new_new_env = compile_code lc (Env(loopcount, strings, globals, false, true, var_count, vars, funs)) in match new_new_env with Env(loopcount2, strings2, globals2, _, _, var_count2, vars2, _) -> + Printf.fprintf out "\t\tLEAVEQ\n"; + Printf.fprintf out "\t\tRETQ\n"; + Env(loopcount2, strings2, globals2, false, false, var_count2, vars2, funs) + end + (* Écris le code assembleur d'un bout de code. *) + and compile_code (_, c) env = match env with Env(loopcount, strings, globals, decl_params, in_function, var_count, vars, funs) -> match c with + | CBLOCK(vdl, lcl) -> begin + let new_env = compile_decl_list env vdl in + let rec aux lcl env = match lcl with + | [] -> env + | c :: l -> let new_env = (compile_code c env) in aux l new_env + in let new_env = aux lcl new_env in match new_env with Env(loopcount2, strings2, globals2, _, _, _, _, _) -> + Env(loopcount2, strings2, globals2, decl_params, in_function, var_count, vars, funs) + end + | CEXPR(expr) -> begin + evaluate (e_of_expr expr) env + end + | CIF(expr, c1, c2) -> begin + let new_env = evaluate (e_of_expr expr) env in + match new_env with Env(loopcount2, strings2, _, _, _, _, _, _) -> + let x = (loopcount2 + 1) in + Printf.fprintf out "\t\tCMPQ\t\t$0,\t\t%%rax\n"; + Printf.fprintf out "\t\tJE\t\t.destjump%d\n" x; + let new_new_env = compile_code c1 (Env(loopcount2 + 1, strings2, globals, decl_params, in_function, var_count, vars, funs)) in + match new_new_env with Env(loopcount3, strings3, _, _, _, _, _, _) -> + let y = (loopcount3 + 1) in + Printf.fprintf out "\t\tJMP\t\t.destjump%d\n" y; + Printf.fprintf out "\t.destjump%d:\n" x; + let new_new_new_env = compile_code c2 (Env(loopcount3 + 1, strings3, globals, decl_params, in_function, var_count, vars, funs)) in + Printf.fprintf out "\t.destjump%d:\n" y; + new_new_new_env + end + | CWHILE(expr, c) -> begin + let x = (loopcount + 1) in + Printf.fprintf out "\t.whileloop%d:\n" x; + let new_env = evaluate (e_of_expr expr) (Env(loopcount + 1, strings, globals, decl_params, in_function, var_count, vars, funs)) in + Printf.fprintf out "\t\tCMPQ\t\t$0,\t\t%%rax\n"; + Printf.fprintf out "\t\tJE\t\t.endloop%d\n" x; + let new_new_env = compile_code c new_env in + Printf.fprintf out "\t\tJMP\t\t.whileloop%d\n" x; + Printf.fprintf out "\t.endloop%d:\n" x; + new_new_env + end + | CRETURN(o) -> begin + let new_env = match o with + | Some(e) -> evaluate (e_of_expr e) env + | None -> env + in Printf.fprintf out "\t\tLEAVEQ\n"; + Printf.fprintf out "\t\tRETQ\n"; + new_env + end + (* Récupère la liste des fonctions déclarées, afin de gérer quelles fonctions renvoient un entier sur 64 bits ou 32 bits. *) + in let rec get_functions = function + | [] -> [] + | CFUN(_, s, _, _) :: l -> s :: get_functions l + | _ :: l -> get_functions l + (* Compile le code. *) + in let final_env = compile_decl_list (Env(0, [], [], false, false, 0, new_dict, (Array.to_list system_funs_64) @ (get_functions decl_list))) decl_list in match final_env with Env(_, strings, globals, _, _, _, _, _) -> + (* Déclare les chaînes de caractères présentes. *) + Printf.fprintf out "\n.section\t.data\n"; + let rec add_string_globals n = function + | [] -> (); + | s :: l' -> begin + Printf.fprintf out ".str%d:\n" n; + Printf.fprintf out "\t\t.string\t\t\"%s\"\n" (String.escaped s); + Printf.fprintf out "\t\t.text\n"; + add_string_globals (n + 1) l'; + end + in add_string_globals 0 strings; + (* Déclare les variables globales présentes. *) + let rec add_int_globals = function + | [] -> () + | s :: l -> begin + add_int_globals l; + Printf.fprintf out ".comm\t\t%s,\t\t8,\t\t8\n" s; + end + in add_int_globals globals;; + diff --git a/compile.mli b/compile.mli new file mode 100644 index 0000000..c317531 --- /dev/null +++ b/compile.mli @@ -0,0 +1,25 @@ + +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification (LSV), + * CNRS UMR 8643 & ENS Cachan. + * Written by Jean Goubault-Larrecq. Not derived from licensed software. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + *) + +val compile : out_channel -> Cparse.var_declaration list -> unit;; diff --git a/cparse.cmi b/cparse.cmi new file mode 100644 index 0000000000000000000000000000000000000000..4dfe4b05461400aca41d519a05da346c65177759 GIT binary patch literal 2562 zcma)8Yitx%6rQcK6vSeXM@@)m-PzqfENqRuBEdVIPU~W~TX(yNm^fLMDXeaH>U1S) zj4y~GG0~OBA5CE558@9^wxOtq*5X?f0UxL+3JSg-yb2Tw^_+WWPm3f-liA+y-0%C& znYriA9WB|BshcxrPB>IIYvsC)y^=I$mL!$Tl%&$#aIJ9yT4&PkGM(;%N3IBTSXsmB zWTPcXkr;c{*;Vjdb|e@vBH@-qoH17D3m91|YZ@w(hU5~JamG=9#Au1O!Mt25BFCyD zMr$9cb>urXcQl3hbQ&@rAK=>p`o)(hPRVYzoG4)RFTSKH1n5K+iKf>_@kAuZ} zVKGM0)aGWczM1BaVah^S$)vk-e9A{tM`&~uOuB{1<-TYu^aR$qjph$y&N_ns0KHex z#{&IEL4TR%|3>;ef`1{bC-^6*cMA0tJ}uHJ)DF%6f%GWB-x00{Woaxr3~pZ_L2-^F%!#lgr8bZHy&Ti3l(Ip2A&yD`7R4D<0B z{%2=S3~2SuQSCOq5-;H`Orw&&rqMSz(StuBitVA%S7^Ritm`DdrY~&edtKf~j4zRK zk6=vpX>QvbqWLe-S||89!Z5+lQ2mflmj|>vZVkh04k`Ua*^Mwka2G0`6pE{ZT1;g`IJUGQM|6W8tdSpIk0Y3{!}KNHCdl%i|SU>UY_hqFE_hX zpKZ2FL)>pVxqL#S9bmVSag%B#m9jG2Lmn@Wb47EBx}8QJgJ_cw)l^!UCBw<(sqz$8 zIQ)n{B;iLO>=VKpf+(bfHFBk^TR`mhY4ic;b_iXqKh>Vjh+CCs%QIZn@D_cSRPTXm zuTV`3EH!g*WWe2RyAFH3QMo^x9`Oo)gC8(n&k9m+t6dy&P?D@%!uj@^Q^@BllH#y?)pgzSe=ma9UE)^eExAUd z4^^4xCD*Xoo}VJ}p{GV|*giF~X7c7$hZ51*Ta{u}9;k-?*uR)N Bp??4X literal 0 HcmV?d00001 diff --git a/cparse.cmo b/cparse.cmo new file mode 100644 index 0000000000000000000000000000000000000000..20951db757e4ef91019391d94fefd22f14f246c1 GIT binary patch literal 27472 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 LLP;Oc!aM&Lp1^?N literal 0 HcmV?d00001 diff --git a/cparse.ml b/cparse.ml new file mode 100644 index 0000000..a1cd9e3 --- /dev/null +++ b/cparse.ml @@ -0,0 +1,271 @@ +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification (LSV), + * UMR 8643 CNRS & ENS Cachan. + * Written by Jean Goubault-Larrecq. Not derived from licensed software. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the consequences + * of use of this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + * + *) + +open Error + +type mon_op = M_MINUS | M_NOT | M_POST_INC | M_POST_DEC | M_PRE_INC | M_PRE_DEC + (* Les opérations unaires: + M_MINUS: calcule l'opposé -e de e; + M_NOT: calcule la négation logique ~e de e; + M_POST_INC: post-incrémentation e++; + M_POST_DEC: post-décrémentation e--; + M_PRE_INC: pré-incrémentation ++e; + M_PRE_DEC: pré-décrémentation --e. + *) +type bin_op = S_MUL | S_DIV | S_MOD | S_ADD | S_SUB | S_INDEX + (* Les opérations binaires: + S_MUL: multiplication entière; + S_DIV: division entière (quotient); + S_MOD: division entière (reste); + S_ADD: addition entière; + S_SUB: soustraction entière; + S_INDEX: accès à un élément de tableau a[i]. + *) +type cmp_op = C_LT | C_LE | C_EQ + (* Les opérations de comparaison: + C_LT (less than): <; + C_LE (less than or equal to): <=; + C_EQ (equal): ==. + *) + +type loc_expr = locator * expr +and expr = VAR of string (* une variable --- toujours de type int. *) + | CST of int (* une constante entiere. *) + | STRING of string (* une constante chaine. *) + | SET_VAR of string * loc_expr (* affectation x=e. *) + | SET_ARRAY of string * loc_expr * loc_expr (* affectation x[e]=e'. *) + | CALL of string * loc_expr list (* appel de fonction f(e1,...,en) *) + (* operations arithmetiques: *) + | OP1 of mon_op * loc_expr (* OP1(mop, e) dénote -e, ~e, e++, e--, ++e, ou --e. *) + | OP2 of bin_op * loc_expr * loc_expr (* OP2(bop,e,e') dénote e*e', e/e', e%e', + e+e', e-e', ou e[e']. *) + | CMP of cmp_op * loc_expr * loc_expr (* CMP(cop,e,e') vaut ef *) +let dot_prec = 15 (* a.f *) +let bang_prec = 14 (* !a *) +let tilde_prec = 14 (* ~a *) +let incdec_prec = 14 (* ++a, a++, --a, a-- *) +let cast_prec = 14 (* (T)a *) +let sizeof_prec = 14 (* sizeof T *) +let uplus_prec = 14 (* +a *) +let uminus_prec = 14 (* -a *) +let star_prec = 14 (* *a *) +let amper_prec = 14 (* &a *) +let mul_prec = 13 (* a*b *) +let div_prec = 13 (* a/b *) +let mod_prec = 13 (* a%b *) +let add_prec = 12 (* a+b *) +let sub_prec = 12 (* a-b *) +let shift_prec = 11 (* a<>b *) +let cmp_prec = 10 (* ab, a>=b *) +let eq_prec = 9 (* a==b, a!=b *) +let binand_prec = 8 (* a & b *) +let binxor_prec = 7 (* a ^ b *) +let binor_prec = 6 (* a | b *) +let and_prec = 5 (* a && b *) +let or_prec = 4 (* a || b *) +let if_prec = 3 (* a?b:c *) +let setop_prec = 2 (* a += b, a *= b, ... *) +let comma_prec = 1 (* a, b *) + +let bufout_delim buf pri newpri s = + if newpri "*=" + | S_DIV -> "/=" + | S_MOD -> "%=" + | S_ADD -> "+=" + | S_SUB -> "-=" + | S_INDEX -> "" + +let mop_text mop = + match mop with + M_MINUS -> "-" + | M_NOT -> "~" + | M_POST_INC | M_PRE_INC -> "++" + | M_POST_DEC | M_PRE_DEC -> "--" + +let mop_prec mop = + match mop with + M_MINUS -> uminus_prec + | M_NOT -> tilde_prec + | M_POST_INC | M_POST_DEC | M_PRE_INC | M_PRE_DEC -> incdec_prec + +let op_text setop = + match setop with + S_MUL -> "*" + | S_DIV -> "/" + | S_MOD -> "%" + | S_ADD -> "+" + | S_SUB -> "-" + | S_INDEX -> "[" + +let fin_op_text setop = + match setop with + S_MUL -> "" + | S_DIV -> "" + | S_MOD -> "" + | S_ADD -> "" + | S_SUB -> "" + | S_INDEX -> "]" + +let op_prec setop = + match setop with + S_MUL -> mul_prec + | S_DIV -> div_prec + | S_MOD -> mod_prec + | S_ADD -> add_prec + | S_SUB -> sub_prec + | S_INDEX -> index_prec + +let rec bufout_expr buf pri e = + match e with + VAR s -> Buffer.add_string buf s + | CST n -> Buffer.add_string buf (string_of_int n) + | STRING s -> + begin + Buffer.add_string buf "\""; + Buffer.add_string buf (String.escaped s); + Buffer.add_string buf "\"" + end + | SET_VAR (x, e) -> (bufout_open buf pri setop_prec; + Buffer.add_string buf x; + Buffer.add_string buf "="; + bufout_loc_expr buf setop_prec e; + bufout_close buf pri setop_prec) + | SET_ARRAY (x, e, e') -> (bufout_open buf pri setop_prec; + Buffer.add_string buf x; + Buffer.add_string buf "["; + bufout_loc_expr buf index_prec e; + Buffer.add_string buf "]="; + bufout_loc_expr buf setop_prec e'; + bufout_close buf pri setop_prec) + | CALL (f, l) -> (bufout_open buf pri index_prec; + Buffer.add_string buf f; + Buffer.add_string buf "("; + bufout_loc_expr_list buf l; + Buffer.add_string buf ")"; + bufout_close buf pri index_prec) + | OP1 (mop, e') -> + let newpri = mop_prec mop in + (bufout_open buf pri newpri; + (match mop with + M_MINUS | M_NOT | M_PRE_INC | M_PRE_DEC -> + (Buffer.add_string buf (mop_text mop); + bufout_loc_expr buf newpri e') + | _ -> + (bufout_loc_expr buf newpri e'; + Buffer.add_string buf (mop_text mop))); + bufout_close buf pri newpri) + | OP2 (setop, e, e') -> let newpri = op_prec setop in + (bufout_open buf pri newpri; + bufout_loc_expr buf newpri e; + Buffer.add_string buf (op_text setop); + bufout_loc_expr buf newpri e'; + Buffer.add_string buf (fin_op_text setop); + bufout_close buf pri newpri) + | CMP (C_LT, e, e') -> (bufout_open buf pri cmp_prec; + bufout_loc_expr buf cmp_prec e; + Buffer.add_string buf "<"; + bufout_loc_expr buf cmp_prec e'; + bufout_close buf pri cmp_prec) + | CMP (C_LE, e, e') -> (bufout_open buf pri cmp_prec; + bufout_loc_expr buf cmp_prec e; + Buffer.add_string buf "<="; + bufout_loc_expr buf cmp_prec e'; + bufout_close buf pri cmp_prec) + | CMP (C_EQ, e, e') -> (bufout_open buf pri eq_prec; + bufout_loc_expr buf eq_prec e; + Buffer.add_string buf "=="; + bufout_loc_expr buf eq_prec e'; + bufout_close buf pri eq_prec) + | EIF (eb, et, ee) -> (bufout_open buf pri if_prec; + bufout_loc_expr buf if_prec eb; + Buffer.add_string buf "?"; + bufout_loc_expr buf if_prec et; + Buffer.add_string buf ":"; + bufout_loc_expr buf if_prec ee; + bufout_close buf pri if_prec) + | ESEQ (e::l) -> (bufout_open buf pri comma_prec; + bufout_loc_expr buf comma_prec e; + List.iter (fun e' -> (Buffer.add_string buf ","; + bufout_loc_expr buf comma_prec e')) l; + bufout_close buf pri comma_prec) + | ESEQ [] -> () +and bufout_loc_expr buf pri (_, e) = + bufout_expr buf pri e +and bufout_loc_expr_list buf l = + match l with + [] -> () + | [a] -> bufout_loc_expr buf comma_prec a + | a::l' -> (bufout_loc_expr buf comma_prec a; + Buffer.add_string buf ","; + bufout_loc_expr_list buf l') + +let rec string_of_expr e = + let buf = Buffer.create 128 in + bufout_loc_expr buf comma_prec e; + Buffer.contents buf + +let rec string_of_loc_expr e = + let buf = Buffer.create 128 in + bufout_expr buf comma_prec e; + Buffer.contents buf diff --git a/cparse.mli b/cparse.mli new file mode 100644 index 0000000..879357f --- /dev/null +++ b/cparse.mli @@ -0,0 +1,73 @@ +type mon_op = M_MINUS | M_NOT | M_POST_INC | M_POST_DEC | M_PRE_INC | M_PRE_DEC +(** Les opérations unaires: + M_MINUS: calcule l'opposé -e de e; + M_NOT: calcule la négation logique ~e de e; + M_POST_INC: post-incrémentation e++; + M_POST_DEC: post-décrémentation e--; + M_PRE_INC: pré-incrémentation ++e; + M_PRE_DEC: pré-décrémentation --e. + *) + +type bin_op = S_MUL | S_DIV | S_MOD | S_ADD | S_SUB | S_INDEX +(** Les opérations binaires: + S_MUL: multiplication entière; + S_DIV: division entière (quotient); + S_MOD: division entière (reste); + S_ADD: addition entière; + S_SUB: soustraction entière; + S_INDEX: accès à un élément de tableau a[i]. + *) + +type cmp_op = C_LT | C_LE | C_EQ +(** Les opérations de comparaison: + C_LT (less than): <; + C_LE (less than or equal to): <=; + C_EQ (equal): ==. + *) + +type loc_expr = Error.locator * expr +and expr = + + | VAR of string (** une variable --- toujours de type int. *) + | CST of int (** une constante entiere. *) + | STRING of string (** une constante chaine. *) + | SET_VAR of string * loc_expr (** affectation x=e. *) + | SET_ARRAY of string * loc_expr * loc_expr (** affectation x[e]=e'. *) + | CALL of string * loc_expr list (** appel de fonction f(e1,...,en) *) + + | OP1 of mon_op * loc_expr + (** OP1(mop, e) dénote -e, ~e, e++, e--, ++e, ou --e. *) + | OP2 of bin_op * loc_expr * loc_expr + (** OP2(bop,e,e') dénote e*e', e/e', e%e', + e+e', e-e', ou e[e']. *) + | CMP of cmp_op * loc_expr * loc_expr + (** CMP(cop,e,e') vaut e string * int * int * int * int + +val loc_of_expr : Error.locator*'a -> Error.locator +val e_of_expr : loc_expr -> expr diff --git a/cprint.cmi b/cprint.cmi new file mode 100644 index 0000000000000000000000000000000000000000..d6a92144fb02c47aaa3600cb361eab9592ef160c GIT binary patch literal 868 zcmZ=x%*`>hw6ydzFf?zOx@;c<1Cs{>14AtX1LFZ8UbR5Yxu7UBuVlf34UEj6jlk^q zl+@&$#G=HK%>2A!hXWf9Ds0%ial!@%HMjht+{6+`%``Awl3K*@-(i9S6YJN93=BUv z9Ax3%uzA7;PnDd^;u41iP(98CiABY!j{0SZMabqN>HGyZ<2OjZn@VY3W{Cq_@DJ32 zzfk(0!-fND@p<`qsqu~u4F6e}938-p|Dp?Vd`^CHVo81x$lWYjL^%8nP@M_LVrRAD z5@1lIBdmT4l(GRyIVuB#2qFFsDDJXhGYbdYk?(;bo^xX1^fh#ycy2rlvw$TNrY zK0&?n8A^YF(qEzUHz@rbO8;c`}*^Pd)>xO9k2=MSQe8hdcEJ zP-8fp_Y&%$S5W%3151d510-!RTn45sWk~vBNLv6)ToVjp4wP}YU)>uqcbmk_3d3)9 z3l?Yvq!yJW7H5{F7EdtXWsHhaG)tY$`^0cxy{PLxpiW3yn_!T5#gxfuGegDYwbM?r zocz9U!2(s+qN4nw2?p}>r!@Qg%)OTU{r9AdY`ZOB>p+QZf`N2~hGSg7r~Y}TigpVZ zE_%3NfrT?LBLE{YwJ0w!2V%Ap(Dr1Y<=t%aPs#aC7TenKG}PZ>w+hf4r_!{vRG<}0 cE59tQGvGTO`orr-^TDUmFmEyfy$A;m05?utsQ>@~ literal 0 HcmV?d00001 diff --git a/cprint.cmo b/cprint.cmo new file mode 100644 index 0000000000000000000000000000000000000000..ce625bcf0b4881fbf0f4219bc4dd558f3820088a GIT binary patch literal 4911 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 literal 0 HcmV?d00001 diff --git a/cprint.ml b/cprint.ml new file mode 100644 index 0000000..d21f55f --- /dev/null +++ b/cprint.ml @@ -0,0 +1,20 @@ +open Cparse + +let print_declarations out dec_list = + let rec print_dec_list = function + | [] -> (); + | h :: t -> print_dec h; print_dec_list t; + and print_dec = function + | CDECL(l, s) -> Printf.printf "Declare varaible %s\n" s; + | CFUN(l, s, vdl, lc) -> begin + Printf.printf "Starting function %s\n" s; + print_dec_list vdl; + end + in print_dec_list dec_list;; + +let print_locator out nom fl fc ll lc = + Printf.printf "%s %d %d %d %d\n" nom fl fc ll lc + +let print_ast out dec_list = + print_declarations out dec_list; + Printf.printf "Ended\n";; diff --git a/cprint.mli b/cprint.mli new file mode 100644 index 0000000..2e59570 --- /dev/null +++ b/cprint.mli @@ -0,0 +1,5 @@ +val print_declarations : Format.formatter -> Cparse.var_declaration list -> unit + +val print_locator : Format.formatter -> string -> int -> int -> int -> int -> unit + +val print_ast : Format.formatter -> Cparse.var_declaration list -> unit diff --git a/ctab.cmi b/ctab.cmi new file mode 100644 index 0000000000000000000000000000000000000000..d6dfa1f5b9b6722499cbfacf4a489904b7ec1e2c GIT binary patch literal 2343 zcmajhO>7ip7y#gzcBdi;%3l@GQrel>>4Ig8T3XaP-_CryJ1{%5%ulI3bhE`pD$7=< zOG7*;0b`6tTv3eC2osE$c+kZviIOy6hzAa8JaF(}f>910Oe|3T!S9=QcH5q8vT5dd z-*?{cXa1D@?qXMOZ?6{b+W6YxXPBmaoRkrcpn5JUG(UKarWWPF5sVd@F*&8W6FUu9VfxB{nVeZIs^|Y8Pjg|^I zBr|s-4M+}(r#hTxvp8p<45qb_MfH-~vK(0eNtYzWG;9YM4xAsgkCe(YC%;89n<4XZ zr|nppk;>_sgDs>7=Uh`i=S`B?0-0AtTN}h?QYO>}G%aQwD`#dYi9lCH%}_#$0bLVS zT%%5)>rovioiJ?!*bT|jQt29Y1Kt#L9Hwmoxh14((g$)|z+1zd1jrr1sO2O>!D3YZM=?kETqI8i%`x0!0ltAR}3Gr*dl^u?ztMz3(3A!puuZ%GBd$5P2 z^s)$T66_I)+`08WKLEBw=|vbO{s^`@O0U4s&VjYUf|4MqnnEw8KY&CYxsFNUB0yBKa7wdD zCB?r1C0;9dQ@_a zI&y3SXs49aO)}J=nq!+l*Ndv@CUi{7Id(o+TnHYZ0WAXRlKM@Z6o-jRKsWIHrbat+ zY%|DXWH~HXp|jxFm0*txuA!N9(KxmR=m{PhZYGd6kZuX>)^IW`8+ z!z;*!!FGc5M#&x_SBI7x05`R1bl*6(8;+mku^yIf0(nZbw`q=&4zl{do))&HYcos$ z^|h&VCpk6=$IrAUO}c3uyBR>{Q)aN)9BY6e`uZWu?7}cD(1eh%FxnE7_5&%Rg&jAz znmBe4Ol?Ottjmxrqab@oM!rv;#Ho1M%a_KA`SQqUDYvIIQkG9w&$L$0L>j9TCn{B0 z)C+sbYZQsa!rtLMJD9um7uhB9n&sI2_2bLod-e(`Ui^Q>)ASv!@x_s`GJQV=os<{z z-dF*xAJ2Qa=L*}4c`q2%td>{n&8~&bu803`ki~mjmf_ohIms|g3;7kvZ@`C-hf2Kh zKwDpH_3XZb%%^7$f7Sh+@5izQZ#+LXGF}*~#22!IgKN4AA20l~Yx33Qc+&U7xmV(= zE`F9aCw@Np$+{1h^?W`#?E3=tyiuYXF!yi-eGI(EVLdld4SLp~b{UMXKpj(WTEFBwZ%zMq>zVVl9_MGBt LGhxXL>VNWooRRf< literal 0 HcmV?d00001 diff --git a/ctab.cmo b/ctab.cmo new file mode 100644 index 0000000000000000000000000000000000000000..4186868a7337075e7b3d73b6df520f9eb47439c6 GIT binary patch literal 88277 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 D@rHWl literal 0 HcmV?d00001 diff --git a/ctab.ml b/ctab.ml new file mode 100644 index 0000000..0837918 --- /dev/null +++ b/ctab.ml @@ -0,0 +1,1570 @@ +type token = + | IDENTIFIER of (string) + | TYPE_NAME of (string) + | CONSTANT of (int) + | STRING_LITERAL of (string) + | SIZEOF + | PTR_OP + | INC_OP + | DEC_OP + | LEFT_OP + | RIGHT_OP + | LE_OP + | GE_OP + | EQ_OP + | NE_OP + | AND_OP + | OR_OP + | MUL_ASSIGN + | DIV_ASSIGN + | MOD_ASSIGN + | ADD_ASSIGN + | SUB_ASSIGN + | LEFT_ASSIGN + | RIGHT_ASSIGN + | AND_ASSIGN + | XOR_ASSIGN + | OR_ASSIGN + | SEMI_CHR + | OPEN_BRACE_CHR + | CLOSE_BRACE_CHR + | COMMA_CHR + | COLON_CHR + | EQ_CHR + | OPEN_PAREN_CHR + | CLOSE_PAREN_CHR + | OPEN_BRACKET_CHR + | CLOSE_BRACKET_CHR + | DOT_CHR + | AND_CHR + | OR_CHR + | XOR_CHR + | BANG_CHR + | TILDE_CHR + | ADD_CHR + | SUB_CHR + | STAR_CHR + | DIV_CHR + | MOD_CHR + | OPEN_ANGLE_CHR + | CLOSE_ANGLE_CHR + | QUES_CHR + | TYPEDEF + | EXTERN + | STATIC + | AUTO + | REGISTER + | CHAR + | SHORT + | INTEGER + | LONG + | SIGNED + | UNSIGNED + | FLOATING + | DOUBLE + | CONST + | VOLATILE + | VOID + | STRUCT + | UNION + | ENUM + | ELLIPSIS + | EOF + | CASE + | DEFAULT + | IF + | ELSE + | SWITCH + | WHILE + | DO + | FOR + | GOTO + | CONTINUE + | BREAK + | RETURN + | ASM + +open Parsing;; +let _ = parse_error;; +# 2 "ctab.mly" + +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification + * (LSV), UMR 8643 CNRS & ENS Cachan. + * Written by Jean Goubault-Larrecq. Derived from the csur project. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the + * consequences of use of this software, no matter how awful, even if + * they arise from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + * + *) + +(* Analyse syntaxique d'un sous-ensemble (tres) reduit de C. + *) + +open Cparse +open Error + +let parse_error msg = + fatal (Some (getloc ())) msg + +# 125 "ctab.ml" +let yytransl_const = [| + 261 (* SIZEOF *); + 262 (* PTR_OP *); + 263 (* INC_OP *); + 264 (* DEC_OP *); + 265 (* LEFT_OP *); + 266 (* RIGHT_OP *); + 267 (* LE_OP *); + 268 (* GE_OP *); + 269 (* EQ_OP *); + 270 (* NE_OP *); + 271 (* AND_OP *); + 272 (* OR_OP *); + 273 (* MUL_ASSIGN *); + 274 (* DIV_ASSIGN *); + 275 (* MOD_ASSIGN *); + 276 (* ADD_ASSIGN *); + 277 (* SUB_ASSIGN *); + 278 (* LEFT_ASSIGN *); + 279 (* RIGHT_ASSIGN *); + 280 (* AND_ASSIGN *); + 281 (* XOR_ASSIGN *); + 282 (* OR_ASSIGN *); + 283 (* SEMI_CHR *); + 284 (* OPEN_BRACE_CHR *); + 285 (* CLOSE_BRACE_CHR *); + 286 (* COMMA_CHR *); + 287 (* COLON_CHR *); + 288 (* EQ_CHR *); + 289 (* OPEN_PAREN_CHR *); + 290 (* CLOSE_PAREN_CHR *); + 291 (* OPEN_BRACKET_CHR *); + 292 (* CLOSE_BRACKET_CHR *); + 293 (* DOT_CHR *); + 294 (* AND_CHR *); + 295 (* OR_CHR *); + 296 (* XOR_CHR *); + 297 (* BANG_CHR *); + 298 (* TILDE_CHR *); + 299 (* ADD_CHR *); + 300 (* SUB_CHR *); + 301 (* STAR_CHR *); + 302 (* DIV_CHR *); + 303 (* MOD_CHR *); + 304 (* OPEN_ANGLE_CHR *); + 305 (* CLOSE_ANGLE_CHR *); + 306 (* QUES_CHR *); + 307 (* TYPEDEF *); + 308 (* EXTERN *); + 309 (* STATIC *); + 310 (* AUTO *); + 311 (* REGISTER *); + 312 (* CHAR *); + 313 (* SHORT *); + 314 (* INTEGER *); + 315 (* LONG *); + 316 (* SIGNED *); + 317 (* UNSIGNED *); + 318 (* FLOATING *); + 319 (* DOUBLE *); + 320 (* CONST *); + 321 (* VOLATILE *); + 322 (* VOID *); + 323 (* STRUCT *); + 324 (* UNION *); + 325 (* ENUM *); + 326 (* ELLIPSIS *); + 0 (* EOF *); + 327 (* CASE *); + 328 (* DEFAULT *); + 329 (* IF *); + 330 (* ELSE *); + 331 (* SWITCH *); + 332 (* WHILE *); + 333 (* DO *); + 334 (* FOR *); + 335 (* GOTO *); + 336 (* CONTINUE *); + 337 (* BREAK *); + 338 (* RETURN *); + 339 (* ASM *); + 0|] + +let yytransl_block = [| + 257 (* IDENTIFIER *); + 258 (* TYPE_NAME *); + 259 (* CONSTANT *); + 260 (* STRING_LITERAL *); + 0|] + +let yylhs = "\255\255\ +\002\000\002\000\002\000\002\000\004\000\003\000\007\000\008\000\ +\005\000\005\000\009\000\010\000\011\000\011\000\011\000\011\000\ +\011\000\011\000\014\000\014\000\016\000\016\000\016\000\016\000\ +\017\000\017\000\017\000\017\000\019\000\020\000\021\000\022\000\ +\013\000\018\000\023\000\023\000\023\000\023\000\024\000\024\000\ +\024\000\025\000\026\000\026\000\026\000\026\000\026\000\027\000\ +\027\000\027\000\028\000\029\000\030\000\031\000\031\000\032\000\ +\032\000\033\000\033\000\015\000\015\000\006\000\006\000\034\000\ +\036\000\036\000\037\000\037\000\038\000\039\000\035\000\035\000\ +\035\000\012\000\040\000\040\000\040\000\040\000\040\000\046\000\ +\047\000\041\000\041\000\041\000\041\000\049\000\049\000\048\000\ +\048\000\042\000\042\000\050\000\051\000\043\000\043\000\052\000\ +\053\000\044\000\044\000\044\000\054\000\045\000\045\000\001\000\ +\001\000\001\000\055\000\055\000\057\000\058\000\058\000\059\000\ +\059\000\060\000\060\000\061\000\056\000\000\000" + +let yylen = "\002\000\ +\001\000\001\000\001\000\003\000\001\000\001\000\001\000\001\000\ +\001\000\002\000\001\000\001\000\001\000\004\000\003\000\004\000\ +\002\000\002\000\001\000\003\000\001\000\002\000\002\000\002\000\ +\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ +\001\000\001\000\001\000\003\000\003\000\003\000\001\000\003\000\ +\003\000\001\000\001\000\003\000\003\000\003\000\003\000\001\000\ +\003\000\003\000\001\000\001\000\001\000\001\000\003\000\001\000\ +\003\000\001\000\005\000\001\000\003\000\001\000\003\000\003\000\ +\000\000\001\000\001\000\003\000\001\000\001\000\001\000\002\000\ +\002\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ +\001\000\002\000\003\000\003\000\004\000\001\000\002\000\001\000\ +\002\000\001\000\002\000\001\000\001\000\005\000\007\000\001\000\ +\001\000\005\000\006\000\007\000\001\000\002\000\003\000\001\000\ +\002\000\001\000\001\000\001\000\002\000\001\000\003\000\001\000\ +\003\000\002\000\003\000\003\000\002\000\002\000" + +let yydefred = "\000\000\ +\000\000\000\000\000\000\071\000\106\000\000\000\108\000\000\000\ +\104\000\107\000\000\000\072\000\105\000\006\000\073\000\000\000\ +\000\000\000\000\067\000\069\000\007\000\080\000\117\000\000\000\ +\000\000\116\000\064\000\000\000\005\000\000\000\011\000\012\000\ +\092\000\008\000\000\000\031\000\032\000\029\000\030\000\093\000\ +\096\000\097\000\101\000\013\000\000\000\002\000\003\000\000\000\ +\081\000\000\000\000\000\000\000\062\000\000\000\000\000\035\000\ +\025\000\026\000\027\000\028\000\000\000\000\000\043\000\000\000\ +\000\000\052\000\053\000\054\000\000\000\000\000\060\000\086\000\ +\000\000\088\000\075\000\076\000\077\000\078\000\079\000\082\000\ +\000\000\000\000\090\000\000\000\000\000\000\000\000\000\114\000\ +\000\000\110\000\000\000\000\000\070\000\068\000\010\000\000\000\ +\000\000\091\000\000\000\022\000\023\000\000\000\017\000\018\000\ +\000\000\034\000\024\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\089\000\083\000\087\000\084\000\000\000\000\000\000\000\ +\000\000\102\000\000\000\109\000\000\000\115\000\004\000\033\000\ +\015\000\000\000\019\000\063\000\000\000\061\000\036\000\037\000\ +\038\000\000\000\000\000\046\000\047\000\044\000\045\000\000\000\ +\000\000\055\000\000\000\000\000\085\000\000\000\000\000\000\000\ +\103\000\113\000\111\000\000\000\016\000\074\000\014\000\000\000\ +\000\000\000\000\000\000\020\000\059\000\000\000\098\000\000\000\ +\000\000\000\000\000\000\099\000\095\000\100\000" + +let yydgoto = "\002\000\ +\006\000\044\000\045\000\046\000\047\000\048\000\022\000\049\000\ +\050\000\051\000\052\000\167\000\137\000\138\000\053\000\054\000\ +\055\000\056\000\057\000\058\000\059\000\060\000\061\000\062\000\ +\063\000\064\000\065\000\066\000\067\000\068\000\069\000\070\000\ +\071\000\007\000\008\000\017\000\018\000\019\000\020\000\074\000\ +\075\000\076\000\077\000\078\000\079\000\024\000\080\000\081\000\ +\082\000\083\000\084\000\085\000\086\000\087\000\009\000\010\000\ +\090\000\091\000\092\000\026\000\011\000" + +let yysindex = "\011\000\ +\001\000\000\000\249\254\000\000\000\000\232\254\000\000\004\255\ +\000\000\000\000\012\255\000\000\000\000\000\000\000\000\015\255\ +\023\255\028\255\000\000\000\000\000\000\000\000\000\000\081\255\ +\057\255\000\000\000\000\089\255\000\000\079\255\000\000\000\000\ +\000\000\000\000\038\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\063\255\000\000\000\000\243\254\ +\000\000\038\000\038\000\011\255\000\000\069\255\038\000\000\000\ +\000\000\000\000\000\000\000\000\073\255\104\255\000\000\094\255\ +\138\255\000\000\000\000\000\000\092\255\247\254\000\000\000\000\ +\004\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\137\255\081\255\000\000\123\255\125\255\129\255\249\255\000\000\ +\004\255\000\000\097\255\143\255\000\000\000\000\000\000\009\255\ +\022\255\000\000\038\000\000\000\000\000\038\000\000\000\000\000\ +\038\000\000\000\000\000\038\000\038\000\038\000\038\000\038\000\ +\038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ +\038\000\000\000\000\000\000\000\000\000\137\255\038\000\038\000\ +\111\000\000\000\253\254\000\000\233\254\000\000\000\000\000\000\ +\000\000\027\255\000\000\000\000\001\255\000\000\000\000\000\000\ +\000\000\073\255\073\255\000\000\000\000\000\000\000\000\094\255\ +\094\255\000\000\092\255\130\255\000\000\082\255\087\255\111\000\ +\000\000\000\000\000\000\038\000\000\000\000\000\000\000\038\000\ +\201\255\201\255\022\255\000\000\000\000\113\255\000\000\087\255\ +\201\255\201\255\201\255\000\000\000\000\000\000" + +let yyrindex = "\000\000\ +\000\000\000\000\000\000\000\000\000\000\188\000\000\000\167\255\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\099\255\ +\000\000\168\255\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\061\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\115\000\000\000\155\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\181\000\119\255\000\000\086\000\ +\033\001\000\000\000\000\000\000\046\001\155\255\000\000\000\000\ +\167\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\164\255\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\207\000\233\000\000\000\000\000\000\000\000\000\001\001\ +\025\001\000\000\054\001\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\189\255\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000" + +let yygindex = "\000\000\ +\000\000\000\000\008\000\000\000\169\000\221\255\000\000\000\000\ +\148\000\149\000\000\000\000\000\139\255\000\000\179\255\216\255\ +\000\000\246\255\000\000\000\000\000\000\000\000\064\000\000\000\ +\058\000\066\000\000\000\000\000\000\000\084\000\087\000\000\000\ +\043\000\236\255\234\255\000\000\000\000\178\000\123\000\181\255\ +\203\000\140\255\000\000\000\000\000\000\000\000\183\255\138\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\215\000\000\000\ +\090\000\000\000\000\000\000\000\000\000" + +let yytablesize = 616 +let yytable = "\096\000\ +\005\000\073\000\089\000\072\000\014\000\122\000\120\000\123\000\ +\125\000\100\000\101\000\001\000\160\000\098\000\106\000\016\000\ +\099\000\031\000\032\000\139\000\165\000\140\000\014\000\161\000\ +\029\000\030\000\099\000\142\000\031\000\032\000\099\000\003\000\ +\003\000\004\000\004\000\093\000\166\000\012\000\099\000\021\000\ +\121\000\170\000\135\000\171\000\107\000\102\000\162\000\025\000\ +\015\000\027\000\122\000\131\000\157\000\177\000\035\000\136\000\ +\164\000\028\000\179\000\073\000\136\000\124\000\036\000\037\000\ +\038\000\039\000\141\000\106\000\106\000\106\000\106\000\106\000\ +\106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\ +\093\000\014\000\030\000\029\000\030\000\156\000\172\000\031\000\ +\032\000\014\000\088\000\158\000\159\000\174\000\175\000\097\000\ +\093\000\143\000\144\000\145\000\105\000\180\000\181\000\182\000\ +\113\000\114\000\119\000\033\000\021\000\034\000\089\000\099\000\ +\003\000\035\000\004\000\169\000\099\000\108\000\109\000\110\000\ +\136\000\036\000\037\000\038\000\039\000\070\000\133\000\106\000\ +\070\000\042\000\042\000\042\000\042\000\042\000\042\000\176\000\ +\003\000\014\000\004\000\029\000\030\000\115\000\116\000\031\000\ +\032\000\042\000\111\000\112\000\042\000\042\000\117\000\118\000\ +\042\000\040\000\042\000\127\000\041\000\128\000\042\000\099\000\ +\168\000\129\000\043\000\033\000\021\000\034\000\042\000\042\000\ +\042\000\035\000\148\000\149\000\150\000\151\000\146\000\147\000\ +\134\000\036\000\037\000\038\000\039\000\058\000\152\000\153\000\ +\058\000\058\000\178\000\118\000\058\000\094\000\058\000\094\000\ +\094\000\065\000\066\000\094\000\094\000\112\000\095\000\103\000\ +\104\000\014\000\154\000\029\000\030\000\094\000\155\000\031\000\ +\032\000\040\000\173\000\132\000\041\000\023\000\042\000\094\000\ +\094\000\094\000\043\000\126\000\013\000\094\000\163\000\000\000\ +\000\000\000\000\000\000\033\000\021\000\094\000\094\000\094\000\ +\094\000\035\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\036\000\037\000\038\000\039\000\000\000\000\000\000\000\ +\000\000\014\000\000\000\029\000\030\000\000\000\000\000\031\000\ +\032\000\000\000\000\000\000\000\000\000\094\000\000\000\000\000\ +\094\000\000\000\094\000\000\000\000\000\000\000\094\000\000\000\ +\000\000\040\000\000\000\130\000\041\000\000\000\042\000\009\000\ +\009\000\035\000\043\000\009\000\009\000\009\000\009\000\009\000\ +\009\000\036\000\037\000\038\000\039\000\000\000\014\000\000\000\ +\029\000\030\000\000\000\009\000\031\000\032\000\009\000\009\000\ +\009\000\000\000\009\000\009\000\009\000\000\000\000\000\000\000\ +\003\000\000\000\004\000\009\000\009\000\009\000\009\000\009\000\ +\009\000\009\000\009\000\001\000\001\000\000\000\035\000\001\000\ +\001\000\001\000\001\000\001\000\001\000\000\000\036\000\037\000\ +\038\000\039\000\000\000\000\000\000\000\000\000\000\000\001\000\ +\000\000\000\000\001\000\001\000\001\000\000\000\001\000\001\000\ +\001\000\000\000\048\000\048\000\048\000\048\000\000\000\001\000\ +\001\000\001\000\001\000\001\000\001\000\001\000\001\000\014\000\ +\048\000\029\000\030\000\048\000\048\000\031\000\032\000\048\000\ +\000\000\048\000\000\000\000\000\000\000\021\000\021\000\021\000\ +\021\000\021\000\021\000\000\000\000\000\000\000\000\000\048\000\ +\000\000\033\000\000\000\000\000\000\000\021\000\000\000\035\000\ +\021\000\021\000\021\000\000\000\021\000\000\000\021\000\036\000\ +\037\000\038\000\039\000\000\000\000\000\021\000\021\000\021\000\ +\021\000\021\000\021\000\021\000\021\000\034\000\034\000\034\000\ +\034\000\034\000\034\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\034\000\000\000\000\000\ +\034\000\034\000\000\000\000\000\034\000\000\000\034\000\039\000\ +\039\000\039\000\039\000\039\000\039\000\034\000\034\000\034\000\ +\034\000\034\000\034\000\034\000\034\000\000\000\000\000\039\000\ +\000\000\000\000\039\000\039\000\000\000\000\000\039\000\000\000\ +\039\000\040\000\040\000\040\000\040\000\040\000\040\000\039\000\ +\039\000\000\000\000\000\000\000\039\000\039\000\039\000\000\000\ +\000\000\040\000\000\000\000\000\040\000\040\000\000\000\000\000\ +\040\000\000\000\040\000\041\000\041\000\041\000\041\000\041\000\ +\041\000\040\000\040\000\000\000\000\000\000\000\040\000\040\000\ +\040\000\000\000\000\000\041\000\000\000\000\000\041\000\041\000\ +\000\000\000\000\041\000\000\000\041\000\049\000\049\000\049\000\ +\049\000\000\000\000\000\041\000\041\000\000\000\000\000\000\000\ +\041\000\041\000\041\000\049\000\000\000\000\000\049\000\049\000\ +\000\000\000\000\049\000\000\000\049\000\050\000\050\000\050\000\ +\050\000\000\000\000\000\000\000\000\000\000\000\000\000\051\000\ +\051\000\000\000\049\000\050\000\000\000\000\000\050\000\050\000\ +\000\000\000\000\050\000\051\000\050\000\056\000\051\000\051\000\ +\000\000\000\000\051\000\000\000\051\000\057\000\000\000\000\000\ +\056\000\000\000\050\000\056\000\056\000\000\000\000\000\056\000\ +\057\000\056\000\051\000\057\000\057\000\000\000\000\000\057\000\ +\000\000\057\000\000\000\000\000\000\000\000\000\000\000\056\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\057\000" + +let yycheck = "\035\000\ +\000\000\024\000\025\000\024\000\001\001\081\000\016\001\081\000\ +\082\000\050\000\051\000\001\000\129\000\027\001\055\000\008\000\ +\030\001\007\001\008\001\097\000\138\000\099\000\001\001\027\001\ +\003\001\004\001\030\001\105\000\007\001\008\001\030\001\056\001\ +\056\001\058\001\058\001\028\000\036\001\045\001\030\001\028\001\ +\050\001\159\000\034\001\160\000\055\000\035\001\070\001\033\001\ +\045\001\027\001\126\000\087\000\126\000\171\000\033\001\034\001\ +\030\001\030\001\176\000\082\000\034\001\082\000\041\001\042\001\ +\043\001\044\001\102\000\108\000\109\000\110\000\111\000\112\000\ +\113\000\114\000\115\000\116\000\117\000\118\000\119\000\120\000\ +\073\000\001\001\004\001\003\001\004\001\121\000\164\000\007\001\ +\008\001\001\001\034\001\127\000\128\000\169\000\170\000\033\001\ +\089\000\108\000\109\000\110\000\032\001\177\000\178\000\179\000\ +\011\001\012\001\015\001\027\001\028\001\029\001\133\000\030\001\ +\056\001\033\001\058\001\034\001\030\001\045\001\046\001\047\001\ +\034\001\041\001\042\001\043\001\044\001\027\001\030\001\168\000\ +\030\001\011\001\012\001\013\001\014\001\015\001\016\001\171\000\ +\056\001\001\001\058\001\003\001\004\001\048\001\049\001\007\001\ +\008\001\027\001\043\001\044\001\030\001\031\001\013\001\014\001\ +\034\001\073\001\036\001\033\001\076\001\033\001\078\001\030\001\ +\031\001\033\001\082\001\027\001\028\001\029\001\048\001\049\001\ +\050\001\033\001\113\000\114\000\115\000\116\000\111\000\112\000\ +\034\001\041\001\042\001\043\001\044\001\027\001\117\000\118\000\ +\030\001\031\001\074\001\000\000\034\001\001\001\036\001\003\001\ +\004\001\027\001\027\001\007\001\008\001\034\001\030\000\052\000\ +\052\000\001\001\119\000\003\001\004\001\028\000\120\000\007\001\ +\008\001\073\001\168\000\089\000\076\001\011\000\078\001\027\001\ +\028\001\029\001\082\001\082\000\006\000\033\001\133\000\255\255\ +\255\255\255\255\255\255\027\001\028\001\041\001\042\001\043\001\ +\044\001\033\001\255\255\255\255\255\255\255\255\255\255\255\255\ +\255\255\041\001\042\001\043\001\044\001\255\255\255\255\255\255\ +\255\255\001\001\255\255\003\001\004\001\255\255\255\255\007\001\ +\008\001\255\255\255\255\255\255\255\255\073\001\255\255\255\255\ +\076\001\255\255\078\001\255\255\255\255\255\255\082\001\255\255\ +\255\255\073\001\255\255\027\001\076\001\255\255\078\001\007\001\ +\008\001\033\001\082\001\011\001\012\001\013\001\014\001\015\001\ +\016\001\041\001\042\001\043\001\044\001\255\255\001\001\255\255\ +\003\001\004\001\255\255\027\001\007\001\008\001\030\001\031\001\ +\032\001\255\255\034\001\035\001\036\001\255\255\255\255\255\255\ +\056\001\255\255\058\001\043\001\044\001\045\001\046\001\047\001\ +\048\001\049\001\050\001\007\001\008\001\255\255\033\001\011\001\ +\012\001\013\001\014\001\015\001\016\001\255\255\041\001\042\001\ +\043\001\044\001\255\255\255\255\255\255\255\255\255\255\027\001\ +\255\255\255\255\030\001\031\001\032\001\255\255\034\001\035\001\ +\036\001\255\255\013\001\014\001\015\001\016\001\255\255\043\001\ +\044\001\045\001\046\001\047\001\048\001\049\001\050\001\001\001\ +\027\001\003\001\004\001\030\001\031\001\007\001\008\001\034\001\ +\255\255\036\001\255\255\255\255\255\255\011\001\012\001\013\001\ +\014\001\015\001\016\001\255\255\255\255\255\255\255\255\050\001\ +\255\255\027\001\255\255\255\255\255\255\027\001\255\255\033\001\ +\030\001\031\001\032\001\255\255\034\001\255\255\036\001\041\001\ +\042\001\043\001\044\001\255\255\255\255\043\001\044\001\045\001\ +\046\001\047\001\048\001\049\001\050\001\011\001\012\001\013\001\ +\014\001\015\001\016\001\255\255\255\255\255\255\255\255\255\255\ +\255\255\255\255\255\255\255\255\255\255\027\001\255\255\255\255\ +\030\001\031\001\255\255\255\255\034\001\255\255\036\001\011\001\ +\012\001\013\001\014\001\015\001\016\001\043\001\044\001\045\001\ +\046\001\047\001\048\001\049\001\050\001\255\255\255\255\027\001\ +\255\255\255\255\030\001\031\001\255\255\255\255\034\001\255\255\ +\036\001\011\001\012\001\013\001\014\001\015\001\016\001\043\001\ +\044\001\255\255\255\255\255\255\048\001\049\001\050\001\255\255\ +\255\255\027\001\255\255\255\255\030\001\031\001\255\255\255\255\ +\034\001\255\255\036\001\011\001\012\001\013\001\014\001\015\001\ +\016\001\043\001\044\001\255\255\255\255\255\255\048\001\049\001\ +\050\001\255\255\255\255\027\001\255\255\255\255\030\001\031\001\ +\255\255\255\255\034\001\255\255\036\001\013\001\014\001\015\001\ +\016\001\255\255\255\255\043\001\044\001\255\255\255\255\255\255\ +\048\001\049\001\050\001\027\001\255\255\255\255\030\001\031\001\ +\255\255\255\255\034\001\255\255\036\001\013\001\014\001\015\001\ +\016\001\255\255\255\255\255\255\255\255\255\255\255\255\015\001\ +\016\001\255\255\050\001\027\001\255\255\255\255\030\001\031\001\ +\255\255\255\255\034\001\027\001\036\001\016\001\030\001\031\001\ +\255\255\255\255\034\001\255\255\036\001\016\001\255\255\255\255\ +\027\001\255\255\050\001\030\001\031\001\255\255\255\255\034\001\ +\027\001\036\001\050\001\030\001\031\001\255\255\255\255\034\001\ +\255\255\036\001\255\255\255\255\255\255\255\255\255\255\050\001\ +\255\255\255\255\255\255\255\255\255\255\255\255\255\255\050\001" + +let yynames_const = "\ + SIZEOF\000\ + PTR_OP\000\ + INC_OP\000\ + DEC_OP\000\ + LEFT_OP\000\ + RIGHT_OP\000\ + LE_OP\000\ + GE_OP\000\ + EQ_OP\000\ + NE_OP\000\ + AND_OP\000\ + OR_OP\000\ + MUL_ASSIGN\000\ + DIV_ASSIGN\000\ + MOD_ASSIGN\000\ + ADD_ASSIGN\000\ + SUB_ASSIGN\000\ + LEFT_ASSIGN\000\ + RIGHT_ASSIGN\000\ + AND_ASSIGN\000\ + XOR_ASSIGN\000\ + OR_ASSIGN\000\ + SEMI_CHR\000\ + OPEN_BRACE_CHR\000\ + CLOSE_BRACE_CHR\000\ + COMMA_CHR\000\ + COLON_CHR\000\ + EQ_CHR\000\ + OPEN_PAREN_CHR\000\ + CLOSE_PAREN_CHR\000\ + OPEN_BRACKET_CHR\000\ + CLOSE_BRACKET_CHR\000\ + DOT_CHR\000\ + AND_CHR\000\ + OR_CHR\000\ + XOR_CHR\000\ + BANG_CHR\000\ + TILDE_CHR\000\ + ADD_CHR\000\ + SUB_CHR\000\ + STAR_CHR\000\ + DIV_CHR\000\ + MOD_CHR\000\ + OPEN_ANGLE_CHR\000\ + CLOSE_ANGLE_CHR\000\ + QUES_CHR\000\ + TYPEDEF\000\ + EXTERN\000\ + STATIC\000\ + AUTO\000\ + REGISTER\000\ + CHAR\000\ + SHORT\000\ + INTEGER\000\ + LONG\000\ + SIGNED\000\ + UNSIGNED\000\ + FLOATING\000\ + DOUBLE\000\ + CONST\000\ + VOLATILE\000\ + VOID\000\ + STRUCT\000\ + UNION\000\ + ENUM\000\ + ELLIPSIS\000\ + EOF\000\ + CASE\000\ + DEFAULT\000\ + IF\000\ + ELSE\000\ + SWITCH\000\ + WHILE\000\ + DO\000\ + FOR\000\ + GOTO\000\ + CONTINUE\000\ + BREAK\000\ + RETURN\000\ + ASM\000\ + " + +let yynames_block = "\ + IDENTIFIER\000\ + TYPE_NAME\000\ + CONSTANT\000\ + STRING_LITERAL\000\ + " + +let yyact = [| + (fun _ -> failwith "parser") +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'identifier) in + Obj.repr( +# 63 "ctab.mly" + ( let loc, var = _1 in loc, VAR var ) +# 601 "ctab.ml" + : 'primary_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'constant) in + Obj.repr( +# 64 "ctab.mly" + ( let loc, cst = _1 in loc, CST cst ) +# 608 "ctab.ml" + : 'primary_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'string_literal) in + Obj.repr( +# 65 "ctab.mly" + ( let loc, s = _1 in loc, STRING s ) +# 615 "ctab.ml" + : 'primary_expression)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'expression) in + Obj.repr( +# 66 "ctab.mly" + ( _2 ) +# 622 "ctab.ml" + : 'primary_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : int) in + Obj.repr( +# 69 "ctab.mly" + ( getloc (), _1 ) +# 629 "ctab.ml" + : 'constant)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in + Obj.repr( +# 71 "ctab.mly" + ( getloc (), _1 ) +# 636 "ctab.ml" + : 'identifier)) +; (fun __caml_parser_env -> + Obj.repr( +# 72 "ctab.mly" + ( getloc () ) +# 642 "ctab.ml" + : 'open_brace)) +; (fun __caml_parser_env -> + Obj.repr( +# 73 "ctab.mly" + ( getloc () ) +# 648 "ctab.ml" + : 'close_brace)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in + Obj.repr( +# 76 "ctab.mly" + ( getloc (), _1 ) +# 655 "ctab.ml" + : 'string_literal)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : string) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'string_literal) in + Obj.repr( +# 78 "ctab.mly" + ( + let l, s = _2 in + let s2 = _1 in + (getloc (), s2^s) + ) +# 667 "ctab.ml" + : 'string_literal)) +; (fun __caml_parser_env -> + Obj.repr( +# 84 "ctab.mly" + ( getloc () ) +# 673 "ctab.ml" + : 'inc_op)) +; (fun __caml_parser_env -> + Obj.repr( +# 85 "ctab.mly" + ( getloc () ) +# 679 "ctab.ml" + : 'dec_op)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'primary_expression) in + Obj.repr( +# 88 "ctab.mly" + ( _1 ) +# 686 "ctab.ml" + : 'postfix_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 3 : 'postfix_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 1 : 'expression) in + let _4 = (Parsing.peek_val __caml_parser_env 0 : 'close_bracket) in + Obj.repr( +# 90 "ctab.mly" + ( sup_locator (loc_of_expr _1) _4, OP2 (S_INDEX, _1, _3) ) +# 695 "ctab.ml" + : 'postfix_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'identifier) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'close_paren) in + Obj.repr( +# 92 "ctab.mly" + ( let loc, var = _1 in + let loc1 = sup_locator loc _3 in + loc1, CALL (var, []) + ) +# 706 "ctab.ml" + : 'postfix_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 3 : 'identifier) in + let _3 = (Parsing.peek_val __caml_parser_env 1 : 'argument_expression_list) in + let _4 = (Parsing.peek_val __caml_parser_env 0 : 'close_paren) in + Obj.repr( +# 97 "ctab.mly" + ( let loc, var = _1 in + let loc1 = sup_locator loc _4 in + loc1, CALL (var, List.rev _3) + ) +# 718 "ctab.ml" + : 'postfix_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'postfix_expression) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'inc_op) in + Obj.repr( +# 102 "ctab.mly" + ( sup_locator (loc_of_expr _1) _2, OP1 (M_POST_INC, _1) ) +# 726 "ctab.ml" + : 'postfix_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'postfix_expression) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'dec_op) in + Obj.repr( +# 104 "ctab.mly" + ( sup_locator (loc_of_expr _1) _2, OP1 (M_POST_DEC, _1) ) +# 734 "ctab.ml" + : 'postfix_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'assignment_expression) in + Obj.repr( +# 110 "ctab.mly" + ( [_1] ) +# 741 "ctab.ml" + : 'argument_expression_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'argument_expression_list) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'assignment_expression) in + Obj.repr( +# 111 "ctab.mly" + ( + _3 :: _1 ) +# 750 "ctab.ml" + : 'argument_expression_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'postfix_expression) in + Obj.repr( +# 116 "ctab.mly" + ( _1 ) +# 757 "ctab.ml" + : 'unary_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'inc_op) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expression) in + Obj.repr( +# 118 "ctab.mly" + ( sup_locator _1 (loc_of_expr _2), OP1 (M_PRE_INC, _2) ) +# 765 "ctab.ml" + : 'unary_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'dec_op) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expression) in + Obj.repr( +# 120 "ctab.mly" + ( sup_locator _1 (loc_of_expr _2), OP1 (M_PRE_DEC, _2) ) +# 773 "ctab.ml" + : 'unary_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'unary_operator) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'cast_expression) in + Obj.repr( +# 122 "ctab.mly" + ( + let loc, c = _1 in + let loc' = sup_locator loc (loc_of_expr _2) in + match c with + ADD_CHR -> _2 + | SUB_CHR -> loc', OP1 (M_MINUS, _2) + | BANG_CHR -> loc', EIF (_2, (loc', CST 0), (loc', CST 1)) + | TILDE_CHR -> loc', OP1 (M_NOT, _2) + | _ -> (Error.error (Some loc) "unknown unary operator"; + loc, CST 0) ) +# 790 "ctab.ml" + : 'unary_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'add_chr) in + Obj.repr( +# 135 "ctab.mly" + ( _1 ) +# 797 "ctab.ml" + : 'unary_operator)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'sub_chr) in + Obj.repr( +# 136 "ctab.mly" + ( _1 ) +# 804 "ctab.ml" + : 'unary_operator)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'bang_chr) in + Obj.repr( +# 137 "ctab.mly" + ( _1 ) +# 811 "ctab.ml" + : 'unary_operator)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'tilde_chr) in + Obj.repr( +# 138 "ctab.mly" + ( _1 ) +# 818 "ctab.ml" + : 'unary_operator)) +; (fun __caml_parser_env -> + Obj.repr( +# 141 "ctab.mly" + ( getloc (), ADD_CHR ) +# 824 "ctab.ml" + : 'add_chr)) +; (fun __caml_parser_env -> + Obj.repr( +# 142 "ctab.mly" + ( getloc (), SUB_CHR ) +# 830 "ctab.ml" + : 'sub_chr)) +; (fun __caml_parser_env -> + Obj.repr( +# 143 "ctab.mly" + ( getloc (), BANG_CHR ) +# 836 "ctab.ml" + : 'bang_chr)) +; (fun __caml_parser_env -> + Obj.repr( +# 144 "ctab.mly" + ( getloc (), TILDE_CHR ) +# 842 "ctab.ml" + : 'tilde_chr)) +; (fun __caml_parser_env -> + Obj.repr( +# 146 "ctab.mly" + ( getloc () ) +# 848 "ctab.ml" + : 'close_paren)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expression) in + Obj.repr( +# 149 "ctab.mly" + ( _1 ) +# 855 "ctab.ml" + : 'cast_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'cast_expression) in + Obj.repr( +# 153 "ctab.mly" + ( _1 ) +# 862 "ctab.ml" + : 'multiplicative_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'multiplicative_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'cast_expression) in + Obj.repr( +# 155 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + OP2 (S_MUL, _1, _3) + ) +# 872 "ctab.ml" + : 'multiplicative_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'multiplicative_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'cast_expression) in + Obj.repr( +# 159 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + OP2 (S_DIV, _1, _3) + ) +# 882 "ctab.ml" + : 'multiplicative_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'multiplicative_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'cast_expression) in + Obj.repr( +# 163 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + OP2 (S_MOD, _1, _3) + ) +# 892 "ctab.ml" + : 'multiplicative_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'multiplicative_expression) in + Obj.repr( +# 170 "ctab.mly" + ( _1 ) +# 899 "ctab.ml" + : 'additive_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'additive_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'multiplicative_expression) in + Obj.repr( +# 172 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + OP2 (S_ADD, _1, _3) + ) +# 909 "ctab.ml" + : 'additive_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'additive_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'multiplicative_expression) in + Obj.repr( +# 176 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + OP2 (S_SUB, _1, _3) + ) +# 919 "ctab.ml" + : 'additive_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'additive_expression) in + Obj.repr( +# 182 "ctab.mly" + ( _1 ) +# 926 "ctab.ml" + : 'shift_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'shift_expression) in + Obj.repr( +# 186 "ctab.mly" + ( _1 ) +# 933 "ctab.ml" + : 'relational_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'relational_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'shift_expression) in + Obj.repr( +# 188 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + CMP (C_LT, _1, _3) + ) +# 943 "ctab.ml" + : 'relational_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'relational_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'shift_expression) in + Obj.repr( +# 192 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + CMP (C_LT, _3, _1) + ) +# 953 "ctab.ml" + : 'relational_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'relational_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'shift_expression) in + Obj.repr( +# 196 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + CMP (C_LE, _1, _3) + ) +# 963 "ctab.ml" + : 'relational_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'relational_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'shift_expression) in + Obj.repr( +# 200 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + CMP (C_LE, _3, _1) + ) +# 973 "ctab.ml" + : 'relational_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'relational_expression) in + Obj.repr( +# 206 "ctab.mly" + ( _1 ) +# 980 "ctab.ml" + : 'equality_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'equality_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'relational_expression) in + Obj.repr( +# 208 "ctab.mly" + ( sup_locator (loc_of_expr _1) (loc_of_expr _3), + CMP (C_EQ, _1, _3) + ) +# 990 "ctab.ml" + : 'equality_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'equality_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'relational_expression) in + Obj.repr( +# 212 "ctab.mly" + ( + let loc = sup_locator (loc_of_expr _1) (loc_of_expr _3) in + loc, EIF ((loc, CMP (C_EQ, _1, _3)), + (loc, CST 0), + (loc, CST 1)) + ) +# 1003 "ctab.ml" + : 'equality_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'equality_expression) in + Obj.repr( +# 221 "ctab.mly" + ( _1 ) +# 1010 "ctab.ml" + : 'and_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'and_expression) in + Obj.repr( +# 225 "ctab.mly" + ( _1 ) +# 1017 "ctab.ml" + : 'exclusive_or_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'exclusive_or_expression) in + Obj.repr( +# 229 "ctab.mly" + ( _1 ) +# 1024 "ctab.ml" + : 'inclusive_or_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'inclusive_or_expression) in + Obj.repr( +# 233 "ctab.mly" + ( _1 ) +# 1031 "ctab.ml" + : 'logical_and_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'logical_and_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'inclusive_or_expression) in + Obj.repr( +# 235 "ctab.mly" + ( let loc = sup_locator (loc_of_expr _1) (loc_of_expr _3) in + loc, EIF (_1, _3, (loc, CST 0)) + ) +# 1041 "ctab.ml" + : 'logical_and_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'logical_and_expression) in + Obj.repr( +# 241 "ctab.mly" + ( _1 ) +# 1048 "ctab.ml" + : 'logical_or_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'logical_or_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'logical_and_expression) in + Obj.repr( +# 243 "ctab.mly" + ( let loc = sup_locator (loc_of_expr _1) (loc_of_expr _3) in + loc, EIF (_1, (loc, CST 1), _3) + ) +# 1058 "ctab.ml" + : 'logical_or_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'logical_or_expression) in + Obj.repr( +# 249 "ctab.mly" + ( _1 ) +# 1065 "ctab.ml" + : 'conditional_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 4 : 'logical_or_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 2 : 'expression) in + let _5 = (Parsing.peek_val __caml_parser_env 0 : 'conditional_expression) in + Obj.repr( +# 251 "ctab.mly" + ( + sup_locator (loc_of_expr _1) (loc_of_expr _5), + EIF (_1, _3, _5) + ) +# 1077 "ctab.ml" + : 'conditional_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'conditional_expression) in + Obj.repr( +# 258 "ctab.mly" + ( _1 ) +# 1084 "ctab.ml" + : 'assignment_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'unary_expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'assignment_expression) in + Obj.repr( +# 260 "ctab.mly" + ( + let locvar, left = _1 in + let loc = sup_locator locvar (loc_of_expr _3) in + match left with + VAR x -> loc, SET_VAR (x, _3) + | OP2 (S_INDEX, (_, VAR x), i) -> loc, SET_ARRAY (x, i, _3) + | _ -> + begin + Error.error (Some loc) + "Can only write assignments of the form x=e or x[e]=e'.\n"; + _3 + end + ) +# 1104 "ctab.ml" + : 'assignment_expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'assignment_expression) in + Obj.repr( +# 276 "ctab.mly" + ( _1 ) +# 1111 "ctab.ml" + : 'expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expression) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'assignment_expression) in + Obj.repr( +# 278 "ctab.mly" + ( + sup_locator (loc_of_expr _1) (loc_of_expr _3), + ESEQ [_1; _3] + ) +# 1122 "ctab.ml" + : 'expression)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'type_specifier) in + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'optional_init_declarator_list) in + Obj.repr( +# 286 "ctab.mly" + ( List.rev _2 ) +# 1130 "ctab.ml" + : 'declaration)) +; (fun __caml_parser_env -> + Obj.repr( +# 290 "ctab.mly" + ( [] ) +# 1136 "ctab.ml" + : 'optional_init_declarator_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'init_declarator_list) in + Obj.repr( +# 291 "ctab.mly" + ( _1 ) +# 1143 "ctab.ml" + : 'optional_init_declarator_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'init_declarator) in + Obj.repr( +# 297 "ctab.mly" + ( [_1] ) +# 1150 "ctab.ml" + : 'init_declarator_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'init_declarator_list) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'init_declarator) in + Obj.repr( +# 299 "ctab.mly" + ( _3 :: _1 ) +# 1158 "ctab.ml" + : 'init_declarator_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'declarator) in + Obj.repr( +# 302 "ctab.mly" + ( _1 ) +# 1165 "ctab.ml" + : 'init_declarator)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'identifier) in + Obj.repr( +# 305 "ctab.mly" + ( let loc, x = _1 in CDECL (loc, x) ) +# 1172 "ctab.ml" + : 'declarator)) +; (fun __caml_parser_env -> + Obj.repr( +# 308 "ctab.mly" + ( () ) +# 1178 "ctab.ml" + : 'type_specifier)) +; (fun __caml_parser_env -> + Obj.repr( +# 309 "ctab.mly" + ( () ) +# 1184 "ctab.ml" + : 'type_specifier)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'type_specifier) in + Obj.repr( +# 310 "ctab.mly" + ( () ) +# 1191 "ctab.ml" + : 'type_specifier)) +; (fun __caml_parser_env -> + Obj.repr( +# 312 "ctab.mly" + ( getloc () ) +# 1197 "ctab.ml" + : 'close_bracket)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'compound_statement) in + Obj.repr( +# 315 "ctab.mly" + ( _1 ) +# 1204 "ctab.ml" + : 'statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expression_statement) in + Obj.repr( +# 317 "ctab.mly" + ( loc_of_expr _1, CEXPR _1 ) +# 1211 "ctab.ml" + : 'statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'selection_statement) in + Obj.repr( +# 319 "ctab.mly" + ( _1 ) +# 1218 "ctab.ml" + : 'statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'iteration_statement) in + Obj.repr( +# 321 "ctab.mly" + ( _1 ) +# 1225 "ctab.ml" + : 'statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'jump_statement) in + Obj.repr( +# 323 "ctab.mly" + ( _1 ) +# 1232 "ctab.ml" + : 'statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'open_brace) in + Obj.repr( +# 326 "ctab.mly" + ( _1 ) +# 1239 "ctab.ml" + : 'open_block)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'close_brace) in + Obj.repr( +# 327 "ctab.mly" + ( _1 ) +# 1246 "ctab.ml" + : 'close_block)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'open_block) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'close_block) in + Obj.repr( +# 331 "ctab.mly" + ( sup_locator _1 _2, CBLOCK ([], []) ) +# 1254 "ctab.ml" + : 'compound_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'open_block) in + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'statement_list) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'close_block) in + Obj.repr( +# 333 "ctab.mly" + ( sup_locator _1 _3, CBLOCK ([], List.rev _2) ) +# 1263 "ctab.ml" + : 'compound_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'open_block) in + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'declaration_list) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'close_block) in + Obj.repr( +# 335 "ctab.mly" + ( sup_locator _1 _3, CBLOCK (_2, []) ) +# 1272 "ctab.ml" + : 'compound_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 3 : 'open_block) in + let _2 = (Parsing.peek_val __caml_parser_env 2 : 'declaration_list) in + let _3 = (Parsing.peek_val __caml_parser_env 1 : 'statement_list) in + let _4 = (Parsing.peek_val __caml_parser_env 0 : 'close_block) in + Obj.repr( +# 337 "ctab.mly" + ( sup_locator _1 _4, CBLOCK (_2, List.rev _3) ) +# 1282 "ctab.ml" + : 'compound_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'declaration) in + Obj.repr( +# 343 "ctab.mly" + ( _1 ) +# 1289 "ctab.ml" + : 'declaration_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'declaration_list) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'declaration) in + Obj.repr( +# 345 "ctab.mly" + ( _1 @ _2 ) +# 1297 "ctab.ml" + : 'declaration_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'statement) in + Obj.repr( +# 351 "ctab.mly" + ( [_1] ) +# 1304 "ctab.ml" + : 'statement_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'statement_list) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'statement) in + Obj.repr( +# 353 "ctab.mly" + ( _2 :: _1 ) +# 1312 "ctab.ml" + : 'statement_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'semi_chr) in + Obj.repr( +# 358 "ctab.mly" + ( _1, ESEQ [] ) +# 1319 "ctab.ml" + : 'expression_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'expression) in + Obj.repr( +# 360 "ctab.mly" + ( _1 ) +# 1326 "ctab.ml" + : 'expression_statement)) +; (fun __caml_parser_env -> + Obj.repr( +# 363 "ctab.mly" + ( getloc () ) +# 1332 "ctab.ml" + : 'semi_chr)) +; (fun __caml_parser_env -> + Obj.repr( +# 365 "ctab.mly" + ( getloc () ) +# 1338 "ctab.ml" + : 'ifkw)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 4 : 'ifkw) in + let _3 = (Parsing.peek_val __caml_parser_env 2 : 'expression) in + let _5 = (Parsing.peek_val __caml_parser_env 0 : 'statement) in + Obj.repr( +# 369 "ctab.mly" + ( + sup_locator _1 (fst _5), CIF (_3, _5, + (getloc (), CBLOCK ([], []))) + ) +# 1350 "ctab.ml" + : 'selection_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 6 : 'ifkw) in + let _3 = (Parsing.peek_val __caml_parser_env 4 : 'expression) in + let _5 = (Parsing.peek_val __caml_parser_env 2 : 'statement) in + let _7 = (Parsing.peek_val __caml_parser_env 0 : 'statement) in + Obj.repr( +# 374 "ctab.mly" + ( + sup_locator _1 (fst _7), CIF (_3, _5, _7) + ) +# 1362 "ctab.ml" + : 'selection_statement)) +; (fun __caml_parser_env -> + Obj.repr( +# 379 "ctab.mly" + ( getloc () ) +# 1368 "ctab.ml" + : 'whilekw)) +; (fun __caml_parser_env -> + Obj.repr( +# 380 "ctab.mly" + ( getloc () ) +# 1374 "ctab.ml" + : 'forkw)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 4 : 'whilekw) in + let _3 = (Parsing.peek_val __caml_parser_env 2 : 'expression) in + let _4 = (Parsing.peek_val __caml_parser_env 1 : 'close_paren) in + let _5 = (Parsing.peek_val __caml_parser_env 0 : 'statement) in + Obj.repr( +# 383 "ctab.mly" + ( + let loc = sup_locator _1 (fst _5) in + loc, CWHILE (_3, _5) + ) +# 1387 "ctab.ml" + : 'iteration_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 5 : 'forkw) in + let _3 = (Parsing.peek_val __caml_parser_env 3 : 'expression_statement) in + let _4 = (Parsing.peek_val __caml_parser_env 2 : 'expression_statement) in + let _5 = (Parsing.peek_val __caml_parser_env 1 : 'close_paren) in + let _6 = (Parsing.peek_val __caml_parser_env 0 : 'statement) in + Obj.repr( +# 389 "ctab.mly" + ( + let loc = sup_locator _1 (fst _6) in + loc, CBLOCK ([], [(loc_of_expr _3, CEXPR _3); + loc, CWHILE (_4, _6)]) + ) +# 1402 "ctab.ml" + : 'iteration_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 6 : 'forkw) in + let _3 = (Parsing.peek_val __caml_parser_env 4 : 'expression_statement) in + let _4 = (Parsing.peek_val __caml_parser_env 3 : 'expression_statement) in + let _5 = (Parsing.peek_val __caml_parser_env 2 : 'expression) in + let _6 = (Parsing.peek_val __caml_parser_env 1 : 'close_paren) in + let _7 = (Parsing.peek_val __caml_parser_env 0 : 'statement) in + Obj.repr( +# 396 "ctab.mly" + ( + let loc = sup_locator _1 (fst _7) in + loc, CBLOCK ([], [(loc_of_expr _3, CEXPR _3); + loc, CWHILE (_4, + (sup_locator (loc_of_expr _5) (loc_of_expr _7), + CBLOCK ([], [_7; (loc_of_expr _5, + CEXPR _5)])))]) + ) +# 1421 "ctab.ml" + : 'iteration_statement)) +; (fun __caml_parser_env -> + Obj.repr( +# 406 "ctab.mly" + ( getloc () ) +# 1427 "ctab.ml" + : 'return)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'return) in + Obj.repr( +# 410 "ctab.mly" + ( _1, CRETURN None ) +# 1434 "ctab.ml" + : 'jump_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'return) in + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'expression) in + Obj.repr( +# 412 "ctab.mly" + ( sup_locator _1 (loc_of_expr _2), CRETURN (Some _2) ) +# 1442 "ctab.ml" + : 'jump_statement)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'external_declaration) in + Obj.repr( +# 417 "ctab.mly" + ( _1 ) +# 1449 "ctab.ml" + : (Cparse.var_declaration list))) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : (Cparse.var_declaration list)) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'external_declaration) in + Obj.repr( +# 419 "ctab.mly" + ( _1 @ _2 ) +# 1457 "ctab.ml" + : (Cparse.var_declaration list))) +; (fun __caml_parser_env -> + Obj.repr( +# 421 "ctab.mly" + ( [] ) +# 1463 "ctab.ml" + : (Cparse.var_declaration list))) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'function_definition) in + Obj.repr( +# 426 "ctab.mly" + ( [_1] ) +# 1470 "ctab.ml" + : 'external_declaration)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'declaration) in + Obj.repr( +# 428 "ctab.mly" + ( _1 ) +# 1477 "ctab.ml" + : 'external_declaration)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'type_specifier) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'declarator) in + Obj.repr( +# 431 "ctab.mly" + ( _2 ) +# 1485 "ctab.ml" + : 'parameter_declaration)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'parameter_declaration) in + Obj.repr( +# 436 "ctab.mly" + ( [_1] ) +# 1492 "ctab.ml" + : 'parameter_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'parameter_list) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'parameter_declaration) in + Obj.repr( +# 438 "ctab.mly" + ( _3 :: _1 ) +# 1500 "ctab.ml" + : 'parameter_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'parameter_list) in + Obj.repr( +# 442 "ctab.mly" + ( List.rev _1) +# 1507 "ctab.ml" + : 'parameter_type_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'parameter_list) in + Obj.repr( +# 443 "ctab.mly" + ( List.rev _1 ) +# 1514 "ctab.ml" + : 'parameter_type_list)) +; (fun __caml_parser_env -> + Obj.repr( +# 447 "ctab.mly" + ( [] ) +# 1520 "ctab.ml" + : 'parameter_declarator)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'parameter_type_list) in + Obj.repr( +# 448 "ctab.mly" + ( _2 ) +# 1527 "ctab.ml" + : 'parameter_declarator)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'type_specifier) in + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'identifier) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'parameter_declarator) in + Obj.repr( +# 452 "ctab.mly" + ( _2, _3 ) +# 1536 "ctab.ml" + : 'function_declarator)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'function_declarator) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'compound_statement) in + Obj.repr( +# 457 "ctab.mly" + ( + let (loc, var), decls = _1 in + CFUN (loc, var, decls, _2) + ) +# 1547 "ctab.ml" + : 'function_definition)) +(* Entry translation_unit *) +; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0))) +|] +let yytables = + { Parsing.actions=yyact; + Parsing.transl_const=yytransl_const; + Parsing.transl_block=yytransl_block; + Parsing.lhs=yylhs; + Parsing.len=yylen; + Parsing.defred=yydefred; + Parsing.dgoto=yydgoto; + Parsing.sindex=yysindex; + Parsing.rindex=yyrindex; + Parsing.gindex=yygindex; + Parsing.tablesize=yytablesize; + Parsing.table=yytable; + Parsing.check=yycheck; + Parsing.error_function=parse_error; + Parsing.names_const=yynames_const; + Parsing.names_block=yynames_block } +let translation_unit (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) = + (Parsing.yyparse yytables 1 lexfun lexbuf : (Cparse.var_declaration list)) +;; diff --git a/ctab.mli b/ctab.mli new file mode 100644 index 0000000..776a4ee --- /dev/null +++ b/ctab.mli @@ -0,0 +1,88 @@ +type token = + | IDENTIFIER of (string) + | TYPE_NAME of (string) + | CONSTANT of (int) + | STRING_LITERAL of (string) + | SIZEOF + | PTR_OP + | INC_OP + | DEC_OP + | LEFT_OP + | RIGHT_OP + | LE_OP + | GE_OP + | EQ_OP + | NE_OP + | AND_OP + | OR_OP + | MUL_ASSIGN + | DIV_ASSIGN + | MOD_ASSIGN + | ADD_ASSIGN + | SUB_ASSIGN + | LEFT_ASSIGN + | RIGHT_ASSIGN + | AND_ASSIGN + | XOR_ASSIGN + | OR_ASSIGN + | SEMI_CHR + | OPEN_BRACE_CHR + | CLOSE_BRACE_CHR + | COMMA_CHR + | COLON_CHR + | EQ_CHR + | OPEN_PAREN_CHR + | CLOSE_PAREN_CHR + | OPEN_BRACKET_CHR + | CLOSE_BRACKET_CHR + | DOT_CHR + | AND_CHR + | OR_CHR + | XOR_CHR + | BANG_CHR + | TILDE_CHR + | ADD_CHR + | SUB_CHR + | STAR_CHR + | DIV_CHR + | MOD_CHR + | OPEN_ANGLE_CHR + | CLOSE_ANGLE_CHR + | QUES_CHR + | TYPEDEF + | EXTERN + | STATIC + | AUTO + | REGISTER + | CHAR + | SHORT + | INTEGER + | LONG + | SIGNED + | UNSIGNED + | FLOATING + | DOUBLE + | CONST + | VOLATILE + | VOID + | STRUCT + | UNION + | ENUM + | ELLIPSIS + | EOF + | CASE + | DEFAULT + | IF + | ELSE + | SWITCH + | WHILE + | DO + | FOR + | GOTO + | CONTINUE + | BREAK + | RETURN + | ASM + +val translation_unit : + (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Cparse.var_declaration list) diff --git a/ctab.mly b/ctab.mly new file mode 100644 index 0000000..071cb73 --- /dev/null +++ b/ctab.mly @@ -0,0 +1,464 @@ +%{ + +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification + * (LSV), UMR 8643 CNRS & ENS Cachan. + * Written by Jean Goubault-Larrecq. Derived from the csur project. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the + * consequences of use of this software, no matter how awful, even if + * they arise from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + * + *) + +(* Analyse syntaxique d'un sous-ensemble (tres) reduit de C. + *) + +open Cparse +open Error + +let parse_error msg = + fatal (Some (getloc ())) msg + +%} + +%token IDENTIFIER TYPE_NAME +%token CONSTANT +%token STRING_LITERAL +%token SIZEOF +%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP +%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN +%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN +%token XOR_ASSIGN OR_ASSIGN +%token SEMI_CHR OPEN_BRACE_CHR CLOSE_BRACE_CHR COMMA_CHR COLON_CHR +%token EQ_CHR OPEN_PAREN_CHR CLOSE_PAREN_CHR OPEN_BRACKET_CHR +%token CLOSE_BRACKET_CHR DOT_CHR AND_CHR OR_CHR XOR_CHR BANG_CHR +%token TILDE_CHR ADD_CHR SUB_CHR STAR_CHR DIV_CHR MOD_CHR +%token OPEN_ANGLE_CHR CLOSE_ANGLE_CHR QUES_CHR +%token TYPEDEF EXTERN STATIC AUTO REGISTER +%token CHAR SHORT INTEGER LONG SIGNED UNSIGNED FLOATING DOUBLE CONST VOLATILE VOID +%token STRUCT UNION ENUM ELLIPSIS EOF +%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN +%token ASM + +%type <(Cparse.var_declaration list)> translation_unit + +%start translation_unit +%% + +primary_expression: + identifier { let loc, var = $1 in loc, VAR var } + | constant { let loc, cst = $1 in loc, CST cst } + | string_literal { let loc, s = $1 in loc, STRING s } + | OPEN_PAREN_CHR expression CLOSE_PAREN_CHR { $2 } + ; + +constant : CONSTANT { getloc (), $1 }; + +identifier : IDENTIFIER { getloc (), $1 }; +open_brace : OPEN_BRACE_CHR { getloc () }; +close_brace : CLOSE_BRACE_CHR { getloc () }; + +string_literal: + STRING_LITERAL { getloc (), $1 } + | STRING_LITERAL string_literal + { + let l, s = $2 in + let s2 = $1 in + (getloc (), s2^s) + } + +inc_op : INC_OP { getloc () } +dec_op : DEC_OP { getloc () } + +postfix_expression: + primary_expression { $1 } + | postfix_expression OPEN_BRACKET_CHR expression close_bracket + { sup_locator (loc_of_expr $1) $4, OP2 (S_INDEX, $1, $3) } + | identifier OPEN_PAREN_CHR close_paren + { let loc, var = $1 in + let loc1 = sup_locator loc $3 in + loc1, CALL (var, []) + } + | identifier OPEN_PAREN_CHR argument_expression_list close_paren + { let loc, var = $1 in + let loc1 = sup_locator loc $4 in + loc1, CALL (var, List.rev $3) + } + | postfix_expression inc_op + { sup_locator (loc_of_expr $1) $2, OP1 (M_POST_INC, $1) } + | postfix_expression dec_op + { sup_locator (loc_of_expr $1) $2, OP1 (M_POST_DEC, $1) } + ; + +/* Les argument_expression_list sont des listes a l'envers */ + +argument_expression_list: + assignment_expression { [$1] } + | argument_expression_list COMMA_CHR assignment_expression { + $3 :: $1 } + ; + +unary_expression: + postfix_expression { $1 } + | inc_op unary_expression + { sup_locator $1 (loc_of_expr $2), OP1 (M_PRE_INC, $2) } + | dec_op unary_expression + { sup_locator $1 (loc_of_expr $2), OP1 (M_PRE_DEC, $2) } + | unary_operator cast_expression + { + let loc, c = $1 in + let loc' = sup_locator loc (loc_of_expr $2) in + match c with + ADD_CHR -> $2 + | SUB_CHR -> loc', OP1 (M_MINUS, $2) + | BANG_CHR -> loc', EIF ($2, (loc', CST 0), (loc', CST 1)) + | TILDE_CHR -> loc', OP1 (M_NOT, $2) + | _ -> (Error.error (Some loc) "unknown unary operator"; + loc, CST 0) } + ; + +unary_operator: + add_chr { $1 } + | sub_chr { $1 } + | bang_chr { $1 } + | tilde_chr { $1 } + ; + +add_chr : ADD_CHR { getloc (), ADD_CHR } +sub_chr : SUB_CHR { getloc (), SUB_CHR } +bang_chr : BANG_CHR { getloc (), BANG_CHR } +tilde_chr : TILDE_CHR { getloc (), TILDE_CHR } + +close_paren : CLOSE_PAREN_CHR { getloc () } + +cast_expression: + unary_expression { $1 } + ; + +multiplicative_expression: + cast_expression { $1 } + | multiplicative_expression STAR_CHR cast_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + OP2 (S_MUL, $1, $3) + } + | multiplicative_expression DIV_CHR cast_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + OP2 (S_DIV, $1, $3) + } + | multiplicative_expression MOD_CHR cast_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + OP2 (S_MOD, $1, $3) + } + ; + +additive_expression: + multiplicative_expression + { $1 } + | additive_expression ADD_CHR multiplicative_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + OP2 (S_ADD, $1, $3) + } + | additive_expression SUB_CHR multiplicative_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + OP2 (S_SUB, $1, $3) + } + ; + +shift_expression: + additive_expression { $1 } + ; + +relational_expression: + shift_expression { $1 } + | relational_expression OPEN_ANGLE_CHR shift_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + CMP (C_LT, $1, $3) + } + | relational_expression CLOSE_ANGLE_CHR shift_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + CMP (C_LT, $3, $1) + } + | relational_expression LE_OP shift_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + CMP (C_LE, $1, $3) + } + | relational_expression GE_OP shift_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + CMP (C_LE, $3, $1) + } + ; + +equality_expression: + relational_expression { $1 } + | equality_expression EQ_OP relational_expression + { sup_locator (loc_of_expr $1) (loc_of_expr $3), + CMP (C_EQ, $1, $3) + } + | equality_expression NE_OP relational_expression + { + let loc = sup_locator (loc_of_expr $1) (loc_of_expr $3) in + loc, EIF ((loc, CMP (C_EQ, $1, $3)), + (loc, CST 0), + (loc, CST 1)) + } + ; + +and_expression: + equality_expression { $1 } + ; + +exclusive_or_expression: + and_expression { $1 } + ; + +inclusive_or_expression: + exclusive_or_expression { $1 } + ; + +logical_and_expression: + inclusive_or_expression { $1 } + | logical_and_expression AND_OP inclusive_or_expression + { let loc = sup_locator (loc_of_expr $1) (loc_of_expr $3) in + loc, EIF ($1, $3, (loc, CST 0)) + } + ; + +logical_or_expression: + logical_and_expression { $1 } + | logical_or_expression OR_OP logical_and_expression + { let loc = sup_locator (loc_of_expr $1) (loc_of_expr $3) in + loc, EIF ($1, (loc, CST 1), $3) + } + ; + +conditional_expression: + logical_or_expression { $1 } + | logical_or_expression QUES_CHR expression COLON_CHR conditional_expression + { + sup_locator (loc_of_expr $1) (loc_of_expr $5), + EIF ($1, $3, $5) + } + ; + +assignment_expression: + conditional_expression { $1 } + | unary_expression EQ_CHR assignment_expression + { + let locvar, left = $1 in + let loc = sup_locator locvar (loc_of_expr $3) in + match left with + VAR x -> loc, SET_VAR (x, $3) + | OP2 (S_INDEX, (_, VAR x), i) -> loc, SET_ARRAY (x, i, $3) + | _ -> + begin + Error.error (Some loc) + "Can only write assignments of the form x=e or x[e]=e'.\n"; + $3 + end + } + ; + +expression: + assignment_expression { $1 } + | expression COMMA_CHR assignment_expression + { + sup_locator (loc_of_expr $1) (loc_of_expr $3), + ESEQ [$1; $3] + } + ; + +declaration: + type_specifier optional_init_declarator_list SEMI_CHR + { List.rev $2 } + ; + +optional_init_declarator_list : + { [] } + | init_declarator_list { $1 } + ; + +/* Une init_declarator_list est une liste a l'envers de declarator. */ +init_declarator_list + : init_declarator + { [$1] } + | init_declarator_list COMMA_CHR init_declarator + { $3 :: $1 } + ; + +init_declarator: declarator { $1 }; + +declarator: + identifier { let loc, x = $1 in CDECL (loc, x) } + ; + +type_specifier: INTEGER { () } + | CHAR STAR_CHR { () } + | type_specifier STAR_CHR { () }; + +close_bracket : CLOSE_BRACKET_CHR { getloc () }; + +statement: compound_statement + { $1 } + | expression_statement + { loc_of_expr $1, CEXPR $1 } + | selection_statement + { $1 } + | iteration_statement + { $1 } + | jump_statement + { $1 } + ; + +open_block : open_brace { $1 }; +close_block : close_brace { $1 }; + +compound_statement: + open_block close_block + { sup_locator $1 $2, CBLOCK ([], []) } + | open_block statement_list close_block + { sup_locator $1 $3, CBLOCK ([], List.rev $2) } + | open_block declaration_list close_block + { sup_locator $1 $3, CBLOCK ($2, []) } + | open_block declaration_list statement_list close_block + { sup_locator $1 $4, CBLOCK ($2, List.rev $3) } + ; + +/* Une declaration_list est une liste non inversee de declaration */ +declaration_list + : declaration + { $1 } + | declaration_list declaration + { $1 @ $2 } + ; + +/* Une statement_list est une liste inversee de statement */ +statement_list + : statement + { [$1] } + | statement_list statement + { $2 :: $1 } + ; + +expression_statement: + semi_chr + { $1, ESEQ [] } + | expression SEMI_CHR + { $1 } + ; + +semi_chr : SEMI_CHR { getloc () } + +ifkw : IF { getloc () }; + +selection_statement + : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement + { + sup_locator $1 (fst $5), CIF ($3, $5, + (getloc (), CBLOCK ([], []))) + } + | ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement ELSE statement + { + sup_locator $1 (fst $7), CIF ($3, $5, $7) + } + ; + +whilekw : WHILE { getloc () }; +forkw : FOR { getloc () }; + +iteration_statement: whilekw OPEN_PAREN_CHR expression close_paren statement + { + let loc = sup_locator $1 (fst $5) in + loc, CWHILE ($3, $5) + } + | forkw OPEN_PAREN_CHR expression_statement expression_statement close_paren statement + /* for (e0; e; ) c == e0; while (e) c; */ + { + let loc = sup_locator $1 (fst $6) in + loc, CBLOCK ([], [(loc_of_expr $3, CEXPR $3); + loc, CWHILE ($4, $6)]) + } + | forkw OPEN_PAREN_CHR expression_statement expression_statement expression close_paren statement + /* for (e0; e; e1) c == e0; while (e) { c; e1 } */ + { + let loc = sup_locator $1 (fst $7) in + loc, CBLOCK ([], [(loc_of_expr $3, CEXPR $3); + loc, CWHILE ($4, + (sup_locator (loc_of_expr $5) (loc_of_expr $7), + CBLOCK ([], [$7; (loc_of_expr $5, + CEXPR $5)])))]) + } + ; + +return : RETURN { getloc () }; + +jump_statement: + return SEMI_CHR + { $1, CRETURN None } + | return expression SEMI_CHR + { sup_locator $1 (loc_of_expr $2), CRETURN (Some $2) } + ; + +translation_unit: + external_declaration + { $1 } + | translation_unit external_declaration + { $1 @ $2 } + | EOF + { [] } + ; + +external_declaration + : function_definition + { [$1] } + | declaration + { $1 } + ; + +parameter_declaration: type_specifier declarator { $2 }; + +/*!!!should check no repeated param name! */ +/* Une parameter_list est une liste inversee de parameter_list. */ +parameter_list: parameter_declaration + { [$1] } + | parameter_list COMMA_CHR parameter_declaration + { $3 :: $1 } + ; + +parameter_type_list + : parameter_list { List.rev $1} + | parameter_list COMMA_CHR ELLIPSIS { List.rev $1 } + ; + +parameter_declarator : + OPEN_PAREN_CHR CLOSE_PAREN_CHR { [] } + | OPEN_PAREN_CHR parameter_type_list CLOSE_PAREN_CHR { $2 } + ; + +function_declarator : type_specifier identifier parameter_declarator + { $2, $3 } + ; + +function_definition + : function_declarator compound_statement + { + let (loc, var), decls = $1 in + CFUN (loc, var, decls, $2) + } + ; + + +%% diff --git a/ctab.output b/ctab.output new file mode 100644 index 0000000..81b5d62 --- /dev/null +++ b/ctab.output @@ -0,0 +1,3223 @@ + 0 $accept : %entry% $end + + 1 primary_expression : identifier + 2 | constant + 3 | string_literal + 4 | OPEN_PAREN_CHR expression CLOSE_PAREN_CHR + + 5 constant : CONSTANT + + 6 identifier : IDENTIFIER + + 7 open_brace : OPEN_BRACE_CHR + + 8 close_brace : CLOSE_BRACE_CHR + + 9 string_literal : STRING_LITERAL + 10 | STRING_LITERAL string_literal + + 11 inc_op : INC_OP + + 12 dec_op : DEC_OP + + 13 postfix_expression : primary_expression + 14 | postfix_expression OPEN_BRACKET_CHR expression close_bracket + 15 | identifier OPEN_PAREN_CHR close_paren + 16 | identifier OPEN_PAREN_CHR argument_expression_list close_paren + 17 | postfix_expression inc_op + 18 | postfix_expression dec_op + + 19 argument_expression_list : assignment_expression + 20 | argument_expression_list COMMA_CHR assignment_expression + + 21 unary_expression : postfix_expression + 22 | inc_op unary_expression + 23 | dec_op unary_expression + 24 | unary_operator cast_expression + + 25 unary_operator : add_chr + 26 | sub_chr + 27 | bang_chr + 28 | tilde_chr + + 29 add_chr : ADD_CHR + + 30 sub_chr : SUB_CHR + + 31 bang_chr : BANG_CHR + + 32 tilde_chr : TILDE_CHR + + 33 close_paren : CLOSE_PAREN_CHR + + 34 cast_expression : unary_expression + + 35 multiplicative_expression : cast_expression + 36 | multiplicative_expression STAR_CHR cast_expression + 37 | multiplicative_expression DIV_CHR cast_expression + 38 | multiplicative_expression MOD_CHR cast_expression + + 39 additive_expression : multiplicative_expression + 40 | additive_expression ADD_CHR multiplicative_expression + 41 | additive_expression SUB_CHR multiplicative_expression + + 42 shift_expression : additive_expression + + 43 relational_expression : shift_expression + 44 | relational_expression OPEN_ANGLE_CHR shift_expression + 45 | relational_expression CLOSE_ANGLE_CHR shift_expression + 46 | relational_expression LE_OP shift_expression + 47 | relational_expression GE_OP shift_expression + + 48 equality_expression : relational_expression + 49 | equality_expression EQ_OP relational_expression + 50 | equality_expression NE_OP relational_expression + + 51 and_expression : equality_expression + + 52 exclusive_or_expression : and_expression + + 53 inclusive_or_expression : exclusive_or_expression + + 54 logical_and_expression : inclusive_or_expression + 55 | logical_and_expression AND_OP inclusive_or_expression + + 56 logical_or_expression : logical_and_expression + 57 | logical_or_expression OR_OP logical_and_expression + + 58 conditional_expression : logical_or_expression + 59 | logical_or_expression QUES_CHR expression COLON_CHR conditional_expression + + 60 assignment_expression : conditional_expression + 61 | unary_expression EQ_CHR assignment_expression + + 62 expression : assignment_expression + 63 | expression COMMA_CHR assignment_expression + + 64 declaration : type_specifier optional_init_declarator_list SEMI_CHR + + 65 optional_init_declarator_list : + 66 | init_declarator_list + + 67 init_declarator_list : init_declarator + 68 | init_declarator_list COMMA_CHR init_declarator + + 69 init_declarator : declarator + + 70 declarator : identifier + + 71 type_specifier : INTEGER + 72 | CHAR STAR_CHR + 73 | type_specifier STAR_CHR + + 74 close_bracket : CLOSE_BRACKET_CHR + + 75 statement : compound_statement + 76 | expression_statement + 77 | selection_statement + 78 | iteration_statement + 79 | jump_statement + + 80 open_block : open_brace + + 81 close_block : close_brace + + 82 compound_statement : open_block close_block + 83 | open_block statement_list close_block + 84 | open_block declaration_list close_block + 85 | open_block declaration_list statement_list close_block + + 86 declaration_list : declaration + 87 | declaration_list declaration + + 88 statement_list : statement + 89 | statement_list statement + + 90 expression_statement : semi_chr + 91 | expression SEMI_CHR + + 92 semi_chr : SEMI_CHR + + 93 ifkw : IF + + 94 selection_statement : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement + 95 | ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement ELSE statement + + 96 whilekw : WHILE + + 97 forkw : FOR + + 98 iteration_statement : whilekw OPEN_PAREN_CHR expression close_paren statement + 99 | forkw OPEN_PAREN_CHR expression_statement expression_statement close_paren statement + 100 | forkw OPEN_PAREN_CHR expression_statement expression_statement expression close_paren statement + + 101 return : RETURN + + 102 jump_statement : return SEMI_CHR + 103 | return expression SEMI_CHR + + 104 translation_unit : external_declaration + 105 | translation_unit external_declaration + 106 | EOF + + 107 external_declaration : function_definition + 108 | declaration + + 109 parameter_declaration : type_specifier declarator + + 110 parameter_list : parameter_declaration + 111 | parameter_list COMMA_CHR parameter_declaration + + 112 parameter_type_list : parameter_list + 113 | parameter_list COMMA_CHR ELLIPSIS + + 114 parameter_declarator : OPEN_PAREN_CHR CLOSE_PAREN_CHR + 115 | OPEN_PAREN_CHR parameter_type_list CLOSE_PAREN_CHR + + 116 function_declarator : type_specifier identifier parameter_declarator + + 117 function_definition : function_declarator compound_statement + + 118 %entry% : '\001' translation_unit + +state 0 + $accept : . %entry% $end (0) + + '\001' shift 1 + . error + + %entry% goto 2 + + +state 1 + %entry% : '\001' . translation_unit (118) + + CHAR shift 3 + INTEGER shift 4 + EOF shift 5 + . error + + translation_unit goto 6 + declaration goto 7 + type_specifier goto 8 + external_declaration goto 9 + function_definition goto 10 + function_declarator goto 11 + + +state 2 + $accept : %entry% . $end (0) + + $end accept + + +state 3 + type_specifier : CHAR . STAR_CHR (72) + + STAR_CHR shift 12 + . error + + +state 4 + type_specifier : INTEGER . (71) + + . reduce 71 + + +state 5 + translation_unit : EOF . (106) + + . reduce 106 + + +state 6 + translation_unit : translation_unit . external_declaration (105) + %entry% : '\001' translation_unit . (118) + + CHAR shift 3 + INTEGER shift 4 + $end reduce 118 + + declaration goto 7 + type_specifier goto 8 + external_declaration goto 13 + function_definition goto 10 + function_declarator goto 11 + + +state 7 + external_declaration : declaration . (108) + + . reduce 108 + + +state 8 + declaration : type_specifier . optional_init_declarator_list SEMI_CHR (64) + type_specifier : type_specifier . STAR_CHR (73) + function_declarator : type_specifier . identifier parameter_declarator (116) + optional_init_declarator_list : . (65) + + IDENTIFIER shift 14 + STAR_CHR shift 15 + SEMI_CHR reduce 65 + + identifier goto 16 + optional_init_declarator_list goto 17 + init_declarator_list goto 18 + init_declarator goto 19 + declarator goto 20 + + +state 9 + translation_unit : external_declaration . (104) + + . reduce 104 + + +state 10 + external_declaration : function_definition . (107) + + . reduce 107 + + +state 11 + function_definition : function_declarator . compound_statement (117) + + OPEN_BRACE_CHR shift 21 + . error + + open_brace goto 22 + compound_statement goto 23 + open_block goto 24 + + +state 12 + type_specifier : CHAR STAR_CHR . (72) + + . reduce 72 + + +state 13 + translation_unit : translation_unit external_declaration . (105) + + . reduce 105 + + +state 14 + identifier : IDENTIFIER . (6) + + . reduce 6 + + +state 15 + type_specifier : type_specifier STAR_CHR . (73) + + . reduce 73 + + +state 16 + declarator : identifier . (70) + function_declarator : type_specifier identifier . parameter_declarator (116) + + OPEN_PAREN_CHR shift 25 + SEMI_CHR reduce 70 + COMMA_CHR reduce 70 + + parameter_declarator goto 26 + + +state 17 + declaration : type_specifier optional_init_declarator_list . SEMI_CHR (64) + + SEMI_CHR shift 27 + . error + + +state 18 + optional_init_declarator_list : init_declarator_list . (66) + init_declarator_list : init_declarator_list . COMMA_CHR init_declarator (68) + + COMMA_CHR shift 28 + SEMI_CHR reduce 66 + + +state 19 + init_declarator_list : init_declarator . (67) + + . reduce 67 + + +state 20 + init_declarator : declarator . (69) + + . reduce 69 + + +state 21 + open_brace : OPEN_BRACE_CHR . (7) + + . reduce 7 + + +state 22 + open_block : open_brace . (80) + + . reduce 80 + + +state 23 + function_definition : function_declarator compound_statement . (117) + + . reduce 117 + + +state 24 + compound_statement : open_block . close_block (82) + compound_statement : open_block . statement_list close_block (83) + compound_statement : open_block . declaration_list close_block (84) + compound_statement : open_block . declaration_list statement_list close_block (85) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + CLOSE_BRACE_CHR shift 34 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + CHAR shift 3 + INTEGER shift 4 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + close_brace goto 49 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + declaration goto 72 + type_specifier goto 73 + statement goto 74 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + close_block goto 80 + statement_list goto 81 + declaration_list goto 82 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 25 + parameter_declarator : OPEN_PAREN_CHR . CLOSE_PAREN_CHR (114) + parameter_declarator : OPEN_PAREN_CHR . parameter_type_list CLOSE_PAREN_CHR (115) + + CLOSE_PAREN_CHR shift 88 + CHAR shift 3 + INTEGER shift 4 + . error + + type_specifier goto 89 + parameter_declaration goto 90 + parameter_list goto 91 + parameter_type_list goto 92 + + +state 26 + function_declarator : type_specifier identifier parameter_declarator . (116) + + . reduce 116 + + +state 27 + declaration : type_specifier optional_init_declarator_list SEMI_CHR . (64) + + . reduce 64 + + +state 28 + init_declarator_list : init_declarator_list COMMA_CHR . init_declarator (68) + + IDENTIFIER shift 14 + . error + + identifier goto 93 + init_declarator goto 94 + declarator goto 20 + + +state 29 + constant : CONSTANT . (5) + + . reduce 5 + + +state 30 + string_literal : STRING_LITERAL . (9) + string_literal : STRING_LITERAL . string_literal (10) + + STRING_LITERAL shift 30 + INC_OP reduce 9 + DEC_OP reduce 9 + LE_OP reduce 9 + GE_OP reduce 9 + EQ_OP reduce 9 + NE_OP reduce 9 + AND_OP reduce 9 + OR_OP reduce 9 + SEMI_CHR reduce 9 + COMMA_CHR reduce 9 + COLON_CHR reduce 9 + EQ_CHR reduce 9 + CLOSE_PAREN_CHR reduce 9 + OPEN_BRACKET_CHR reduce 9 + CLOSE_BRACKET_CHR reduce 9 + ADD_CHR reduce 9 + SUB_CHR reduce 9 + STAR_CHR reduce 9 + DIV_CHR reduce 9 + MOD_CHR reduce 9 + OPEN_ANGLE_CHR reduce 9 + CLOSE_ANGLE_CHR reduce 9 + QUES_CHR reduce 9 + + string_literal goto 95 + + +state 31 + inc_op : INC_OP . (11) + + . reduce 11 + + +state 32 + dec_op : DEC_OP . (12) + + . reduce 12 + + +state 33 + semi_chr : SEMI_CHR . (92) + + . reduce 92 + + +state 34 + close_brace : CLOSE_BRACE_CHR . (8) + + . reduce 8 + + +state 35 + primary_expression : OPEN_PAREN_CHR . expression CLOSE_PAREN_CHR (4) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 96 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 36 + bang_chr : BANG_CHR . (31) + + . reduce 31 + + +state 37 + tilde_chr : TILDE_CHR . (32) + + . reduce 32 + + +state 38 + add_chr : ADD_CHR . (29) + + . reduce 29 + + +state 39 + sub_chr : SUB_CHR . (30) + + . reduce 30 + + +state 40 + ifkw : IF . (93) + + . reduce 93 + + +state 41 + whilekw : WHILE . (96) + + . reduce 96 + + +state 42 + forkw : FOR . (97) + + . reduce 97 + + +state 43 + return : RETURN . (101) + + . reduce 101 + + +state 44 + postfix_expression : primary_expression . (13) + + . reduce 13 + + +state 45 + primary_expression : identifier . (1) + postfix_expression : identifier . OPEN_PAREN_CHR close_paren (15) + postfix_expression : identifier . OPEN_PAREN_CHR argument_expression_list close_paren (16) + + OPEN_PAREN_CHR shift 97 + INC_OP reduce 1 + DEC_OP reduce 1 + LE_OP reduce 1 + GE_OP reduce 1 + EQ_OP reduce 1 + NE_OP reduce 1 + AND_OP reduce 1 + OR_OP reduce 1 + SEMI_CHR reduce 1 + COMMA_CHR reduce 1 + COLON_CHR reduce 1 + EQ_CHR reduce 1 + CLOSE_PAREN_CHR reduce 1 + OPEN_BRACKET_CHR reduce 1 + CLOSE_BRACKET_CHR reduce 1 + ADD_CHR reduce 1 + SUB_CHR reduce 1 + STAR_CHR reduce 1 + DIV_CHR reduce 1 + MOD_CHR reduce 1 + OPEN_ANGLE_CHR reduce 1 + CLOSE_ANGLE_CHR reduce 1 + QUES_CHR reduce 1 + + +state 46 + primary_expression : constant . (2) + + . reduce 2 + + +state 47 + primary_expression : string_literal . (3) + + . reduce 3 + + +state 48 + expression : expression . COMMA_CHR assignment_expression (63) + expression_statement : expression . SEMI_CHR (91) + + SEMI_CHR shift 98 + COMMA_CHR shift 99 + . error + + +state 49 + close_block : close_brace . (81) + + . reduce 81 + + +state 50 + unary_expression : inc_op . unary_expression (22) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 100 + unary_operator goto 55 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + + +state 51 + unary_expression : dec_op . unary_expression (23) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 101 + unary_operator goto 55 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + + +state 52 + postfix_expression : postfix_expression . OPEN_BRACKET_CHR expression close_bracket (14) + postfix_expression : postfix_expression . inc_op (17) + postfix_expression : postfix_expression . dec_op (18) + unary_expression : postfix_expression . (21) + + INC_OP shift 31 + DEC_OP shift 32 + OPEN_BRACKET_CHR shift 102 + LE_OP reduce 21 + GE_OP reduce 21 + EQ_OP reduce 21 + NE_OP reduce 21 + AND_OP reduce 21 + OR_OP reduce 21 + SEMI_CHR reduce 21 + COMMA_CHR reduce 21 + COLON_CHR reduce 21 + EQ_CHR reduce 21 + CLOSE_PAREN_CHR reduce 21 + CLOSE_BRACKET_CHR reduce 21 + ADD_CHR reduce 21 + SUB_CHR reduce 21 + STAR_CHR reduce 21 + DIV_CHR reduce 21 + MOD_CHR reduce 21 + OPEN_ANGLE_CHR reduce 21 + CLOSE_ANGLE_CHR reduce 21 + QUES_CHR reduce 21 + + inc_op goto 103 + dec_op goto 104 + + +state 53 + expression : assignment_expression . (62) + + . reduce 62 + + +state 54 + cast_expression : unary_expression . (34) + assignment_expression : unary_expression . EQ_CHR assignment_expression (61) + + EQ_CHR shift 105 + LE_OP reduce 34 + GE_OP reduce 34 + EQ_OP reduce 34 + NE_OP reduce 34 + AND_OP reduce 34 + OR_OP reduce 34 + SEMI_CHR reduce 34 + COMMA_CHR reduce 34 + COLON_CHR reduce 34 + CLOSE_PAREN_CHR reduce 34 + CLOSE_BRACKET_CHR reduce 34 + ADD_CHR reduce 34 + SUB_CHR reduce 34 + STAR_CHR reduce 34 + DIV_CHR reduce 34 + MOD_CHR reduce 34 + OPEN_ANGLE_CHR reduce 34 + CLOSE_ANGLE_CHR reduce 34 + QUES_CHR reduce 34 + + +state 55 + unary_expression : unary_operator . cast_expression (24) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 107 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + + +state 56 + multiplicative_expression : cast_expression . (35) + + . reduce 35 + + +state 57 + unary_operator : add_chr . (25) + + . reduce 25 + + +state 58 + unary_operator : sub_chr . (26) + + . reduce 26 + + +state 59 + unary_operator : bang_chr . (27) + + . reduce 27 + + +state 60 + unary_operator : tilde_chr . (28) + + . reduce 28 + + +state 61 + multiplicative_expression : multiplicative_expression . STAR_CHR cast_expression (36) + multiplicative_expression : multiplicative_expression . DIV_CHR cast_expression (37) + multiplicative_expression : multiplicative_expression . MOD_CHR cast_expression (38) + additive_expression : multiplicative_expression . (39) + + STAR_CHR shift 108 + DIV_CHR shift 109 + MOD_CHR shift 110 + LE_OP reduce 39 + GE_OP reduce 39 + EQ_OP reduce 39 + NE_OP reduce 39 + AND_OP reduce 39 + OR_OP reduce 39 + SEMI_CHR reduce 39 + COMMA_CHR reduce 39 + COLON_CHR reduce 39 + CLOSE_PAREN_CHR reduce 39 + CLOSE_BRACKET_CHR reduce 39 + ADD_CHR reduce 39 + SUB_CHR reduce 39 + OPEN_ANGLE_CHR reduce 39 + CLOSE_ANGLE_CHR reduce 39 + QUES_CHR reduce 39 + + +state 62 + additive_expression : additive_expression . ADD_CHR multiplicative_expression (40) + additive_expression : additive_expression . SUB_CHR multiplicative_expression (41) + shift_expression : additive_expression . (42) + + ADD_CHR shift 111 + SUB_CHR shift 112 + LE_OP reduce 42 + GE_OP reduce 42 + EQ_OP reduce 42 + NE_OP reduce 42 + AND_OP reduce 42 + OR_OP reduce 42 + SEMI_CHR reduce 42 + COMMA_CHR reduce 42 + COLON_CHR reduce 42 + CLOSE_PAREN_CHR reduce 42 + CLOSE_BRACKET_CHR reduce 42 + OPEN_ANGLE_CHR reduce 42 + CLOSE_ANGLE_CHR reduce 42 + QUES_CHR reduce 42 + + +state 63 + relational_expression : shift_expression . (43) + + . reduce 43 + + +state 64 + relational_expression : relational_expression . OPEN_ANGLE_CHR shift_expression (44) + relational_expression : relational_expression . CLOSE_ANGLE_CHR shift_expression (45) + relational_expression : relational_expression . LE_OP shift_expression (46) + relational_expression : relational_expression . GE_OP shift_expression (47) + equality_expression : relational_expression . (48) + + LE_OP shift 113 + GE_OP shift 114 + OPEN_ANGLE_CHR shift 115 + CLOSE_ANGLE_CHR shift 116 + EQ_OP reduce 48 + NE_OP reduce 48 + AND_OP reduce 48 + OR_OP reduce 48 + SEMI_CHR reduce 48 + COMMA_CHR reduce 48 + COLON_CHR reduce 48 + CLOSE_PAREN_CHR reduce 48 + CLOSE_BRACKET_CHR reduce 48 + QUES_CHR reduce 48 + + +state 65 + equality_expression : equality_expression . EQ_OP relational_expression (49) + equality_expression : equality_expression . NE_OP relational_expression (50) + and_expression : equality_expression . (51) + + EQ_OP shift 117 + NE_OP shift 118 + AND_OP reduce 51 + OR_OP reduce 51 + SEMI_CHR reduce 51 + COMMA_CHR reduce 51 + COLON_CHR reduce 51 + CLOSE_PAREN_CHR reduce 51 + CLOSE_BRACKET_CHR reduce 51 + QUES_CHR reduce 51 + + +state 66 + exclusive_or_expression : and_expression . (52) + + . reduce 52 + + +state 67 + inclusive_or_expression : exclusive_or_expression . (53) + + . reduce 53 + + +state 68 + logical_and_expression : inclusive_or_expression . (54) + + . reduce 54 + + +state 69 + logical_and_expression : logical_and_expression . AND_OP inclusive_or_expression (55) + logical_or_expression : logical_and_expression . (56) + + AND_OP shift 119 + OR_OP reduce 56 + SEMI_CHR reduce 56 + COMMA_CHR reduce 56 + COLON_CHR reduce 56 + CLOSE_PAREN_CHR reduce 56 + CLOSE_BRACKET_CHR reduce 56 + QUES_CHR reduce 56 + + +state 70 + logical_or_expression : logical_or_expression . OR_OP logical_and_expression (57) + conditional_expression : logical_or_expression . (58) + conditional_expression : logical_or_expression . QUES_CHR expression COLON_CHR conditional_expression (59) + + OR_OP shift 120 + QUES_CHR shift 121 + SEMI_CHR reduce 58 + COMMA_CHR reduce 58 + COLON_CHR reduce 58 + CLOSE_PAREN_CHR reduce 58 + CLOSE_BRACKET_CHR reduce 58 + + +state 71 + assignment_expression : conditional_expression . (60) + + . reduce 60 + + +state 72 + declaration_list : declaration . (86) + + . reduce 86 + + +state 73 + declaration : type_specifier . optional_init_declarator_list SEMI_CHR (64) + type_specifier : type_specifier . STAR_CHR (73) + optional_init_declarator_list : . (65) + + IDENTIFIER shift 14 + STAR_CHR shift 15 + SEMI_CHR reduce 65 + + identifier goto 93 + optional_init_declarator_list goto 17 + init_declarator_list goto 18 + init_declarator goto 19 + declarator goto 20 + + +state 74 + statement_list : statement . (88) + + . reduce 88 + + +state 75 + statement : compound_statement . (75) + + . reduce 75 + + +state 76 + statement : expression_statement . (76) + + . reduce 76 + + +state 77 + statement : selection_statement . (77) + + . reduce 77 + + +state 78 + statement : iteration_statement . (78) + + . reduce 78 + + +state 79 + statement : jump_statement . (79) + + . reduce 79 + + +state 80 + compound_statement : open_block close_block . (82) + + . reduce 82 + + +state 81 + compound_statement : open_block statement_list . close_block (83) + statement_list : statement_list . statement (89) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + CLOSE_BRACE_CHR shift 34 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + close_brace goto 49 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + statement goto 122 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + close_block goto 123 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 82 + compound_statement : open_block declaration_list . close_block (84) + compound_statement : open_block declaration_list . statement_list close_block (85) + declaration_list : declaration_list . declaration (87) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + CLOSE_BRACE_CHR shift 34 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + CHAR shift 3 + INTEGER shift 4 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + close_brace goto 49 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + declaration goto 124 + type_specifier goto 73 + statement goto 74 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + close_block goto 125 + statement_list goto 126 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 83 + expression_statement : semi_chr . (90) + + . reduce 90 + + +state 84 + selection_statement : ifkw . OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement (94) + selection_statement : ifkw . OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement ELSE statement (95) + + OPEN_PAREN_CHR shift 127 + . error + + +state 85 + iteration_statement : whilekw . OPEN_PAREN_CHR expression close_paren statement (98) + + OPEN_PAREN_CHR shift 128 + . error + + +state 86 + iteration_statement : forkw . OPEN_PAREN_CHR expression_statement expression_statement close_paren statement (99) + iteration_statement : forkw . OPEN_PAREN_CHR expression_statement expression_statement expression close_paren statement (100) + + OPEN_PAREN_CHR shift 129 + . error + + +state 87 + jump_statement : return . SEMI_CHR (102) + jump_statement : return . expression SEMI_CHR (103) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 130 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 131 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 88 + parameter_declarator : OPEN_PAREN_CHR CLOSE_PAREN_CHR . (114) + + . reduce 114 + + +state 89 + type_specifier : type_specifier . STAR_CHR (73) + parameter_declaration : type_specifier . declarator (109) + + IDENTIFIER shift 14 + STAR_CHR shift 15 + . error + + identifier goto 93 + declarator goto 132 + + +state 90 + parameter_list : parameter_declaration . (110) + + . reduce 110 + + +state 91 + parameter_list : parameter_list . COMMA_CHR parameter_declaration (111) + parameter_type_list : parameter_list . (112) + parameter_type_list : parameter_list . COMMA_CHR ELLIPSIS (113) + + COMMA_CHR shift 133 + CLOSE_PAREN_CHR reduce 112 + + +state 92 + parameter_declarator : OPEN_PAREN_CHR parameter_type_list . CLOSE_PAREN_CHR (115) + + CLOSE_PAREN_CHR shift 134 + . error + + +state 93 + declarator : identifier . (70) + + . reduce 70 + + +state 94 + init_declarator_list : init_declarator_list COMMA_CHR init_declarator . (68) + + . reduce 68 + + +state 95 + string_literal : STRING_LITERAL string_literal . (10) + + . reduce 10 + + +state 96 + primary_expression : OPEN_PAREN_CHR expression . CLOSE_PAREN_CHR (4) + expression : expression . COMMA_CHR assignment_expression (63) + + COMMA_CHR shift 99 + CLOSE_PAREN_CHR shift 135 + . error + + +state 97 + postfix_expression : identifier OPEN_PAREN_CHR . close_paren (15) + postfix_expression : identifier OPEN_PAREN_CHR . argument_expression_list close_paren (16) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + CLOSE_PAREN_CHR shift 136 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + close_paren goto 137 + argument_expression_list goto 138 + assignment_expression goto 139 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 98 + expression_statement : expression SEMI_CHR . (91) + + . reduce 91 + + +state 99 + expression : expression COMMA_CHR . assignment_expression (63) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 140 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 100 + unary_expression : inc_op unary_expression . (22) + + . reduce 22 + + +state 101 + unary_expression : dec_op unary_expression . (23) + + . reduce 23 + + +state 102 + postfix_expression : postfix_expression OPEN_BRACKET_CHR . expression close_bracket (14) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 141 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 103 + postfix_expression : postfix_expression inc_op . (17) + + . reduce 17 + + +state 104 + postfix_expression : postfix_expression dec_op . (18) + + . reduce 18 + + +state 105 + assignment_expression : unary_expression EQ_CHR . assignment_expression (61) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 142 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 106 + cast_expression : unary_expression . (34) + + . reduce 34 + + +state 107 + unary_expression : unary_operator cast_expression . (24) + + . reduce 24 + + +state 108 + multiplicative_expression : multiplicative_expression STAR_CHR . cast_expression (36) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 143 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + + +state 109 + multiplicative_expression : multiplicative_expression DIV_CHR . cast_expression (37) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 144 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + + +state 110 + multiplicative_expression : multiplicative_expression MOD_CHR . cast_expression (38) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 145 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + + +state 111 + additive_expression : additive_expression ADD_CHR . multiplicative_expression (40) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 146 + + +state 112 + additive_expression : additive_expression SUB_CHR . multiplicative_expression (41) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 147 + + +state 113 + relational_expression : relational_expression LE_OP . shift_expression (46) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 148 + + +state 114 + relational_expression : relational_expression GE_OP . shift_expression (47) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 149 + + +state 115 + relational_expression : relational_expression OPEN_ANGLE_CHR . shift_expression (44) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 150 + + +state 116 + relational_expression : relational_expression CLOSE_ANGLE_CHR . shift_expression (45) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 151 + + +state 117 + equality_expression : equality_expression EQ_OP . relational_expression (49) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 152 + + +state 118 + equality_expression : equality_expression NE_OP . relational_expression (50) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 153 + + +state 119 + logical_and_expression : logical_and_expression AND_OP . inclusive_or_expression (55) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 154 + + +state 120 + logical_or_expression : logical_or_expression OR_OP . logical_and_expression (57) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 155 + + +state 121 + conditional_expression : logical_or_expression QUES_CHR . expression COLON_CHR conditional_expression (59) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 156 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 122 + statement_list : statement_list statement . (89) + + . reduce 89 + + +state 123 + compound_statement : open_block statement_list close_block . (83) + + . reduce 83 + + +state 124 + declaration_list : declaration_list declaration . (87) + + . reduce 87 + + +state 125 + compound_statement : open_block declaration_list close_block . (84) + + . reduce 84 + + +state 126 + compound_statement : open_block declaration_list statement_list . close_block (85) + statement_list : statement_list . statement (89) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + CLOSE_BRACE_CHR shift 34 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + close_brace goto 49 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + statement goto 122 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + close_block goto 157 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 127 + selection_statement : ifkw OPEN_PAREN_CHR . expression CLOSE_PAREN_CHR statement (94) + selection_statement : ifkw OPEN_PAREN_CHR . expression CLOSE_PAREN_CHR statement ELSE statement (95) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 158 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 128 + iteration_statement : whilekw OPEN_PAREN_CHR . expression close_paren statement (98) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 159 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 129 + iteration_statement : forkw OPEN_PAREN_CHR . expression_statement expression_statement close_paren statement (99) + iteration_statement : forkw OPEN_PAREN_CHR . expression_statement expression_statement expression close_paren statement (100) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + expression_statement goto 160 + semi_chr goto 83 + + +state 130 + jump_statement : return SEMI_CHR . (102) + + . reduce 102 + + +state 131 + expression : expression . COMMA_CHR assignment_expression (63) + jump_statement : return expression . SEMI_CHR (103) + + SEMI_CHR shift 161 + COMMA_CHR shift 99 + . error + + +state 132 + parameter_declaration : type_specifier declarator . (109) + + . reduce 109 + + +state 133 + parameter_list : parameter_list COMMA_CHR . parameter_declaration (111) + parameter_type_list : parameter_list COMMA_CHR . ELLIPSIS (113) + + CHAR shift 3 + INTEGER shift 4 + ELLIPSIS shift 162 + . error + + type_specifier goto 89 + parameter_declaration goto 163 + + +state 134 + parameter_declarator : OPEN_PAREN_CHR parameter_type_list CLOSE_PAREN_CHR . (115) + + . reduce 115 + + +state 135 + primary_expression : OPEN_PAREN_CHR expression CLOSE_PAREN_CHR . (4) + + . reduce 4 + + +state 136 + close_paren : CLOSE_PAREN_CHR . (33) + + . reduce 33 + + +state 137 + postfix_expression : identifier OPEN_PAREN_CHR close_paren . (15) + + . reduce 15 + + +state 138 + postfix_expression : identifier OPEN_PAREN_CHR argument_expression_list . close_paren (16) + argument_expression_list : argument_expression_list . COMMA_CHR assignment_expression (20) + + COMMA_CHR shift 164 + CLOSE_PAREN_CHR shift 136 + . error + + close_paren goto 165 + + +state 139 + argument_expression_list : assignment_expression . (19) + + . reduce 19 + + +state 140 + expression : expression COMMA_CHR assignment_expression . (63) + + . reduce 63 + + +state 141 + postfix_expression : postfix_expression OPEN_BRACKET_CHR expression . close_bracket (14) + expression : expression . COMMA_CHR assignment_expression (63) + + COMMA_CHR shift 99 + CLOSE_BRACKET_CHR shift 166 + . error + + close_bracket goto 167 + + +state 142 + assignment_expression : unary_expression EQ_CHR assignment_expression . (61) + + . reduce 61 + + +state 143 + multiplicative_expression : multiplicative_expression STAR_CHR cast_expression . (36) + + . reduce 36 + + +state 144 + multiplicative_expression : multiplicative_expression DIV_CHR cast_expression . (37) + + . reduce 37 + + +state 145 + multiplicative_expression : multiplicative_expression MOD_CHR cast_expression . (38) + + . reduce 38 + + +state 146 + multiplicative_expression : multiplicative_expression . STAR_CHR cast_expression (36) + multiplicative_expression : multiplicative_expression . DIV_CHR cast_expression (37) + multiplicative_expression : multiplicative_expression . MOD_CHR cast_expression (38) + additive_expression : additive_expression ADD_CHR multiplicative_expression . (40) + + STAR_CHR shift 108 + DIV_CHR shift 109 + MOD_CHR shift 110 + LE_OP reduce 40 + GE_OP reduce 40 + EQ_OP reduce 40 + NE_OP reduce 40 + AND_OP reduce 40 + OR_OP reduce 40 + SEMI_CHR reduce 40 + COMMA_CHR reduce 40 + COLON_CHR reduce 40 + CLOSE_PAREN_CHR reduce 40 + CLOSE_BRACKET_CHR reduce 40 + ADD_CHR reduce 40 + SUB_CHR reduce 40 + OPEN_ANGLE_CHR reduce 40 + CLOSE_ANGLE_CHR reduce 40 + QUES_CHR reduce 40 + + +state 147 + multiplicative_expression : multiplicative_expression . STAR_CHR cast_expression (36) + multiplicative_expression : multiplicative_expression . DIV_CHR cast_expression (37) + multiplicative_expression : multiplicative_expression . MOD_CHR cast_expression (38) + additive_expression : additive_expression SUB_CHR multiplicative_expression . (41) + + STAR_CHR shift 108 + DIV_CHR shift 109 + MOD_CHR shift 110 + LE_OP reduce 41 + GE_OP reduce 41 + EQ_OP reduce 41 + NE_OP reduce 41 + AND_OP reduce 41 + OR_OP reduce 41 + SEMI_CHR reduce 41 + COMMA_CHR reduce 41 + COLON_CHR reduce 41 + CLOSE_PAREN_CHR reduce 41 + CLOSE_BRACKET_CHR reduce 41 + ADD_CHR reduce 41 + SUB_CHR reduce 41 + OPEN_ANGLE_CHR reduce 41 + CLOSE_ANGLE_CHR reduce 41 + QUES_CHR reduce 41 + + +state 148 + relational_expression : relational_expression LE_OP shift_expression . (46) + + . reduce 46 + + +state 149 + relational_expression : relational_expression GE_OP shift_expression . (47) + + . reduce 47 + + +state 150 + relational_expression : relational_expression OPEN_ANGLE_CHR shift_expression . (44) + + . reduce 44 + + +state 151 + relational_expression : relational_expression CLOSE_ANGLE_CHR shift_expression . (45) + + . reduce 45 + + +state 152 + relational_expression : relational_expression . OPEN_ANGLE_CHR shift_expression (44) + relational_expression : relational_expression . CLOSE_ANGLE_CHR shift_expression (45) + relational_expression : relational_expression . LE_OP shift_expression (46) + relational_expression : relational_expression . GE_OP shift_expression (47) + equality_expression : equality_expression EQ_OP relational_expression . (49) + + LE_OP shift 113 + GE_OP shift 114 + OPEN_ANGLE_CHR shift 115 + CLOSE_ANGLE_CHR shift 116 + EQ_OP reduce 49 + NE_OP reduce 49 + AND_OP reduce 49 + OR_OP reduce 49 + SEMI_CHR reduce 49 + COMMA_CHR reduce 49 + COLON_CHR reduce 49 + CLOSE_PAREN_CHR reduce 49 + CLOSE_BRACKET_CHR reduce 49 + QUES_CHR reduce 49 + + +state 153 + relational_expression : relational_expression . OPEN_ANGLE_CHR shift_expression (44) + relational_expression : relational_expression . CLOSE_ANGLE_CHR shift_expression (45) + relational_expression : relational_expression . LE_OP shift_expression (46) + relational_expression : relational_expression . GE_OP shift_expression (47) + equality_expression : equality_expression NE_OP relational_expression . (50) + + LE_OP shift 113 + GE_OP shift 114 + OPEN_ANGLE_CHR shift 115 + CLOSE_ANGLE_CHR shift 116 + EQ_OP reduce 50 + NE_OP reduce 50 + AND_OP reduce 50 + OR_OP reduce 50 + SEMI_CHR reduce 50 + COMMA_CHR reduce 50 + COLON_CHR reduce 50 + CLOSE_PAREN_CHR reduce 50 + CLOSE_BRACKET_CHR reduce 50 + QUES_CHR reduce 50 + + +state 154 + logical_and_expression : logical_and_expression AND_OP inclusive_or_expression . (55) + + . reduce 55 + + +state 155 + logical_and_expression : logical_and_expression . AND_OP inclusive_or_expression (55) + logical_or_expression : logical_or_expression OR_OP logical_and_expression . (57) + + AND_OP shift 119 + OR_OP reduce 57 + SEMI_CHR reduce 57 + COMMA_CHR reduce 57 + COLON_CHR reduce 57 + CLOSE_PAREN_CHR reduce 57 + CLOSE_BRACKET_CHR reduce 57 + QUES_CHR reduce 57 + + +state 156 + conditional_expression : logical_or_expression QUES_CHR expression . COLON_CHR conditional_expression (59) + expression : expression . COMMA_CHR assignment_expression (63) + + COMMA_CHR shift 99 + COLON_CHR shift 168 + . error + + +state 157 + compound_statement : open_block declaration_list statement_list close_block . (85) + + . reduce 85 + + +state 158 + expression : expression . COMMA_CHR assignment_expression (63) + selection_statement : ifkw OPEN_PAREN_CHR expression . CLOSE_PAREN_CHR statement (94) + selection_statement : ifkw OPEN_PAREN_CHR expression . CLOSE_PAREN_CHR statement ELSE statement (95) + + COMMA_CHR shift 99 + CLOSE_PAREN_CHR shift 169 + . error + + +state 159 + expression : expression . COMMA_CHR assignment_expression (63) + iteration_statement : whilekw OPEN_PAREN_CHR expression . close_paren statement (98) + + COMMA_CHR shift 99 + CLOSE_PAREN_CHR shift 136 + . error + + close_paren goto 170 + + +state 160 + iteration_statement : forkw OPEN_PAREN_CHR expression_statement . expression_statement close_paren statement (99) + iteration_statement : forkw OPEN_PAREN_CHR expression_statement . expression_statement expression close_paren statement (100) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + expression_statement goto 171 + semi_chr goto 83 + + +state 161 + jump_statement : return expression SEMI_CHR . (103) + + . reduce 103 + + +state 162 + parameter_type_list : parameter_list COMMA_CHR ELLIPSIS . (113) + + . reduce 113 + + +state 163 + parameter_list : parameter_list COMMA_CHR parameter_declaration . (111) + + . reduce 111 + + +state 164 + argument_expression_list : argument_expression_list COMMA_CHR . assignment_expression (20) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 172 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 165 + postfix_expression : identifier OPEN_PAREN_CHR argument_expression_list close_paren . (16) + + . reduce 16 + + +state 166 + close_bracket : CLOSE_BRACKET_CHR . (74) + + . reduce 74 + + +state 167 + postfix_expression : postfix_expression OPEN_BRACKET_CHR expression close_bracket . (14) + + . reduce 14 + + +state 168 + conditional_expression : logical_or_expression QUES_CHR expression COLON_CHR . conditional_expression (59) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + unary_expression goto 106 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 173 + + +state 169 + selection_statement : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR . statement (94) + selection_statement : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR . statement ELSE statement (95) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + statement goto 174 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 170 + iteration_statement : whilekw OPEN_PAREN_CHR expression close_paren . statement (98) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + statement goto 175 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 171 + iteration_statement : forkw OPEN_PAREN_CHR expression_statement expression_statement . close_paren statement (99) + iteration_statement : forkw OPEN_PAREN_CHR expression_statement expression_statement . expression close_paren statement (100) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + OPEN_PAREN_CHR shift 35 + CLOSE_PAREN_CHR shift 136 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 176 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + close_paren goto 177 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + + +state 172 + argument_expression_list : argument_expression_list COMMA_CHR assignment_expression . (20) + + . reduce 20 + + +state 173 + conditional_expression : logical_or_expression QUES_CHR expression COLON_CHR conditional_expression . (59) + + . reduce 59 + + +174: shift/reduce conflict (shift 178, reduce 94) on ELSE +state 174 + selection_statement : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement . (94) + selection_statement : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement . ELSE statement (95) + + ELSE shift 178 + IDENTIFIER reduce 94 + CONSTANT reduce 94 + STRING_LITERAL reduce 94 + INC_OP reduce 94 + DEC_OP reduce 94 + SEMI_CHR reduce 94 + OPEN_BRACE_CHR reduce 94 + CLOSE_BRACE_CHR reduce 94 + OPEN_PAREN_CHR reduce 94 + BANG_CHR reduce 94 + TILDE_CHR reduce 94 + ADD_CHR reduce 94 + SUB_CHR reduce 94 + IF reduce 94 + WHILE reduce 94 + FOR reduce 94 + RETURN reduce 94 + + +state 175 + iteration_statement : whilekw OPEN_PAREN_CHR expression close_paren statement . (98) + + . reduce 98 + + +state 176 + expression : expression . COMMA_CHR assignment_expression (63) + iteration_statement : forkw OPEN_PAREN_CHR expression_statement expression_statement expression . close_paren statement (100) + + COMMA_CHR shift 99 + CLOSE_PAREN_CHR shift 136 + . error + + close_paren goto 179 + + +state 177 + iteration_statement : forkw OPEN_PAREN_CHR expression_statement expression_statement close_paren . statement (99) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + statement goto 180 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 178 + selection_statement : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement ELSE . statement (95) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + statement goto 181 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 179 + iteration_statement : forkw OPEN_PAREN_CHR expression_statement expression_statement expression close_paren . statement (100) + + IDENTIFIER shift 14 + CONSTANT shift 29 + STRING_LITERAL shift 30 + INC_OP shift 31 + DEC_OP shift 32 + SEMI_CHR shift 33 + OPEN_BRACE_CHR shift 21 + OPEN_PAREN_CHR shift 35 + BANG_CHR shift 36 + TILDE_CHR shift 37 + ADD_CHR shift 38 + SUB_CHR shift 39 + IF shift 40 + WHILE shift 41 + FOR shift 42 + RETURN shift 43 + . error + + primary_expression goto 44 + identifier goto 45 + constant goto 46 + string_literal goto 47 + expression goto 48 + open_brace goto 22 + inc_op goto 50 + dec_op goto 51 + postfix_expression goto 52 + assignment_expression goto 53 + unary_expression goto 54 + unary_operator goto 55 + cast_expression goto 56 + add_chr goto 57 + sub_chr goto 58 + bang_chr goto 59 + tilde_chr goto 60 + multiplicative_expression goto 61 + additive_expression goto 62 + shift_expression goto 63 + relational_expression goto 64 + equality_expression goto 65 + and_expression goto 66 + exclusive_or_expression goto 67 + inclusive_or_expression goto 68 + logical_and_expression goto 69 + logical_or_expression goto 70 + conditional_expression goto 71 + statement goto 182 + compound_statement goto 75 + expression_statement goto 76 + selection_statement goto 77 + iteration_statement goto 78 + jump_statement goto 79 + open_block goto 24 + semi_chr goto 83 + ifkw goto 84 + whilekw goto 85 + forkw goto 86 + return goto 87 + + +state 180 + iteration_statement : forkw OPEN_PAREN_CHR expression_statement expression_statement close_paren statement . (99) + + . reduce 99 + + +state 181 + selection_statement : ifkw OPEN_PAREN_CHR expression CLOSE_PAREN_CHR statement ELSE statement . (95) + + . reduce 95 + + +state 182 + iteration_statement : forkw OPEN_PAREN_CHR expression_statement expression_statement expression close_paren statement . (100) + + . reduce 100 + + +State 174 contains 1 shift/reduce conflict. + + +87 terminals, 63 nonterminals +119 grammar rules, 183 states diff --git a/depend b/depend new file mode 100644 index 0000000..d3513b1 --- /dev/null +++ b/depend @@ -0,0 +1,24 @@ +compile.cmi : cparse.cmi +cparse.cmi : error.cmo +cprint.cmi : cparse.cmi +ctab.cmi : cparse.cmi +clex.cmo : error.cmo ctab.cmi cparse.cmi +clex.cmx : error.cmx ctab.cmx cparse.cmx +compile.cmo : genlab.cmo cparse.cmi compile.cmi +compile.cmx : genlab.cmx cparse.cmx compile.cmi +cparse.cmo : error.cmo cparse.cmi +cparse.cmx : error.cmx cparse.cmi +cprint.cmo : cparse.cmi cprint.cmi +cprint.cmx : cparse.cmx cprint.cmi +ctab.cmo : error.cmo cparse.cmi ctab.cmi +ctab.cmx : error.cmx cparse.cmx ctab.cmi +error.cmo : +error.cmx : +genlab.cmo : +genlab.cmx : +main.cmo : verbose.cmo error.cmo ctab.cmi cprint.cmi cparse.cmi compile.cmi \ + clex.cmo +main.cmx : verbose.cmx error.cmx ctab.cmx cprint.cmx cparse.cmx compile.cmx \ + clex.cmx +verbose.cmo : +verbose.cmx : diff --git a/error.cmi b/error.cmi new file mode 100644 index 0000000000000000000000000000000000000000..a15cd254e9d6e95c41135a34a983335f4c971b22 GIT binary patch literal 1871 zcmZuyTW}Ob6z#z~34(|Pq9SjzyCFm+`2p6VpqCU_fKO10iXU53>m=E7cP2Hn0sZnr zs-Vgbr-;f2AL$PTM1=_fqM#x1!An8qa2XOHknM$t*M>5?3FcLjFq)9W-MpSoQY3d#Akb+>xuTzfV(SmZpJFO9v{e9jB(CW zLAX+c9YI)^@C#nnY2-ZM1I!D@8M_+AQx#dK&=iON5IR{1#!og5PN2uXWCH0cARLRIlH2@Kw%n_ceRA=ao(Z zG|S94oXmq!{JP0JAp6-jnO{UznmW@VDKsb6;$%x^`LKR@gu|=K#`r3-5f$GmkIhTC z&4sM%a1j}TD!Q{zWy%E6Pb8g0bT3YhfTDwa6yJX%FP~{IpL5uzyiBNEYI%@kf&xOEkUwuPnv zYJ9ir;@{Kj``k3{QikHy4Y?M-DIJv{ZJEXhbPq3)&L&iCCDx%OHlsvBNhIPWhbwS* zpo`i{r{0uRbP!!HX(!P)`W5vS#ov~0lDKszg*G7TlijGzgnDg9Q*)K6%6l7a$A2zg za=nm)th&$rq_>vPIy}2bot>CaXH`2EV#;H*?KNa4h`p{8uff9^&ebQ2H8RGA;*-SZ zexbivLCv_fmtT13QvOJ$_wvf7XJ%{`qGZ~FnjuDg{e&s@>LDjT zK{^8|tUnXD0*R3-k;Wm3{y-$r-xHLF;<_-vy>K0ZGzw`DlC+8JHAt(F5=iGE$xmd@ zK@$GZ&RAdvNo)vDp>7=IP7nVY#t!d;8h z2TAy+Bgs$X)+@4oXb5oF&(M$4^+DQX9K^VwFJwnF`XBwN_uOQ9!YB}v97v?Uz>Ouwfs(J$<)+#CN$Uu1jgpH5chSH@E2wg^dn zr<>b3sF(2%Q?&@ksu{F5H#r+btyKw0i1 zkrzKIdX ?;?RujN!rAR=g?Nj zTiAz3dhqpyyu`NnDOZt|tJssP*pzE1Cs*kkOWkEaedwCcg8zbIXJ~x}qWc|*uDY;H+N^c}SLfqNOjz!OVUbU~k$B#b# zM8WUzZa>ej9^Kg7=7F~?=0OL^@2se6&NQd$s=e4LcB(zUrmTKTGV5`XKc}L#E!)_< z+2e#?TfQlsNw#@h;?FJHn8~C=mi_q`{I%tqlIhkI==dxT<#lCk*>)`suvU10=g%u^ zZ*J@|E^6yXjja@&;epU_&!0a!wX->-u9gmRspl^!PiC{pUA8{&=RC)}dop%09H{p4 zu{{tPOb}o0FDeI^Hr3-b{v`sZpX>2Df6c5*n;TM_8kHI;3v+mvif zw`ak_XDbb#mFM1h?qkJQiTDoBUp=|Dv7@mSqf)nVSKaPZHUovB7=>!y?fI+5&uwm~ z%WSIK)F?gTbF|@V&%d;C#je&m4PaD{L^ovCd7tNBK1o_OrZe^1;8mm0m8;hEp1-nk zaRwdBv^O`PdaPD|!Sh#)nb+0V@t_(bRJVBk^2rOEJCf$lZqI#OB0^A0pmQ_=&Tzii@?_BQEyQ>rPG-G!#<+H{-eFP(TvvaNng z!3fQ?BQzt==jQo5J3>h@abw4CFgA^7f0oHq})3yzh^s0&WCct^Bb3w z`wjec@|za@7S-hbwM-_>>+}!nzhm6k#o#U=_ib|LYF?rF2x0m#NxX(Q-N_$W)S^s( zD^DXtrvy}CH{A`ab-;C3tOA#tLAjgt5p9StMqy3kFf9-)&C!LU}{eXW~=H<&8I5CIIDFK1mi8d zLkZp!2mVg~Le-q5`83s^Zk6tW{%0+`*Yi3NcWCYG^n9K^4^icFzd5M&dF29>YJ8qF z*VER8^R>02R$6`HspT!nY_iF#$w_HiP{J}=T{Fk?7J2#Lk&-sFT*iOdMtzbz1-RV8 zZ$sA5QXa}fBJl=8t3`a3m3a_wwS|u%s1IWuH8cUiqK;jpc`aDh@))j&SZWQ`3(H2U zdOu)&J@Jo-PpZ)*PvG$ja=GfTmuDE-DhiEuWVUe}PXt3rp6YjcSR~+A&3;Y<;_mB) zwu^YnW-@UyQvkPHSSzFC`;YsEni1%4k8f>nsSEEsiTC5B$PVQBP@X@Z=PUClbwzEZ z`ZKCq-8iiq9o$xKnHGl%5f8LX*LIWttO`u-RyRZIrsR2Fo;yOObG353<+wG^59awE z+ow>%4)TPsI8habg~j1o9HO!Hm>sq{jDv6CR)iI~?~mOQ`rfq@$my!Xe~9k*WwM6+ zJ}R%2@_$9;)uG8NKnfGjr-=W6Kfn_TjZteK7OpB?gSwC056Hbr^LEvL!A{jc=)Y*; z5Y_+a^lQnrs(Q8N9ZK-B)fxtZS1cT<1RtMvExArLuhAS&H7LDql|}>p$wE9<_zB#H zxbgbd$Q{PxB$9CdjnLZ>w^$V)l`yQv-BlY!uKRC>J`~OmEYSeI36aY;@DC(#OH`vE zaGx{|LE4FJAv2du6Chc**9NZ7`!R1HRASodTHBJ@HeHyG^Q|^c7Up?&o~Lz-u0876 z&Te&kwQg59al5s+-EyqT^Tm1g!nW(REgKeFwb&x#C9hJIVco z+(VjwQT3-<*Oo(nnuXX}z`awaUvuwL)!Q}CDZy;3wH^c)T39ax96Rlr`(@R`6mp-k^<{;uZV(EO-!|I88|0r$@>d_cKP zVNhcmBCbEC`GczWD=UmAs`G0LA631gf>`Fyr~)D!$`7g9Nh|vp)P8T_F$v*Ef=$B& zS*E%ct<|!Hz@k-)O#{}juC;5tq5CzWWp6Mq+#9%Sjq|QV=sPw(d3b5|4?LhZ(nzDEDrsqLWng8eks_-&5sBLglGYe$dd%JS9?Q z;|><(L2Xp@Bo+M@aPUfDhQVmGfhgmL~H_NpJTL)-^_d)Cljd45Fmym2Q9%|xqvGvFi(?@-77 zRVknxhw_gNeay=uW#70nMESE;V<+GY3vX2A{|J=bPoeyhaf*0Nq4c0uVLXs<4oe~A`;KITk$Gi%^w?QGT#t2OfYU* z*ta#2d5z2)fN6zAG3mEFCIa#w=CBDaGR`c%HB#?y+zwH1Pm_6p%r5{tEPU0f_Y2jZ z74^QxspUH(^_X$@iu#^yWS%DTQ^37fQ~V~1e+ffjXn=7R^1WU1^uBR#5c%t^{C5Fw zu<&_17H~T>_-$Qbo&-y&aaQs}5zCv#%?Zn`R`pxlSB;e!=Q4hDUbOL{XN-GT1aGse z(jgwGTlR9}U`9NCsK?fazHZ!mME>qrEydrbgbRF6faMnRv1PB4m2YB87KaDjH|@r$ z)MppG&Kq*_{NH(gCC|SIA6gHqKlka3e-TdVsS$C5Rv!tazN*E%tgG%fZMX40=ss=X zL0yg$qw(Ag-zM#i?AFNxR^A$9&Z{E&U0N|Bs@Sa+qoax|^LS|qk701WhZ~tVt9eT# zmC=eO&C{B1(|n8e^p!mn&r$qd^z?TY-iIfEa}=YDZK`ZZ1=I?_zhD`ooN-?lKVOU0 zQ2YeNe+K+|fM1sI;}htBn%RMk2QS0W7mrMPoj5@ey}!k(DgG42JAvN`@Nu#GJ-c}- z(fe_*SHpw6nl7t18ut^Q2SDfJ*c^)gj^gj3TYRQ*PH-X;YcVX_U>wnU6u+P14{!tC zgSp-~KjBf450@D>BF3==l$b$@S->X1^X)B!qZT+(LVTa@o;U+H;+0(yWH(R7xt*_& zxis`dH0t}*`Nl9-wrX*+IL|}vI3EHWX5l>=9KE^)$1$$AXK;oJV(xy8fvY1sU(6&0WJPZSp1?EZ`N7Z7mO9&hxpn6pRKddd%PZZ*45+q(!Q}Bd)&C4qqC_^ zu~T;Oz|{OsdwT}Oe@Tpd3vq8^coN!rS}UGZTZdy8Q(`?OHp15J0d7)TeX0s<)iot| zs+Y$M_v&JbWBKSq@vX{qUu+R2Iw-LlOh*EIlQQ+~5zT)JqS=w>l3hXLdn9-rH>%jH z74fJ7XBq`dT>P4-;M@J5lBx;*`(z_UvK^cKOvc(ZeA2jKRTB zr@`mE<&^j}C4R%D;^PS8{)GEje$b@_5CzKe?S$bpW<-xmXTHys1pXOG{M zZg1UU&-g=M56GRBGyJP)$__)6;@V*7Z&CfXwEke|H&!T!=^MKl7F$M%=P2wSB zmozr|cZ*hC%r}Jro9p6E^wRj;8&$~1ALCpfRp3KMLBJ+TqLyOfeiZ++=EpVf)ckug zC1!T)QYs!x#Z!SV4Dfl{wE;cDHagLd|4A8ssQC%af1qra1Ps%`wm85uF~K~@hV6NU zi?B@bFKk7pJs#en=fM1?%sXD{!Z?jxWy}WYY+Y z@CL(^cu<#m+L*1f*~a6z8joY1!b7^+RvObJ)alqND!zbbqRocS<8wl(7GvaO z*0jXxsALkA$Y5;`@C7!6e8$Nv_bb~-VHh_Nk<<_mqC}bIqcty8 z!bf6jsrWZk{3-~)9^f~W@G~P@b*PRRH(H$&Q;7#tLO*brZ^qVBiAyEL(0w|~3ygV5gkFrTqvE%y_%EE4=&3V&7xzL}>}T=V z3Vb1#|A8Q1(fj0!msGXmgJo+~13u0+Z^~3PB%4#|bf&5{Q?DQWTC3({@M*Mk(X^_S zOG}q#Gn?^EqzPYFGtFpeYH3U-+fwb>DtyMq2kvA`V8$5^`iJp<5ne<3cRd=nU*4DE zH7%dt-~H>|2Gp?Gna}5PN6uTB$&@xFn|GCJ__od}-QJE*-4wgypEnCD_a_>xVq@{` z27b*d^@wIj%Wxu3uBAk<20Np)?U2+}65XwJBK>+kfAHLT{5LV24$B97e9>=9ZEsJe ziQW<6>Et9-xMD)7e3|pefyw=RAvvX5k2oTyR;m_|v&dF~*jX!8%gAYv>q>HV+NQB+ zg7y8pj-31Dx`CW$Y*Qtgek@guJ* zd3Mi$xzD2ZNN)0ouN=B=(FaYxtbgyL16#Juelnk*F$V*OFYKvob22?IlSQD^;0tYi iYi{x_MPK>pIhPz9_|%QBUbMO1Q literal 0 HcmV?d00001 diff --git a/error.ml b/error.ml new file mode 100644 index 0000000..cc29c9e --- /dev/null +++ b/error.ml @@ -0,0 +1,95 @@ +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification (LSV), + * UMR 8643 CNRS & ENS Cachan. + * Written by Jean Goubault-Larrecq. Not derived from licensed software. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the consequences + * of use of this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + * + *) + +type locator = string * int * int * int * int + (* nom du fichier, ou ""; + premiere ligne, + premiere colonne, + derniere ligne, + derniere colonne. + *) + +let sup_locator (file, line1, col1, _, _) (file', _, _, line2, col2) = + (if file="" then file' else file), + line1, col1, line2, col2 + +type hlocator = string * int * int + +let loc_start (file, line1, col1, _, _) = (file, line1, col1) +let loc_end (file, _, _, line2, col2) = (file, line2, col2) + +let prerr_locator (file, line1, col1, line2, col2) = + if file<>"" then begin + prerr_string file; + prerr_string ", line"; + if line1<>line2 then prerr_string "s"; + prerr_string " "; + prerr_int line1; + if col1<>0 then begin + prerr_string "("; prerr_int col1; prerr_string ")" + end; + if line1<>line2 || col1<>col2 then begin + prerr_string "-"; + prerr_int line2; + if col2<>0 then begin + prerr_string "("; + prerr_int col2; + prerr_string ")" + end + end + end + +let prerr_loc loc = + match loc with + | Some l -> + prerr_locator l; + prerr_string ": " + | _ -> () + +let warning loc msg = + prerr_string "parser: "; + prerr_loc loc; + prerr_endline msg + +let error_count = ref 0 +let error_count_max = 10000 + +let fatal loc msg = + warning loc msg; exit 10 + +let flush_error () = + if !error_count>=error_count_max then + fatal None "Too many errors: quit" + +let error loc msg = + error_count := !error_count + 1; + warning loc msg; + if !error_count>=error_count_max then + fatal loc "Too many errors: quit" + +let gensym_count = ref 0 +let gensym prefix = + incr gensym_count; + let s = string_of_int (!gensym_count) in + prefix ^ s diff --git a/genlab.cmi b/genlab.cmi new file mode 100644 index 0000000000000000000000000000000000000000..401d8e1fe18a608fa657bb03376409bc6bf49b91 GIT binary patch literal 405 zcmZ=x%*`>hw6ydzFf?zOx@;c<1H(EX)&=5eK-|AT%{?_QCoyTkf(?w!pVgD|OY=%n ziyRJY*t~JV1_!Nx)S|M);>@ztVn^ko)HH_w3pQ+?u)$F|Gq1$KVS)n_>(_@241eLQ ze-0ZCsKw{y=cUFwIxzfaVRCc;8~jBr9c&BG+=B`r6P(qGONuh{(h-LI!Y=$9YR4Z3 z7I6m$s1N1=T`md4(Ln6A0Oo}W25WNPRUTZ$oEqlvH+ki)hnzsE0H7@;X%h@ydoC<< zJ^D)b(hO%Vn;D613l<>xZGr(WV^ox)S?X-wCx-j#MP2tTSYY7{3^}0Q)S|q^9Jllj;Epi7Q0n|);N`>rKJ{4Fj!joWoexO-|^5NUO$=- PK9z>Km=WkwIB);}BcPkx literal 0 HcmV?d00001 diff --git a/genlab.cmo b/genlab.cmo new file mode 100644 index 0000000000000000000000000000000000000000..9d1b20f79839b9d897756524c39a6d237af4bbad GIT binary patch literal 1900 zcmZWqYitx%6rSnat*|XkP>ZO66xiKTu-)a=w8Y1mZVMFJZnY1kwT!d7cguv?88S0l zSbU(7s0k!)F&GjPxz-?&_~Rn_OG6foAtA;XeiHwXh$dTSQd=iGD7 zch7yDP3n1bU3YhPDzPphN%a$>k|Z@Dni0<;dd>hv@`!|z|~cT84AOjw}Y$ zry`zH@YUvE7SarSOQc{KwaG=;u9d6XM9i{^(=y;&SJC}em0A@Ek{00GqPpYg#bBKA z64Zr$z9Q|w1*pKJgXq)>ygyhmgleQi0jVAt!i^KO{em_f8L{(J5aY;DjV1+rC}!#h zirRm3O9lChxyFI-XtQ+Bn4#i;$WA^GMPb8wAd`Ghh@BgOO!3LhV^)^t42xzphh_?n zixFDh&K69XyjCJfVEm}Ru5@)#J-%vJRm?9GY~LuRNG#wJ9jfb6$J27UVHO~t zKGM3Smg`!iY86z6fj^Syw`O$H$ZEPXUC2|*!>BkqtQ8I~1AnYz#M3i-G<$|Rc%S#7 zd4o@S6!^pKse&g`&(pl^6w%b_n~nh=ZXeXW%T*1mfncU;MH3YVg(XBBMF94MBEYJ#^gt029Lg=ds?c$v9)%wM9 zTS&fJOty5FtX!0pPebxuXb#CsNF!;$h@i|$SZ4j|yA=B-wlEbh;2Ut`S$ywS&W>kw zi<+h#@3k}jJ#yno8(&+?z=rtfaLce`Pdj=(j}O+i(30P4n7T&`P8=&E)=YhGb(+7C zz6Ws$QTFR@rIrs%Pcc@S12#9nO0yQ5>tVAMMbg+@uh6Rhm_MLztRw1b(JVlgvDuq< z$7Jj%2eL+$_5)+&wo>BT{x@d&KKZ8o((z>Y{^R-!jNNkWN{L1C#KekD`r4u|*PT1q z+;q_FUBVJGHSh~5zc5t~pcy%*wDRH>|#Kq-< xuPk~0rK@A9t`8!N#d-?49Cb>Glf~;NpGh=b7`w6k#`EW|ipn5MN953F{{SO5a;yLV literal 0 HcmV?d00001 diff --git a/genlab.ml b/genlab.ml new file mode 100644 index 0000000..66ecd1d --- /dev/null +++ b/genlab.ml @@ -0,0 +1,31 @@ + +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification (LSV), + * CNRS UMR 8643 & ENS Cachan. + * Written by Jean Goubault-Larrecq. Not derived from licensed software. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: + * + * 1. Neither the author nor its employer is responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 4. This software is restricted to non-commercial use only. Commercial + * use is subject to a specific license, obtainable from LSV. + *) + +open Printf + +let counter = ref 0 + +let rec genlab func = + incr counter; + sprintf ".%s_%d" func (!counter) diff --git a/main.cmi b/main.cmi new file mode 100644 index 0000000000000000000000000000000000000000..9044a0763557fb6a5a4fbe9b76068f4bbf549a6d GIT binary patch literal 954 zcmZXTe@GKy7{_n=78NL&CZ+wbrfbQH*FRDhWjEJM%TNdhoy*h z=#&DRN3G!h6R{S~XwGLijT^(bNhE(9!-`%WAXH zPMTU={&8R@2>16#qF&{23Ks4%E%#WEqeU8oO8kn_Y&1ydL7-Yg4bdi^xBdg?WN@Aa zN#xF*sR4N_@(&67XGlN{nl0yz|xOhGXC>CY4hjy~{eZaq_noN2@OKsGCw zcn6E1v*1Mz{PDfAB21BV>qOOk0%dU)7lQEl`$}U5I^4Q>a94-to)2TyIlrO^K6za> z;mK|q)+E$NZ18p>lFB4nJM$3yoz`4r82EMQQ=NXxu{x#<<8}Tc7^KL_*%!~&2aU${ z-rR2JC1g75A~qoyIo^_*;r`Iops5Q>Z0j|VR0=QH7$<_v=OY2hZpt;>UONZ|ea#rh z7zBYA5Zv4Js5E`f_SNiLc$j}B=?&Rl?_^8}2A1wmiV{5~mDDp&&CB?=q?_Kpx+8)Y z`ieH4`tt64L)VVSuDF>be~J-S#fZ#T>n>(aR5cC>J)s3pM~F~*-e$L0Nv>qEqp?x+ zDl;@`5z}{l-qlf7mI$S)3Jtj$Yrj@3=9)j|8roMA`3zYucd4$MpA77tQ{TA0P|k0| zI8jfo5m|y2IL0b{T{5{EW(R^58=HpqoUIP;EFa6tNbHFwTO}9f<*}qsOYv084H)dr pnms*R+CLVFu~H`x#UiQ)V!~_r@s>N6o_oHH&aeFh#QAj({TFKEh9v+1 literal 0 HcmV?d00001 diff --git a/main.cmo b/main.cmo new file mode 100644 index 0000000000000000000000000000000000000000..efa8a9975cda0ca217f2f89401d22e21b8684bba GIT binary patch literal 7965 zcmbVR3wTsTmcFNNRi^_aYXFtOSCbbZkkEjH$0*)T2MEtZkqjsrI-O3)+Ubtnoj}k* zR0Q8#Q2FrPAcD@STxG`fiE$Pdb#Q#oH@oWYsNl|y?tqE{>U`{f>fW0U@!MHv?w7j# zSJgTHId$rBt16*zdu-g4DO2hK;{uxYlQ%BbG;JwTGty)v_n8GyhD1nztuBiCzos`F z_5HbiOc~U)Gm%Choq@z06Os5Ch~(NF1k5sS{vUt~k*bjR>0j>VL#SiD{=O_mSpiZj zQY8}exjOm4%)Jchls@G;a1qiaNN&tr`|N8sQUj7e;&`%*2Z^7JNRt%OwA1i=frDLr zH_tZzKb#Ah(T@IaPn)6M8QRmuo>w_rg$58LA z9&@{TH~tNJ99vhf^Ka1W+s>tbr{0{uQ?Ker=(*#C!^Go);}b%1%Q?OykOuTA%jtsw z)i`tY8j$xQx#Q$?V4k-;9^EeW9Ra@{9MNVx%|bz z{J7i|z}#+r+_Ikna~aPOPOR_Nx$6w~8T;tY3AdixRD?7HiQCb)Z}X66-UyOg&%dn0 zyxfo6*KQy3FYEI!*H1&@_VL4d?AsL1;8}Cm_T4C51Gc-t^g7a-3;kLNd zGqN2&mF+R@Ldw0Hav$jt9tXZ?nAWZ*P0J`=7;jqf*?< zaMBQ7D^!|FC)?t!hVWT6B`vW;IBkdl*7V}0L?Y(0Y{_Z7GMpS7xpeWJ`^OmtMwP*88Ikh?J~vC z3|w{y=Rx9p_9e3zXqsWoE=_c#+Y*jLy`=MP(s1#71deHEF>O=vf<$|iiBU4Ym!{6J z=9k98E4v%}`&MWB&$b#2YtE>6INjD23QD!ffOL!>TK3>P|;f?kF~bCdQH>wqi;f<@M2ISD1S( z6-2f))Dcdmq6|kiM3YSk2Zs{v9S9(o7X_28L5uXm7zG`jX`{#5gq1;@UX+ZsXeTnr zalRjQd0V^@vp61)#+Kwym)3i{Z9mHV*Sv^h94^PUlv6gr#qIbT+6WPtVGJ@7gTV7sq!ln;T@!ZN!|@vJEkhQ zP1%{Wl=RQx4(v>};aAGeSFjUw?96xVpnYPvGVvu99AuV)2i5xq#dt62Uy=9jtf9@S z0HX%%^TQ-G5(2Q!hB?a65g4j*3`P4I8mA0>MFqcOmVykw^Pf_T50QR^yj!w{P>F*3 zm7!=8iJ>Hh!BC40F(uJ)Uzat7Q_*-B3sVnz>Se#`FsIu@?;=4tX~X;(Mplu=G4n0{%)af<1?kudpO?g`ri9t?e%DI7xN4rqd*^njnR~xppe~yy=3?EcT zHPo_{MPfinJFjcTOrs&xYg_(!Zs_ zc`78|XmiPToN^_2k2-iD7S)MXkC=dg*CQ&$m>vV4h+wrC*#k5Zi*XSLV<@-1U$f4Y z9*K=bP@FCdF>uZXGw3!rAU(Ngh{xv`$p_ALaH$bA(e%HFT3DSSj23tCUUSS$)=_eNfm9zV03qs=1U zv*g2??D0GJ6=o56j(WjgSbdm?h%iL z%Y;9x@Qn0~Wra#d!Nfj+#YTvjC_YJS0*j5;rjxIgeC@y!9DJ?n=v}6y&s^7D&SPL^4}1*h)`Bxne<%53Ku#G<9JsA?`p()G4mv`1{Pa*4dwg?Oe}{bFIZVzTr!GkwIS|5!{_ zPBe%uV)02*%UG)QYRXwhIhz5Ot)iUwDCYymhl#EaSFsQIZ?F$d;&Bnpk_?lcwCzK) z*eP1G6+Y?dV)o9JloO+z4!|xOuK8j3k5T?M?!+s_3nJaip&yf;>n)Kd7Ag1B;w7;> zTX{r!*0O;c?6q(n;946lWB0{}%I9%Rd$o84Q|ey@=5deM-6QT0&teKcC-&Z=3X%tGILQEWA%dqq zX9LyYv6{6-9)Ifi&uI_Mm7c?F?htHEg*SkQZP;vJ#p*Ug;#5fi3*i`mgPAeCR}&wL z2~)2Hk5joF~fhB^RS4)rg@u zZQ2nhP3i+#YCwv-_2gX)IM9aout6;GJYfbsjU&I*H3a7<2Zukc_(XB|bMyJ_JHf%y zf6_tTA>=(1aJUU|;F7cm4YZ>ZE5Nx}p9hQ0-6OOcf ziR0k*f6Tc-|IBl4&tG1!ykmf%PjZs#EwR2>px z)Y~6ght&C_ptr_J-b`{k;4&NTR8)&3ZFi`AyzaX+RVULdk$Q@0lIOM1bf@rpu4!>zHS*DUpQti1LL z60eXr2)NFMhm`ViNqZe-i6gwS+^bwGb(59X|09XpNIVK?+HjXrUM=ajj}iB|LxHqSU>poS0Y;dHb!ITkl#xHAiPIA-KjTsk)49}Kv$*FV98D%RB1Up>j5 zOlCu$Q-3|OLdN**(`qvr)7(0u&>+oHVx8Pw<-r#)STNk1wC=!K4H!3S7;YvOh5#6V*V(4D$F?bz#MHU^s#1PVK;5BP5$R zfRVI6)g4cVSNPM(XcRJV3^IikLExndkGJLf9QIPETj9vn0B=@!ax&VHNTyT%RJyaJ zWsD!^FdISw(FJQ!Mb~&_-c*^2lf+T{M^|PXHtV+A{bh8&k}0g{f(SfC$Es@^(ihqB zbxysccc^@E21&)^I^2Yui5!NqZaY<2iRS2gxNH;Yzvth(Nry8aFPYBwXi)iH zWlLuyk{F9Y67U1nxK-j%B0r{IeSN=r?pq8(_qvG$Le__0Jcg`zi3ATD@oSQ3KJ&Yy zQ5K`!TaC=tIryn;jYRwvt*y;X{)z;KU}kG|W`k2#RM@XzbY-g0UlD^stlfZ^dO(uv zKbfTjVudBCzS0KC^K3Wjxs@$Jk~J#tjB&X%li6tDQ#S-PFQ7Lhoni*kS3Y`4;N$mi zzhx**yY7PZw`DTouo(z!+kbmwomsg(_ti6>*mLtyl>W&K-1pSlFZVP&_|BL~_YRl) zeuaJ!!_2^Ev$k|i-}|SEw>O6doVPi=mWc4Y^n}<%`vAZdgar({-gx{U$sotfn zc<1p=uZmZXZpmcqUN!^gJb35zbC0+GE^_p{jmxf>_DfK0HUs+gh12}jp4GQ&5AC^Y zXVtSPU1bKA^mO@VzW3sy`=1_m_lj}fOoIXYW(2mEl?5-a|8o5UuO*)!a^=>Kps>OW ztp5Iq2OhBY71fQIHT>&!NB5!h2{TZ-en`Rc@{X0=*3!sZOQ%1c$rOk1PXRNq^e>yA zOMIn2cf4%XRo~s17@WyW4&fiy=!a-B9*)@qu^Jbgk(3#@#rxoEXV1Iiv|rtLaADo# z=P_7Ht1$(m;CZ s + +let () = + parse + [("-v", Unit (fun () -> verbose:=1), "reports stuff"); + ("-v1", Unit (fun () -> verbose:=1), "reports stuff"); + ("-v2", Unit (fun () -> verbose:=2), "reports stuff, and stuff"); + ("-D", Unit (fun () -> c_D:=true), "print declarations"); + ("-A", Unit (fun () -> c_A:=true), "print abstract syntax tree"); + ("-E", Unit (fun () -> c_E:=true), "output assembler dump")] + (fun s -> + c_prefix := basename s; + input := + Unix.open_process_in ("cpp -DMCC \"" ^ (String.escaped s) ^ "\"")) + "compiles a C-- program" + +let () = + let lexbuf = Lexing.from_channel (!input) in + let c = Ctab.translation_unit Clex.ctoken lexbuf in + let out = if !c_E then stdout else open_out (!c_prefix ^ ".s") in + Error.flush_error (); + + if !c_D then begin + Cprint.print_declarations Format.std_formatter c + end; + if !c_A then begin + Cprint.print_ast Format.std_formatter c + end; + + if not (!c_D || !c_A) then begin + compile out c; + Error.flush_error () + end; + + if not (!c_D || !c_A || !c_E) then begin + flush out; + close_out_noerr out; + let command = + let prefix = String.escaped !c_prefix in + Printf.sprintf + "gcc -ggdb -o \"%s\" \"%s.s\" -lc -lm" + prefix prefix + in + ignore (Unix.system command) + end diff --git a/verbose.cmi b/verbose.cmi new file mode 100644 index 0000000000000000000000000000000000000000..83ef1073bfb7ef5a5b9b14fc008a2a38c23cb6bb GIT binary patch literal 277 zcmZ=x%*`>hw6ydzFf?zOx@;c<14A+pO9F8)5c@As4@)gd$}dh`uwVlt^GEeE2+!fb zhRqu%Y;e#DNG&Q$EY2)TEp}8cN=;+i4)L`$;A^4y4mKR ZlJlJ`wzcDFsK3Q-6`19WKuh7k0RS$uV4na0 literal 0 HcmV?d00001 diff --git a/verbose.cmo b/verbose.cmo new file mode 100644 index 0000000000000000000000000000000000000000..48b2ba8de0b72fa65b3f563e794cf15d0a17045c GIT binary patch literal 329 zcmZ=x%*`>hw6yd$Ff?FbVAzrjBau-63M2#v4p6~h zpa>HXO8_z70#1MZ(&E&jV*QkYlFYoceEpQfywseWe0`Vv3Nor}4eo}sZaY<2P0nD04pz$I=><`2)91IL9 z4C-O2MM?R^sR0=a7EIdUz{2X7;;>)=3;P6vlERfy29Iv{b&D|CHQD#~E?A%ykXlrh zSe#jwT0FskmoX|z(JXZ~?-Rp)^`fr(7A&xE1_n%KUP)?EUSf`0ei6_;PC(VkK*il` Z^H0h7P8QqR@if%mVz-KegF^*F4FG0QUa