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 129 130 131 132 133 134 135
| %{
#include <cstdio>
#include <cstdlib>
class Operation
{
public:
virtual ~Operation() { }
virtual int eval() const = 0;
};
class Value : public Operation
{
int m_value;
public:
Value(int v) : m_value(v) { }
virtual int eval() const { return m_value; }
};
class BinaryOperation : public Operation
{
protected:
const Operation* m_left;
const Operation* m_right;
BinaryOperation(const Operation* left, const Operation* right) : m_left(left), m_right(right) { }
~BinaryOperation() { delete m_left; delete m_right; }
};
class Addition : public BinaryOperation
{
public:
Addition(const Operation* left, const Operation* right)
: BinaryOperation(left, right)
{
}
virtual int eval() const { return m_left->eval()+m_right->eval(); }
};
class Soustraction : public BinaryOperation
{
public:
Soustraction(const Operation* left, const Operation* right)
: BinaryOperation(left, right)
{
}
virtual int eval() const { return m_left->eval()-m_right->eval(); }
};
class Multiplication : public BinaryOperation
{
public:
Multiplication(const Operation* left, const Operation* right)
: BinaryOperation(left, right)
{
}
virtual int eval() const { return m_left->eval()*m_right->eval(); }
};
class Division : public BinaryOperation
{
public:
Division(const Operation* left, const Operation* right)
: BinaryOperation(left, right)
{
}
virtual int eval() const { return m_left->eval()/m_right->eval(); }
};
static int yylex()
{
return fgetc(stdin);
}
static void yyerror(const char *msg)
{
fprintf(stderr, "%s\n", msg);
}
%}
%union
{
const Operation* op;
}
%type <op> operation value
%start doPrint
%%
doPrint:
operation '\n' { printf("result:%d\n", $1->eval()); delete $1; }
;
operation:
value { $$ = $1; }
|
value '+' operation { $$ = new Addition($1, $3); }
|
value '-' operation { $$ = new Soustraction($1, $3); }
|
value '*' operation { $$ = new Multiplication($1, $3); }
|
value '/' operation { $$ = new Division($1, $3); }
;
value:
'1' { $$ = new Value(1); }
|
'2' { $$ = new Value(2); }
|
'3' { $$ = new Value(3); }
|
'4' { $$ = new Value(4); }
|
'5' { $$ = new Value(5); }
|
'6' { $$ = new Value(6); }
|
'7' { $$ = new Value(7); }
|
'8' { $$ = new Value(8); }
|
'9' { $$ = new Value(9); }
|
'0' { $$ = new Value(0); }
%%
int main()
{
yyparse();
} |
Partager