commit 3fe11684d3f431b4344ab2d1631577eb639078f3 Author: Yohann D'ANELLO Date: Sat May 23 11:22:23 2020 +0200 Version finale 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 0000000..6dc9d62 Binary files /dev/null and b/Exemples/ordre differ 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 0000000..c7f84ef Binary files /dev/null and b/README.pdf differ diff --git a/clex.cmi b/clex.cmi new file mode 100644 index 0000000..2510be1 Binary files /dev/null and b/clex.cmi differ diff --git a/clex.cmo b/clex.cmo new file mode 100644 index 0000000..69a62f3 Binary files /dev/null and b/clex.cmo differ 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 0000000..21c837f Binary files /dev/null and b/compile.cmi differ diff --git a/compile.cmo b/compile.cmo new file mode 100644 index 0000000..b3f0dda Binary files /dev/null and b/compile.cmo differ 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 0000000..4dfe4b0 Binary files /dev/null and b/cparse.cmi differ diff --git a/cparse.cmo b/cparse.cmo new file mode 100644 index 0000000..20951db Binary files /dev/null and b/cparse.cmo differ 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 0000000..d6a9214 Binary files /dev/null and b/cprint.cmi differ diff --git a/cprint.cmo b/cprint.cmo new file mode 100644 index 0000000..ce625bc Binary files /dev/null and b/cprint.cmo differ 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 0000000..d6dfa1f Binary files /dev/null and b/ctab.cmi differ diff --git a/ctab.cmo b/ctab.cmo new file mode 100644 index 0000000..4186868 Binary files /dev/null and b/ctab.cmo differ 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 0000000..a15cd25 Binary files /dev/null and b/error.cmi differ diff --git a/error.cmo b/error.cmo new file mode 100644 index 0000000..52d1745 Binary files /dev/null and b/error.cmo differ 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 0000000..401d8e1 Binary files /dev/null and b/genlab.cmi differ diff --git a/genlab.cmo b/genlab.cmo new file mode 100644 index 0000000..9d1b20f Binary files /dev/null and b/genlab.cmo differ 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 0000000..9044a07 Binary files /dev/null and b/main.cmi differ diff --git a/main.cmo b/main.cmo new file mode 100644 index 0000000..efa8a99 Binary files /dev/null and b/main.cmo differ diff --git a/main.ml b/main.ml new file mode 100644 index 0000000..4e74a39 --- /dev/null +++ b/main.ml @@ -0,0 +1,82 @@ + +(* + * Copyright (c) 2005 by Laboratoire Spécification et Vérification (LSV), + * CNRS UMR 8643 & 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. + *) + +open Cparse +open Verbose +open Compile +open Arg + +let input = ref stdin +let c_prefix = ref "a.out" +let c_E = ref false +let c_A = ref false +let c_D = ref false + +let basename s = + try String.sub s 0 (String.rindex s '.') + with Not_found -> 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 0000000..83ef107 Binary files /dev/null and b/verbose.cmi differ diff --git a/verbose.cmo b/verbose.cmo new file mode 100644 index 0000000..48b2ba8 Binary files /dev/null and b/verbose.cmo differ diff --git a/verbose.ml b/verbose.ml new file mode 100644 index 0000000..9edc541 --- /dev/null +++ b/verbose.ml @@ -0,0 +1,25 @@ +(* + * 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. + * + *) + +let verbose = ref 0