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
|
Change operator order so that binary 'or' and binary 'and' are
not on the same level, but so that 'and' comes before 'or'.
This is to match the standard C precedence.
Also add support for the % (modulus), < (binary left shift),
and > (binary right shift) operators.
Patch by Mike Frysinger <vapier@gentoo.org>
--- pcalc-000/README
+++ pcalc-000/README
@@ -60,10 +60,12 @@
Operator priorities:
- LOW '=' assignment
- or and binary or/binary and
- '+' '-' addition/subtruction
- '*' '/' multiply/divide
- '-' unary minus
- HIGH '^' exponentation
+ LOW '=' assignment
+ or binary or
+ and binary and
+ '>' '<' binary left/right shift
+ '+' '-' addition/subtruction
+ '*' '/' '%' multiply/divide/modulus
+ '-' unary minus
+ HIGH '^' exponentation
Syntax:
--- pcalc-000/help.c
+++ pcalc-000/help.c
@@ -40,5 +40,5 @@
\n\
Operators:\n\
- '+' '-' '*' '/' '^'\n\
+ '+' '-' '*' '/' '%' '^'\n\
\n\
Constants: (case sensitive)\n\
@@ -81,10 +81,12 @@
Operator priorities:\n\
\n\
- right assotiation: '=' ASSIGNMENT\n\
- left assotiation: or and BINARY OR/BINARY AND\n\
- left assotiation: '+' '-' ADDITION/SUBTRUCTION\n\
- left assotiation: '*' '/' MULTIPLY/DIVIDE\n\
- left assotiation: '-' UNARY MINUS\n\
- right assotiation: '^' EXPONENTATION\n\
+ right assotiation: '=' ASSIGNMENT\n\
+ left assotiation: or BINARY OR\n\
+ left assotiation: and BINARY AND\n\
+ left assotiation: '<' '>' BINARY LEFT/RIGHT SHIFT\n\
+ left assotiation: '+' '-' ADDITION/SUBTRUCTION\n\
+ left assotiation: '*' '/' '%' MULTIPLY/DIVIDE\n\
+ left assotiation: '-' UNARY MINUS\n\
+ right assotiation: '^' EXPONENTATION\n\
\n\
");
--- pcalc-000/pcalc.txt
+++ pcalc-000/pcalc.txt
@@ -59,10 +59,12 @@
Operator priorities:
- LOW '=' assignment
- or and binary or/binary and
- '+' '-' addition/subtruction
- '*' '/' multiply/divide
- '-' unary minus
- HIGH '^' exponentation
+ LOW '=' assignment
+ or binary or
+ and binary and
+ '<' '>' binary left/right shift
+ '+' '-' addition/subtruction
+ '*' '/' '%' multiply/divide/modulus
+ '-' unary minus
+ HIGH '^' exponentation
Syntax:
--- pcalc-000/pcalc.y
+++ pcalc-000/pcalc.y
@@ -59,7 +59,9 @@
%right '='
-%left '|' '&'
+%left '|'
+%left '&'
+%left '<' '>'
%left '+' '-'
-%left '*' '/'
+%left '*' '/' '%'
%left UNARYMINUS
%right '^' /* exponentiation */
@@ -113,4 +113,6 @@
| expr '|' expr { $$ = (long)$1 | (long)$3 ;}
| expr '&' expr { $$ = (long)$1 & (long)$3 ;}
+ | expr '<' expr { $$ = (long)$1 << (long)$3 ; }
+ | expr '>' expr { $$ = (long)$1 >> (long)$3 ; }
| expr '+' expr { $$ = $1 + $3 ; }
| expr '-' expr { $$ = $1 - $3 ; }
@@ -119,4 +120,5 @@
$$ = $1 / $3 ;
}
+ | expr '%' expr { $$ = (long)$1 % (long)$3 ; }
| expr '^' expr { $$ = Pow( $1, $3) ; }
| '(' expr ')' { $$ = $2 ; }
|