33
44typedef enum {
55 OP_UNKNOWN = -1 ,
6- OP_LOGICAL_NOT ,
6+ OP_INCREMENT_PRE ,
7+ OP_DECREMENT_PRE ,
8+ OP_INCREMENT_POST ,
9+ OP_DECREMENT_POST ,
710 OP_MULTIPLY ,
811 OP_DIVIDE ,
912 OP_MODULO ,
1013 OP_ADD ,
1114 OP_SUBTRACT ,
1215 OP_LEFT_BIT_SHIFT ,
1316 OP_RIGHT_BIT_SHIFT ,
14- OP_IS_GREATER_THAN ,
1517 OP_IS_GREATER_THAN_OR_EQUAL ,
16- OP_IS_LESS_THAN ,
18+ OP_IS_GREATER_THAN ,
1719 OP_IS_LESS_THAN_OR_EQUAL ,
20+ OP_IS_LESS_THAN ,
1821 OP_IS_EQUAL ,
1922 OP_IS_NOT_EQUAL ,
23+ OP_LOGICAL_AND ,
24+ OP_LOGICAL_OR ,
2025 OP_BITWISE_AND ,
2126 OP_BITWISE_XOR ,
2227 OP_BITWISE_OR ,
23- OP_LOGICAL_AND ,
24- OP_LOGICAL_OR ,
28+ OP_LOGICAL_NOT ,
2529 OP_PRIME ,
26- OP_INCREMENT_PRE ,
27- OP_DECREMENT_PRE ,
28- OP_INCREMENT_POST ,
29- OP_DECREMENT_POST ,
30- OP_IF ,
3130 OP_IF_ELSE ,
32- OP_IF_THEN_ELSE
31+ OP_IF ,
32+ OP_IF_THEN_ELSE ,
33+ N_OP
3334} expr_op_t ;
3435
3536#define NONE 0x0
@@ -43,36 +44,37 @@ static struct {
4344 uint8_t arity ;
4445 uint8_t precedence ;
4546 uint16_t optimize_const_ops ;
47+ uint8_t assignment ;
4648} op_tbl [] = {
4749/* left==0 | right==0 | left==1 | right==1 */
48- { "! " , 1 , 11 , GET_ONE | GET_ONE <<4 | GET_ZERO <<8 | GET_ZERO <<12 },
49- { "* " , 2 , 10 , GET_ZERO | GET_ZERO <<4 | GET_OPER <<8 | GET_OPER <<12 },
50- { "/ " , 2 , 10 , GET_ZERO | BAD_EXPR <<4 | NONE <<8 | GET_OPER <<12 },
51- { "% " , 2 , 10 , GET_ZERO | GET_OPER << 4 | NONE <<8 | NONE <<12 },
52- { "+ " , 2 , 9 , GET_OPER | GET_OPER <<4 | NONE <<8 | NONE <<12 },
53- { "- " , 2 , 9 , NONE | GET_OPER <<4 | NONE <<8 | NONE <<12 },
54- { "<< " , 2 , 8 , GET_ZERO | GET_OPER <<4 | NONE <<8 | NONE <<12 },
55- { ">> " , 2 , 8 , GET_ZERO | GET_OPER <<4 | NONE <<8 | NONE <<12 },
56- { "> " , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
57- { ">= " , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
58- { "< " , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
59- { "< =" , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
60- { "== " , 2 , 6 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
61- { "! =" , 2 , 6 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
62- { "& " , 2 , 5 , GET_ZERO | GET_ZERO <<4 | NONE <<8 | NONE <<12 },
63- { "^ " , 2 , 4 , GET_OPER | GET_OPER <<4 | NONE <<8 | NONE <<12 },
64- { "| " , 2 , 3 , GET_OPER | GET_OPER <<4 | GET_ONE <<8 | GET_ONE <<12 },
65- { "&&" , 2 , 2 , GET_ZERO | GET_ZERO <<4 | NONE <<8 | NONE <<12 },
66- { "||" , 2 , 1 , GET_OPER | GET_OPER <<4 | GET_ONE <<8 | GET_ONE <<12 },
67- { "' " , 1 , 12 , GET_ZERO | NONE <<4 | GET_ZERO <<8 | NONE <<12 },
68- { "++. " , 1 , 12 , GET_ONE | NONE <<4 | NONE <<8 | NONE <<12 },
69- { "--. " , 1 , 12 , NONE | NONE <<4 | GET_ZERO <<8 | NONE <<12 },
70- { ".++ " , 1 , 12 , GET_ONE | NONE <<4 | NONE <<8 | NONE <<12 },
71- { ".-- " , 1 , 12 , NONE | NONE <<4 | GET_ZERO <<8 | NONE <<12 },
50+ { "++ " , 1 , 12 , GET_ONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
51+ { "-- " , 1 , 12 , NONE | NONE <<4 | GET_ZERO <<8 | NONE <<12 , 0 },
52+ { "++ " , 1 , 12 , GET_ONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
53+ { "-- " , 1 , 12 , NONE | NONE <<4 | GET_ZERO << 8 | NONE <<12 , 0 },
54+ { "* " , 2 , 10 , GET_ZERO | GET_ZERO <<4 | GET_OPER <<8 | GET_OPER <<12 , 1 },
55+ { "/ " , 2 , 10 , GET_ZERO | BAD_EXPR <<4 | NONE <<8 | GET_OPER <<12 , 1 },
56+ { "% " , 2 , 10 , GET_ZERO | GET_OPER <<4 | NONE <<8 | NONE <<12 , 1 },
57+ { "+ " , 2 , 9 , GET_OPER | GET_OPER <<4 | NONE <<8 | NONE <<12 , 1 },
58+ { "- " , 2 , 9 , NONE | GET_OPER <<4 | NONE <<8 | NONE <<12 , 1 },
59+ { "<< " , 2 , 8 , GET_ZERO | GET_OPER <<4 | NONE <<8 | NONE <<12 , 0 },
60+ { ">> " , 2 , 8 , GET_ZERO | GET_OPER <<4 | NONE <<8 | NONE <<12 , 0 },
61+ { "> =" , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
62+ { "> " , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
63+ { "< =" , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
64+ { "< " , 2 , 7 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
65+ { "== " , 2 , 6 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
66+ { "!= " , 2 , 6 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
67+ { "&&" , 2 , 2 , GET_ZERO | GET_ZERO <<4 | NONE <<8 | NONE <<12 , 0 },
68+ { "||" , 2 , 1 , GET_OPER | GET_OPER <<4 | GET_ONE <<8 | GET_ONE <<12 , 0 },
69+ { "& " , 2 , 5 , GET_ZERO | GET_ZERO <<4 | NONE <<8 | NONE <<12 , 1 },
70+ { "^ " , 2 , 4 , GET_OPER | GET_OPER <<4 | NONE <<8 | NONE <<12 , 1 },
71+ { "| " , 2 , 3 , GET_OPER | GET_OPER <<4 | GET_ONE <<8 | GET_ONE <<12 , 1 },
72+ { "! " , 1 , 11 , GET_ONE | GET_ONE <<4 | GET_ZERO <<8 | GET_ZERO <<12 , 0 },
73+ { "' " , 1 , 12 , GET_ZERO | NONE <<4 | GET_ZERO <<8 | NONE <<12 , 0 },
7274 /* TODO: handle optimization of ternary operator */
73- { "IFTHEN " , 2 , 0 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
74- { "IFELSE " , 2 , 0 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
75- { "IFTHENELSE" , 3 , 0 , NONE | NONE <<4 | NONE <<8 | NONE <<12 },
75+ { "?: " , 2 , 0 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
76+ { "? " , 2 , 0 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
77+ { "IFTHENELSE" , 3 , 0 , NONE | NONE <<4 | NONE <<8 | NONE <<12 , 0 },
7678};
7779
7880#endif /* __MPR_EXPR_OPERATOR_H__ */
0 commit comments