diff options
Diffstat (limited to 'opfuncs.c')
-rw-r--r-- | opfuncs.c | 34 |
1 files changed, 14 insertions, 20 deletions
@@ -5,11 +5,11 @@ int precedence(const char *op){ switch(op[0]){ - case '!': return op[1]=='='&&!op[2]? 5:!op[1]?12:-1; + case '!': return op[1]=='='&&!op[2]? 5:-1; case '%': return op[1]=='='&&!op[2]? 1:!op[1]?11:-1; case '&': return op[1]=='='&&!op[2]? 1:op[1]=='&'&&!op[2]? 4:!op[1]? 9:-1; - case '(': return op[1]=='-'&&op[2]==')'&&!op[3]?12:op[1]=='!'&&op[2]==')'&&!op[3]?13:-1; - case '*': return op[1]=='*'&&op[2]=='='&&!op[3]? 1:op[1]=='='&&!op[2]? 1:op[1]=='*'&&!op[2]?14:!op[1]?11:-1; + case '(': return op[1]=='-'&&op[2]==')'&&!op[3]?12:op[1]=='!'&&op[2]==')'&&!op[3]?12:op[1]=='~'&&op[2]==')'&&!op[3]?12:-1; + case '*': return op[1]=='*'&&op[2]=='='&&!op[3]? 1:op[1]=='='&&!op[2]? 1:op[1]=='*'&&!op[2]?13:!op[1]?11:-1; case '+': return op[1]=='='&&!op[2]? 1:!op[1]?10:-1; case '-': return op[1]=='='&&!op[2]? 1:!op[1]?10:-1; case '/': return op[1]=='/'&&op[2]=='='&&!op[3]? 1:op[1]=='='&&!op[2]? 1:op[1]=='/'&&!op[2]?11:!op[1]?11:-1; @@ -18,7 +18,6 @@ int precedence(const char *op){ case '>': return op[1]=='='&&!op[2]? 6:!op[1]? 6:-1; case '^': return op[1]=='='&&!op[2]? 1:op[1]=='^'&&!op[2]? 3:!op[1]? 8:-1; case '|': return op[1]=='='&&!op[2]? 1:op[1]=='|'&&!op[2]? 2:!op[1]? 7:-1; - case '~': return !op[1]?12:-1; default: return -1; } } @@ -26,11 +25,11 @@ int precedence(const char *op){ int precedence_len(const char *op,const int len){ if(len<=0)return -1; switch(op[0]){ - case '!': return len==2&&op[1]=='='? 5:len==1?12:-1; + case '!': return len==2&&op[1]=='='? 5:-1; case '%': return len==2&&op[1]=='='? 1:len==1?11:-1; case '&': return len==2&&op[1]=='='? 1:len==2&&op[1]=='&'? 4:len==1? 9:-1; - case '(': return len==3&&op[1]=='-'&&op[2]==')'?12:len==3&&op[1]=='!'&&op[2]==')'?13:-1; - case '*': return len==3&&op[1]=='*'&&op[2]=='='? 1:len==2&&op[1]=='='? 1:len==2&&op[1]=='*'?14:len==1?11:-1; + case '(': return len==3&&op[1]=='-'&&op[2]==')'?12:len==3&&op[1]=='!'&&op[2]==')'?12:len==3&&op[1]=='~'&&op[2]==')'?12:-1; + case '*': return len==3&&op[1]=='*'&&op[2]=='='? 1:len==2&&op[1]=='='? 1:len==2&&op[1]=='*'?13:len==1?11:-1; case '+': return len==2&&op[1]=='='? 1:len==1?10:-1; case '-': return len==2&&op[1]=='='? 1:len==1?10:-1; case '/': return len==3&&op[1]=='/'&&op[2]=='='? 1:len==2&&op[1]=='='? 1:len==2&&op[1]=='/'?11:len==1?11:-1; @@ -39,17 +38,16 @@ int precedence_len(const char *op,const int len){ case '>': return len==2&&op[1]=='='? 6:len==1? 6:-1; case '^': return len==2&&op[1]=='='? 1:len==2&&op[1]=='^'? 3:len==1? 8:-1; case '|': return len==2&&op[1]=='='? 1:len==2&&op[1]=='|'? 2:len==1? 7:-1; - case '~': return len==1?12:-1; default: return -1; } } int associativity(const char *op){ switch(op[0]){ - case '!': return op[1]=='='&&!op[2]?AS_NONASSOC:!op[1]?AS_PREFIX :-1; + case '!': return op[1]=='='&&!op[2]?AS_NONASSOC:-1; case '%': return op[1]=='='&&!op[2]?AS_RIGHT :!op[1]?AS_LEFT :-1; case '&': return op[1]=='='&&!op[2]?AS_RIGHT :op[1]=='&'&&!op[2]?AS_LEFT :!op[1]?AS_LEFT :-1; - case '(': return op[1]=='-'&&op[2]==')'&&!op[3]?AS_PREFIX :op[1]=='!'&&op[2]==')'&&!op[3]?AS_SUFFIX :-1; + case '(': return op[1]=='-'&&op[2]==')'&&!op[3]?AS_PREFIX :op[1]=='!'&&op[2]==')'&&!op[3]?AS_PREFIX :op[1]=='~'&&op[2]==')'&&!op[3]?AS_PREFIX :-1; case '*': return op[1]=='*'&&op[2]=='='&&!op[3]?AS_RIGHT :op[1]=='='&&!op[2]?AS_RIGHT :op[1]=='*'&&!op[2]?AS_RIGHT :!op[1]?AS_LEFT :-1; case '+': return op[1]=='='&&!op[2]?AS_RIGHT :!op[1]?AS_LEFT :-1; case '-': return op[1]=='='&&!op[2]?AS_RIGHT :!op[1]?AS_LEFT :-1; @@ -59,7 +57,6 @@ int associativity(const char *op){ case '>': return op[1]=='='&&!op[2]?AS_NONASSOC:!op[1]?AS_NONASSOC:-1; case '^': return op[1]=='='&&!op[2]?AS_RIGHT :op[1]=='^'&&!op[2]?AS_LEFT :!op[1]?AS_LEFT :-1; case '|': return op[1]=='='&&!op[2]?AS_RIGHT :op[1]=='|'&&!op[2]?AS_LEFT :!op[1]?AS_LEFT :-1; - case '~': return !op[1]?AS_PREFIX :-1; default: return -1; } } @@ -67,10 +64,10 @@ int associativity(const char *op){ int associativity_len(const char *op,const int len){ if(len<=0)return -1; switch(op[0]){ - case '!': return len==2&&op[1]=='='?AS_NONASSOC:len==1?AS_PREFIX :-1; + case '!': return len==2&&op[1]=='='?AS_NONASSOC:-1; case '%': return len==2&&op[1]=='='?AS_RIGHT :len==1?AS_LEFT :-1; case '&': return len==2&&op[1]=='='?AS_RIGHT :len==2&&op[1]=='&'?AS_LEFT :len==1?AS_LEFT :-1; - case '(': return len==3&&op[1]=='-'&&op[2]==')'?AS_PREFIX :len==3&&op[1]=='!'&&op[2]==')'?AS_SUFFIX :-1; + case '(': return len==3&&op[1]=='-'&&op[2]==')'?AS_PREFIX :len==3&&op[1]=='!'&&op[2]==')'?AS_PREFIX :len==3&&op[1]=='~'&&op[2]==')'?AS_PREFIX :-1; case '*': return len==3&&op[1]=='*'&&op[2]=='='?AS_RIGHT :len==2&&op[1]=='='?AS_RIGHT :len==2&&op[1]=='*'?AS_RIGHT :len==1?AS_LEFT :-1; case '+': return len==2&&op[1]=='='?AS_RIGHT :len==1?AS_LEFT :-1; case '-': return len==2&&op[1]=='='?AS_RIGHT :len==1?AS_LEFT :-1; @@ -80,17 +77,16 @@ int associativity_len(const char *op,const int len){ case '>': return len==2&&op[1]=='='?AS_NONASSOC:len==1?AS_NONASSOC:-1; case '^': return len==2&&op[1]=='='?AS_RIGHT :len==2&&op[1]=='^'?AS_LEFT :len==1?AS_LEFT :-1; case '|': return len==2&&op[1]=='='?AS_RIGHT :len==2&&op[1]=='|'?AS_LEFT :len==1?AS_LEFT :-1; - case '~': return len==1?AS_PREFIX :-1; default: return -1; } } int parseoplength(const char *op){ switch(op[0]){ - case '!': return op[1]=='='?2:1; + case '!': return op[1]=='='?2:-1; case '%': return op[1]=='='?2:1; case '&': return op[1]=='='?2:op[1]=='&'?2:1; - case '(': return op[1]=='-'&&op[2]==')'?3:op[1]=='!'&&op[2]==')'?3:-1; + case '(': return op[1]=='-'&&op[2]==')'?3:op[1]=='!'&&op[2]==')'?3:op[1]=='~'&&op[2]==')'?3:-1; case '*': return op[1]=='*'&&op[2]=='='?3:op[1]=='='?2:op[1]=='*'?2:1; case '+': return op[1]=='='?2:1; case '-': return op[1]=='='?2:1; @@ -100,7 +96,6 @@ int parseoplength(const char *op){ case '>': return op[1]=='='?2:1; case '^': return op[1]=='='?2:op[1]=='^'?2:1; case '|': return op[1]=='='?2:op[1]=='|'?2:1; - case '~': return 1; default: return -1; } } @@ -108,10 +103,10 @@ int parseoplength(const char *op){ const char* opconststring_len(const char *op,const int len){ if(len<=0)return NULL; switch(op[0]){ - case '!': return len==2&&op[1]=='='?"!=":len==1?"!":NULL; + case '!': return len==2&&op[1]=='='?"!=":NULL; case '%': return len==2&&op[1]=='='?"%=":len==1?"%":NULL; case '&': return len==2&&op[1]=='='?"&=":len==2&&op[1]=='&'?"&&":len==1?"&":NULL; - case '(': return len==3&&op[1]=='-'&&op[2]==')'?"(-)":len==3&&op[1]=='!'&&op[2]==')'?"(!)":NULL; + case '(': return len==3&&op[1]=='-'&&op[2]==')'?"(-)":len==3&&op[1]=='!'&&op[2]==')'?"(!)":len==3&&op[1]=='~'&&op[2]==')'?"(~)":NULL; case '*': return len==3&&op[1]=='*'&&op[2]=='='?"**=":len==2&&op[1]=='='?"*=":len==2&&op[1]=='*'?"**":len==1?"*":NULL; case '+': return len==2&&op[1]=='='?"+=":len==1?"+":NULL; case '-': return len==2&&op[1]=='='?"-=":len==1?"-":NULL; @@ -121,7 +116,6 @@ const char* opconststring_len(const char *op,const int len){ case '>': return len==2&&op[1]=='='?">=":len==1?">":NULL; case '^': return len==2&&op[1]=='='?"^=":len==2&&op[1]=='^'?"^^":len==1?"^":NULL; case '|': return len==2&&op[1]=='='?"|=":len==2&&op[1]=='|'?"||":len==1?"|":NULL; - case '~': return len==1?"~":NULL; default: return NULL; } } |