%{ #include using namespace std; #include "grafcet.h" using namespace Automate; void yyerror (const char *s); int yylex (void); Grafcet *input_grafcet; %} %defines %union { int num; double fl; bool boolean; string *s; Grafcet *grafcet; Etape *etape; Action *action; Receptivite *receptivite; Transition *transition; Expression *expression; } %token NUM %token FLOAT %token BOOL %token STRING %token ERR GOTO %token EQ NEQ LEQ GEQ %token PRINT %type grafcet %type etape %type action %type receptivite %type transition %type expression %type flnum /* Priorité des opérateurs. */ %left '|' %left '&' %left '!' %left EQ NEQ LEQ GEQ '<' '>' %left '+' '-' %left '*' '/' %left NEG %% input: grafcet { input_grafcet = $1; } ; grafcet: /* Rien */ { $$ = new Grafcet (); } | grafcet etape { $$ = $1; $$->m_grafcet.push_back (Grafcet::Elem ($2)); } | grafcet action { $$ = $1; $$->m_grafcet.push_back (Grafcet::Elem ($2)); } | grafcet receptivite { $$ = $1; $$->m_grafcet.push_back (Grafcet::Elem ($2)); } | grafcet transition { $$ = $1; $$->m_grafcet.push_back (Grafcet::Elem ($2)); } ; /* # represente un label ex : # 25 etape: '#' NUM { $$ = new Etape ($2); } ; /*met les actions ici puis defini une classe pour l'action (avec parametres) action: PRINT STRING { $$ = new ActionPrint (*$2); delete $2; } ; receptivite: BOOL { $$ = new ReceptiviteBool ($1); } | receptivite '&' receptivite { $$ = new ReceptiviteBoolOp ($1, '&', $3); } | receptivite '|' receptivite { $$ = new ReceptiviteBoolOp ($1, '|', $3); } | '!' receptivite { $$ = new ReceptiviteBoolOp ('!', $2); } | '(' receptivite ')' { $$ = $2; } | expression EQ expression { $$ = new ReceptiviteCmpOp ($1, '=', $3); } | expression NEQ expression { $$ = new ReceptiviteCmpOp ($1, 'n', $3); } | expression LEQ expression { $$ = new ReceptiviteCmpOp ($1, 'l', $3); } | expression GEQ expression { $$ = new ReceptiviteCmpOp ($1, 'g', $3); } | expression '<' expression { $$ = new ReceptiviteCmpOp ($1, '<', $3); } | expression '>' expression { $$ = new ReceptiviteCmpOp ($1, '>', $3); } ; expression: NUM { $$ = new ExpressionNum ($1); } | expression '+' expression { $$ = new ExpressionNumOp ($1, '+', $3); } | expression '-' expression { $$ = new ExpressionNumOp ($1, '-', $3); } | expression '*' expression { $$ = new ExpressionNumOp ($1, '*', $3); } | '-' expression %prec NEG { $$ = new ExpressionNumOp ('n', $2); } ; transition: GOTO NUM { $$ = new Transition ($2); } ; flnum: FLOAT { $$ = $1; } | NUM { $$ = $1; } | flnum '/' flnum { $$ = $1 / $3; } ; %% void yyerror (const char *s) { cerr << "Parse error: " << s << endl; } // vim: ft=yacc