summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/automate/grammar.yy
blob: 04a001e336ec7d56f106169abe84ab4722c97451 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
%{
#include <iostream>
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> NUM
%token <fl> FLOAT
%token <boolean> BOOL
%token <s> STRING
%token ERR GOTO
%token EQ NEQ LEQ GEQ
%token PRINT
%type <grafcet> grafcet
%type <etape> etape
%type <action> action
%type <receptivite> receptivite
%type <transition> transition
%type <expression> expression
%type <fl> 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)); }
;

etape:	  '#' NUM		{ $$ = new Etape ($2); }
;

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