 t1, ... tk: space seperated token in the query string
 m1, ... ml: tokens prefixed with -
 p1, ... pm: tokens prefixed with +

 mainS      {t1} NEAR {t2} NEAR ... NEAR {tk}
 mainPhrase {t1} {t2} ... {tk}
 mainAccumS {t1} , {t2} , ... , {tk}
 mainAboutS t1 t2 ... tk 
           (all braces and parentheses are replaces with blanks)
 minusS     {m1} OR {m2} OR ... OR {ml}
 plusS      {p1}*8, {p2}*8, ... , {pm}*8
 plusS2     {p1}*8 AND {p2}*8 AND ... AND {pm}*8

the generated finalS query strings:
code (meaning)
               finalS
7 (hasMain, hasPlus, hasMinus):
7 ((plusS2)*10)*10 AND ((plusS),(mainPhraseS)*4,(mainS)*2,(mainAccumS)*1, about(mainAboutS)*1) NOT( minusS )
  --
6 (hasMain,hasPlus)
6  (plusS2)*10)*10 AND ((plusS),(mainPhraseS)*4,(mainS)*2,(mainAccumS)*1, about(mainAboutS)*1)
  --
5 (hasMain,hasMinus)
5                              ((mainPhraseS)*4,(mainS)*2,(mainAccumS)*1,about(mainAboutS)*1) NOT(minusS)
  --
4 (hasMain) formerly the only case that uses the section flag for WITHIN stuff
4                                (mainPhraseS)*3,(mainS)*1,(mainAccumS)*1,about(mainAboutS)*1
  --
3 (hasPlus,hasMinus)
3                                  (plusS) NOT (minusS)
  --
2 (hasPlus)
2                                  (plusS2)
  --
1 (hasMinus)
1                                  is NOT( minusS )
  --
0 ()
                                   ''
