%{ #include using namespace std; #include "grafcet.h" using namespace Automate; #include "grammar.h" int yyparse (void); extern Grafcet *input_grafcet; %} ID [_a-zA-Z][-_a-zA-Z0-9]* NUM [-+]?[0-9]+ FLOAT [-+]?[0-9]*"."[0-9]* STRING \"[^\n"]\" %option noyywrap nounput %% "init" return INIT; //si robot initialise "palets_trouves" return PALETS_TROUVES; //si palets trouve durant la recherche "palets" return PALETS; //param:num ex:palets 1 valeurs possibles:1,2,3 nombre de palets dans la pile "stocke" return STOCKE; //param:num ex:stocke 0 valeurs possibles:0,1,2 nombre de palets stockes "couleur_adverse" return COULEUR_ADVERSE; //param:num vp:1:capteur avant ,2:capteur arriere ,3:camera "pince_angle" return PINCE_ANGLE; //param:num ex:pince_angle 0 valeurs possibles:0 ou 180 angle des 2 pinces "pince_pos" return PINCE_POS; //param:num ex:pince_pos 2 vp:1,4:1+,2,5:2+,3,6:3+ position horizontale des 2 pinces "robot_recule" return ROBOT_RECULE; //determine si le robot a fini de reculer "robot_avance" return ROBOT_AVANCE; //determine si le robot a fini d'avancer "goto" return GOTO; "print" return PRINT; "initialisation" return INITIALISATION; "rechercher" return RECHERCHER; //Determine la position d'un palet ou d'une pile cible non-marque "rotation" return ROTATION; //Fait la rotation du robot suivant la carte pour une meilleure recherche "atteindre" return AVANCER_PALET; //contient le chemineur pour arriver devant le palet cible "nb_palet_pile" return NB_PALET_PILE; //Determine le nb de palet dans la pile cible "nb_palet_stocke" return NB_PALET_STOCKE; //Determine le nb de palet stocke "mise_en_place" return MISE_EN_PLACE //Mise en place du palet ou de la pile cible ceux ci etant atteint "reperer_couleur" return REPERER_COULEUR; //param:num vp:1:avant, 2:arriere "retourner" return RETOURNER; //Retourne le palet de l'avant vers l'arriere ou inversemment "avancer" return AVANCER; //param:num vp:1,2,..n avance le robot de une a n fois une longueur (fixe) en avant "reculer" return RECULER; //param:num vp:1,2,..n recule le robot de une a n fois une longueur (fixe) en arriere "placer_pince" return PLACER_PINCE; //param:num vp:1..6 postionne les 2 pinces aux positions 1 à 6 vues plus haut "&&" return '&'; "||" return '|'; "==" return EQ; "!=" return NEQ; "<=" return LEQ; ">=" return GEQ; [-#+=*/<>()] return yytext[0]; {FLOAT} { yylval.fl = strtod (yytext, 0); return FLOAT; } {NUM} { yylval.num = strtol (yytext, 0, 0); return NUM; } {STRING} { yylval.s = new string (yytext + 1, yyleng - 2); return STRING; } "true" { yylval.boolean = true; return BOOL; } "false" { yylval.boolean = false; return BOOL; } [ \t\n]+ /* Rien à battre. */ . return ERR; %% Grafcet *parse_string (const char *s) { yy_scan_string (s); return yyparse () ? 0 : input_grafcet; } Grafcet *parse_file (const char *filename) { yyin = fopen (filename, "r"); if (!yyin) return 0; int r = yyparse (); fclose (yyin); return r ? 0 : input_grafcet; } // vim: ft=lex