0001 function [elements,newRule] = parseBoolean(str,tokens,allowedElementChars)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 if (nargin < 2)
0016
0017 tokens = '()&|~';
0018 end
0019 if (nargin < 3)
0020
0021 allowedElementChars = '[A-Za-z0-9_\.\-]';
0022 end
0023
0024 str1=str;
0025
0026
0027 str1 = regexprep(str1, 'and ', '& ','ignorecase');
0028 str1 = regexprep(str1, 'or ', '| ','ignorecase');
0029 str1 = regexprep(str1, 'not ', '~ ','ignorecase');
0030 str1 = regexprep(str1,'\[','');
0031 str1 = regexprep(str1,'\]','');
0032 newRule = str1;
0033
0034 elements = {};
0035 endStr = str1;
0036 cnt = 0;
0037 tmpRule = [];
0038 while (~isempty(endStr))
0039
0040 [tok,endStr] = strtok(endStr,tokens);
0041
0042 if (~isempty(tok))
0043
0044 if (regexp(tok,'\S') > 0)
0045
0046 tok = tok(~isspace(tok));
0047
0048 if (sum(strcmp(elements,tok)) == 0)
0049
0050 cnt = cnt + 1;
0051 elements{end+1} = tok;
0052 end
0053
0054 newTok = ['x(' num2str(cnt) ')'];
0055
0056 tok = regexprep(tok,'\[','');
0057 tok = regexprep(tok,'\]','');
0058
0059 [s,f] = regexp(newRule,tok);
0060
0061 ruleLength = length(newRule);
0062
0063 replaceThisVector = false(length(s),1);
0064
0065
0066 for i = 1:length(s)
0067
0068 if ((s(i) == 1) & (f(i) == ruleLength))
0069 replaceThisFlag = true;
0070 elseif (s(i) == 1)
0071 if (isempty(regexp(newRule(f(i)+1),allowedElementChars)))
0072
0073 replaceThisFlag = true;
0074 else
0075
0076 replaceThisFlag = false;
0077 end
0078 elseif (f(i) == ruleLength)
0079 if (isempty(regexp(newRule(s(i)-1),allowedElementChars)))
0080
0081 replaceThisFlag = true;
0082 else
0083
0084 replaceThisFlag = false;
0085 end
0086 else
0087 if (isempty(regexp(newRule(f(i)+1),allowedElementChars)) & isempty(regexp(newRule(s(i)-1),allowedElementChars)))
0088
0089 replaceThisFlag = true;
0090 else
0091
0092 replaceThisFlag = false;
0093 end
0094 end
0095 replaceThisVector(i) = replaceThisFlag;
0096 end
0097
0098 s = s(replaceThisVector);
0099 f = f(replaceThisVector);
0100 nRep = length(s);
0101 for i = 1:nRep
0102
0103 if (i == 1)
0104 if (s(i) > 1)
0105 tmpRule = newRule(1:(s(i)-1));
0106 else
0107 tmpRule = [];
0108 end
0109 end
0110
0111 tmpRule = [tmpRule newTok];
0112
0113
0114 if (i < nRep)
0115 tmpRule = [tmpRule newRule((f(i)+1):(s(i+1)-1))];
0116 end
0117
0118 if (i == nRep)
0119 if (f(i) < ruleLength)
0120 tmpRule = [tmpRule newRule(f(i)+1:end)];
0121 end
0122 end
0123 end
0124 newRule = tmpRule;
0125 end
0126 end
0127 end
0128