1:
2: doctype public "-//IDN etl.sf.net//ETL//Grammar 0.2.1";
3: /// This abstract grammar contains definition of some
4: /// common operators. This grammar intentionally leaves out
5: /// assignment operators, literals, and value creation operators.
6: grammar abstract net.sf.etl.samples.ej.CommonOperators {
7: namespace c = "http://etl.sf.net/2006/samples/ej/0.1";
8: context abstract CommonOperators {
9: op UnaryMinusOp(fy, 200, -) {
10: ^ c:UnaryMinusOp {
11: @ value = right;
12: };
13: };
14: op UnaryPlusOp(fy, 200, +) {
15: ^ c:UnaryPlusOp {
16: @ value = right;
17: };
18: };
19: op MultiplyOp(yfx, 400, *) {
20: ^ c:MultiplyOp {
21: @ multipliers += left;
22: @ multipliers += right;
23: };
24: };
25: op DivideOp(yfx, 400, /) {
26: ^ c:DivideOp {
27: @ dividend = left;
28: @ divisor = right;
29: };
30: };
31: op RemainderOp(yfx, 400, %) {
32: ^ c:RemainderOp {
33: @ dividend = left;
34: @ divisor = right;
35: };
36: };
37: op PlusOp(yfx, 500, +) {
38: ^ c:PlusOp {
39: @ summands += left;
40: @ summands += right;
41: };
42: };
43: op MinusOp(yfx, 500, -) {
44: ^ c:MinusOp {
45: @ minuend = left;
46: @ subtrahend = right;
47: };
48: };
49: op LeftShiftOp(yfx, 600, <<) {
50: ^ c:LeftShiftOp {
51: @ value = left;
52: @ distance = right;
53: };
54: };
55: op RightShiftOp(yfx, 600, >>) {
56: ^ c:RightShiftOp {
57: @ value = left;
58: @ distance = right;
59: };
60: };
61: op ZeroExtensionRightShiftOp(yfx, 600, >>>) {
62: ^ c:ZeroExtensionRightShiftOp {
63: @ value = left;
64: @ distance = right;
65: };
66: };
67: op BitwiseComplementOp(fy, 200, ~) {
68: ^ c:BitwiseComplementOp {
69: @ value = right;
70: };
71: };
72: op LogicalComplementOp(fy, 200, !) {
73: ^ c:LogicalComplementOp {
74: @ value = right;
75: };
76: };
77: op BitwiseAndOp(yfx, 900, &) {
78: ^ c:BitwiseAndOp {
79: @ value1 = left;
80: @ value2 = right;
81: };
82: };
83: op BitwiseXorOp(yfx, 1000, ^) {
84: ^ c:BitwiseXorOp {
85: @ value1 = left;
86: @ value2 = right;
87: };
88: };
89: op BitwiseOrOp(yfx, 1100, |) {
90: ^ c:BitwiseOrOp {
91: @ value1 = left;
92: @ value2 = right;
93: };
94: };
95: op ConditionalAndOp(yfx, 1200, &&) {
96: ^ c:ConditionalAndOp {
97: @ value1 = left;
98: @ value2 = right;
99: };
100: };
101: op ConditionalOrOp(xfx, 1300, ||) {
102: ^ c:ConditionalOrOp {
103: @ value1 = left;
104: @ value2 = right;
105: };
106: };
107: op LessThenOp(xfx, 700, <) {
108: ^ c:LessThenOp {
109: @ value1 = left;
110: @ value2 = right;
111: };
112: };
113: op LessOrEqualOp(yfx, 700, <=) {
114: ^ c:LessOrEqualOp {
115: @ value1 = left;
116: @ value2 = right;
117: };
118: };
119: op GreaterThenOpOp(yfx, 700, >) {
120: ^ c:GreaterThenOp {
121: @ value1 = left;
122: @ value2 = right;
123: };
124: };
125: op GreaterOrEqualOp(yfx, 700, >=) {
126: ^ c:GreaterOrEqualOp {
127: @ value1 = left;
128: @ value2 = right;
129: };
130: };
131: op EqualOp(xfx, 800, ==) {
132: ^ c:EqualOp {
133: @ value1 = left;
134: @ value2 = right;
135: };
136: };
137: op NotEqualOp(xfx, 800, !=) {
138: ^ c:NotEqualOp {
139: @ value1 = left;
140: @ value2 = right;
141: };
142: };
143: op composite ConditionalOp(xfy, 1400) {
144: ^ c:ConditionalOp {
145: @ condition = left;
146: % ? {
147: @ thenPart = expression;
148: % :{
149: };
150: };
151: @ elsePart = right;
152: };
153: };
154: };
155: };