对字符串提取以及运算操作处理

     enum.h文件,枚举类型文件

 1 #ifndef ENUM_H
 2 #define ENUM_H
 3 
 4 #include <QDataStream>
 5 #include <QtCore/qmath.h>
 6 
 7 enum REG_INS_TYPE {REG_INS,POS_REG_INS,POS_REG_AXIS_INS,AR_PAL_REG_INS,STR_REG};
 8 enum VALUE_TYPE
 9 {
10     REG_AR,REG_CONST,REG_R,REG_PR,REG_GI,
11     REG_GO,REG_AI,REG_AO,REG_DI,REG_DO,REG_RI,
12     REG_RO,REG_SI,REG_SO,REG_UI,REG_UO,REG_TIMER,
13     REG_TIMER_OVERFLOW,REG_P,REG_Lpos,REG_Jpos,
14     REG_UFRAM,REG_UTOOL,REG_PL,REG_ADD,REG_DEC,
15     REG_MUL,REG_DIVIVIDE,REG_MOD,REG_DIV,
16     REG_LEFT_BRK,REG_RIGHT_BRK,REG_PL_CONST,REG_PR_IJ
17 };
18 
19 enum ADDRESSING_TYPE {DIRECT,INDIRECT};
20 
21 #endif // ENUM_H

字符串的解析

parseStack.h
 1 #ifndef PARSESTACK_H
 2 #define PARSESTACK_H
 3 
 4 //#include "datavector.h"
 5 #include <QVector>
 6 #include <QStack>
 7 #include <QDebug>
 8 
 9 #include "register.h"
10 
11 class ParseStack
12 {
13 public:
14     ParseStack();
15     
16     QVector<RegConditionBlock> listData;
17 
18 //    QVector<DataVector> listData;
19     
20     void initData();
21     double parseData();
22     void calc();
23 
24     void startReg(Register reg);
25     void parsePlData();
26     
27     QList <int> rList;
28     QList <int> prList;
29     QList <int> plList;
30     QList <int> srList;
31 
32     QVector <int> DI;
33 
34     QVector <int> arList;
35     QVector <int> utooList;
36 
37     QVector <QVector <int> > prIjList;
38 
39     QVector <QVector<int> > realPList;
40 
41     QVector <int> cVector;
42     
43     QStack <int> chStack;
44     QStack <double> numStack;
45 
46 //    QStack <QVector <int> > numStack;
47     
48 };
49 
50 #endif // PARSESTACK_H

parseStack.cpp

  1 #include "parsestack.h"
  2 
  3 ParseStack::ParseStack()
  4 {
  5     for(int i = 0; i < 5;i++)
  6     {
  7         rList.append(i);
  8         prList.append(i+2);
  9         plList.append(i+3);
 10         srList.append(i+4);
 11         DI.append(i+5);
 12         arList.append(i);
 13         utooList.append(i+1);
 14     }
 15 
 16     realPList.resize(5);
 17     prIjList.resize(5);
 18     for(int i = 0; i < 5;i++)
 19     {
 20         realPList[i].resize(3);
 21         prIjList[i].resize(3);
 22     }
 23 
 24     for(int i = 0; i < 5;i++)
 25     {
 26         for(int j = 0; j < 3;j++)
 27         {
 28             realPList[i][j] = (i + j);
 29             prIjList[i][j] = (i + j);
 30         }
 31     }
 32 
 33     cVector.resize(3);
 34 }
 35 
 36 //void ParseStack::initData()
 37 //{
 38 ////    DataVector dataVec;
 39 ////    dataVec.regType = REG_R;
 40 ////    dataVec.i = 0;
 41 ////    listData.append(dataVec);
 42     
 43 ////    dataVec.regType = REG_DIV;
 44 ////    listData.append(dataVec);
 45     
 46 ////    dataVec.regType = REG_LEFT_BRK;
 47 ////    listData.append(dataVec);
 48     
 49 ////    dataVec.regType = REG_LEFT_BRK;
 50 ////    listData.append(dataVec);
 51     
 52 ////    dataVec.regType = REG_R;
 53 ////    dataVec.i = 1;
 54 ////    listData.append(dataVec);
 55 
 56 ////    dataVec.regType = REG_ADD;
 57 ////    listData.append(dataVec);
 58     
 59 ////    dataVec.regType = REG_PR;
 60 ////    dataVec.i = 1;
 61 ////    listData.append(dataVec);
 62     
 63 ////    dataVec.regType = REG_DIV;
 64 ////    listData.append(dataVec);
 65     
 66 ////    dataVec.regType = REG_PL;
 67 ////    dataVec.i = 1;
 68 ////    listData.append(dataVec);
 69     
 70 ////    dataVec.regType = REG_RIGHT_BRK;
 71 ////    listData.append(dataVec);
 72     
 73 ////    dataVec.regType = REG_MUL;
 74 ////    listData.append(dataVec);
 75     
 76 ////    dataVec.regType = REG_LEFT_BRK;
 77 ////    listData.append(dataVec);
 78     
 79 ////    dataVec.regType = REG_SR;
 80 ////    dataVec.i = 1;
 81 ////    listData.append(dataVec);
 82     
 83 ////    dataVec.regType = REG_DEC;
 84 ////    listData.append(dataVec);
 85     
 86 ////    dataVec.regType = REG_R;
 87 ////    dataVec.i = 2;
 88 ////    listData.append(dataVec);
 89     
 90 ////    dataVec.regType = REG_RIGHT_BRK;
 91 ////    listData.append(dataVec);
 92     
 93 ////    dataVec.regType = REG_DEC;
 94 ////    listData.append(dataVec);
 95     
 96 ////    dataVec.regType = REG_SR;
 97 ////    dataVec.i = 2;
 98 ////    listData.append(dataVec);
 99     
100 ////    dataVec.regType = REG_RIGHT_BRK;
101 ////    listData.append(dataVec);
102     
103 ////    dataVec.regType = REG_MOD;
104 ////    listData.append(dataVec);
105     
106 ////    dataVec.regType = REG_CONST;
107 ////    dataVec.i = 4;
108 ////    listData.append(dataVec);
109     
110 ////    dataVec.regType = REG_ADD;
111 ////    listData.append(dataVec);
112     
113 ////    dataVec.regType = REG_PR;
114 ////    dataVec.i = 2;
115 ////    listData.append(dataVec);
116 //    DataVector dataVec;
117 
118 //    dataVec.regType = REG_LEFT_BRK;
119 //    listData.append(dataVec);
120 
121 //    dataVec.regType = REG_R;
122 //    dataVec.i = 3;
123 //    listData.append(dataVec);
124 
125 //    dataVec.regType = REG_ADD;
126 //    listData.append(dataVec);
127 
128 //    dataVec.regType = REG_AR;
129 //    dataVec.i = 2;
130 //    listData.append(dataVec);
131 
132 //    dataVec.regType = REG_RIGHT_BRK;
133 //    listData.append(dataVec);
134 
135 //    dataVec.regType = REG_MUL;
136 //    listData.append(dataVec);
137 
138 //    dataVec.regType = REG_PR;
139 //    dataVec.i = 3;
140 //    listData.append(dataVec);
141 
142 //    dataVec.regType = REG_DIV;
143 //    listData.append(dataVec);
144 
145 //    dataVec.regType = REG_LEFT_BRK;
146 //    listData.append(dataVec);
147 
148 //    dataVec.regType = REG_R;
149 //    dataVec.i = 1;
150 //    listData.append(dataVec);
151 
152 //    dataVec.regType = REG_ADD;
153 //    listData.append(dataVec);
154 
155 //    dataVec.regType = REG_PR;
156 //    dataVec.i = 1;
157 //    listData.append(dataVec);
158 
159 //    dataVec.regType = REG_RIGHT_BRK;
160 //    listData.append(dataVec);
161 
162 //    dataVec.regType = REG_DEC;
163 //    listData.append(dataVec);
164 
165 //    dataVec.regType = REG_CONST;
166 //    dataVec.i = 10;
167 //    listData.append(dataVec);
168 
169 //    dataVec.regType = REG_DIV;
170 //    listData.append(dataVec);
171 
172 //    dataVec.regType = REG_LEFT_BRK;
173 //    listData.append(dataVec);
174 
175 //    dataVec.regType = REG_PR;
176 //    dataVec.i = 0;
177 //    listData.append(dataVec);
178 
179 //    dataVec.regType = REG_MUL;
180 //    listData.append(dataVec);
181 
182 //    dataVec.regType = REG_LEFT_BRK;
183 //    listData.append(dataVec);
184 
185 //    dataVec.regType = REG_PL;
186 //    dataVec.i = 3;
187 //    listData.append(dataVec);
188 
189 //    dataVec.regType = REG_DIV;
190 //    listData.append(dataVec);
191 
192 //    dataVec.regType = REG_PR;
193 //    dataVec.i = 0;
194 //    listData.append(dataVec);
195 
196 //    dataVec.regType = REG_DEC;
197 //    listData.append(dataVec);
198 
199 //    dataVec.regType = REG_R;
200 //    dataVec.i = 0;
201 //    listData.append(dataVec);
202 
203 //    dataVec.regType = REG_RIGHT_BRK;
204 //    listData.append(dataVec);
205 
206 //    dataVec.regType = REG_MOD;
207 //    listData.append(dataVec);
208 
209 //    dataVec.regType = REG_R;
210 //    dataVec.i = 2;
211 //    listData.append(dataVec);
212 
213 //    dataVec.regType = REG_ADD;
214 //    listData.append(dataVec);
215 
216 //    dataVec.regType = REG_PR;
217 //    dataVec.i = 1;
218 //    listData.append(dataVec);
219 
220 //    dataVec.regType = REG_RIGHT_BRK;
221 //    listData.append(dataVec);
222 
223 //}
224 
225 double ParseStack::parseData()
226 {
227     qDebug()<<__FUNCTION__<<"******"<<__LINE__<<"****listDataSize****"<<listData.size()<<
228               "***ch**"<<chStack.size()<<endl;
229     while(listData.size() > 0)
230     {
231         //获取当前表达式头部的第一个字符
232         int dataType = listData.at(0).valueType;
233         double num = 0;
234         bool existNum = false;
235 
236         qDebug() << "**dataType***"<<dataType<<endl;
237         if(dataType == REG_CONST ||
238                 dataType == REG_PR ||
239                 dataType == REG_PR_IJ ||
240                 dataType == REG_R ||
241                 dataType == REG_AR ||
242                 dataType ==  REG_GI ||
243                 dataType ==  REG_GO ||
244                 dataType ==  REG_AI ||
245                 dataType ==  REG_AO ||
246                 dataType ==  REG_DI ||
247                 dataType ==  REG_DO ||
248                 dataType ==  REG_RI ||
249                 dataType ==  REG_RO ||
250                 dataType ==  REG_SI ||
251                 dataType ==  REG_SO ||
252                 dataType ==  REG_UI ||
253                 dataType ==  REG_UO ||
254                 dataType ==  REG_TIMER ||
255                 dataType ==  REG_TIMER_OVERFLOW ||
256                 dataType ==  REG_P ||
257                 dataType ==  REG_Lpos ||
258                 dataType ==  REG_Jpos ||
259                 dataType ==  REG_UFRAM ||
260                 dataType ==  REG_UTOOL )
261         {
262             existNum = true;
263             if(existNum)
264             {
265                 if(dataType == REG_CONST)
266                 {
267                     num = listData.at(0).val;
268                     qDebug() <<__LINE__ <<"***num**"<<num<<endl;
269                 }
270                 else if(dataType == REG_PR)
271                 {
272                     if(INDIRECT == listData[0].rightVarType)
273                     {
274                         num = prList[rList[listData[0].i]];
275                     }
276                     else if(DIRECT == listData[0].rightVarType)
277                     {
278                         num = prList.at(listData.at(0).i);
279                     }
280                     qDebug() <<__LINE__ <<"***num**"<<num<<endl;
281                 }
282                 else if(dataType == REG_PR_IJ)
283                 {
284                     num = prIjList[listData[0].i][listData[0].j];
285                     qDebug() << __FUNCTION__ <<"*****"<<__LINE__<<"**I**"<<listData[0].i<<
286                                 "**j***"<<listData[0].j<<"****num**"<<num<<endl;
287                 }
288                 else if(dataType == REG_R)
289                 {
290                     if(INDIRECT == listData[0].rightVarType)
291                     {
292                         num = rList[rList[listData[0].i]];
293                     }
294                     else if(DIRECT == listData[0].rightVarType)
295                     {
296                         num = rList.at(listData.at(0).i);
297                     }
298                     qDebug() <<__LINE__ <<"***num**"<<num<<endl;
299                 }
300                 else if(dataType == REG_AR)
301                 {
302                     if(INDIRECT == listData[0].rightVarType)
303                     {
304                         num = arList[rList[listData[0].i]];
305                     }
306                     else if(DIRECT == listData[0].rightVarType)
307                     {
308                         num = arList.at(listData.at(0).i);
309                     }
310                     qDebug() <<__LINE__ <<"***num**"<<num<<endl;
311                 }
312                 else if(dataType ==  REG_GI)
313                 {
314 
315                 }
316                 else if(dataType ==  REG_GO)
317                 {
318 
319                 }
320                 else if(dataType ==  REG_AI)
321                 {
322 
323                 }
324                 else if(dataType ==  REG_AO)
325                 {
326 
327                 }
328                 else if(dataType ==  REG_DI)
329                 {
330                     if(INDIRECT == listData[0].rightVarType)
331                     {
332                         num = DI[rList[listData[0].i]];
333                     }
334                     else if(DIRECT == listData[0].rightVarType)
335                     {
336                         num = DI[listData.at(0).i];
337                     }
338                     qDebug() <<__LINE__ <<"***num**"<<num<<endl;
339                 }
340                 else if(dataType ==  REG_DO)
341                 {
342 
343                 }
344                 else if(dataType ==  REG_RI)
345                 {
346 
347                 }
348                 else if(dataType ==  REG_RO)
349                 {
350 
351                 }
352                 else if(dataType ==  REG_SI)
353                 {
354 
355                 }
356                 else if(dataType ==  REG_SO)
357                 {
358 
359                 }
360                 else if(dataType ==  REG_UI)
361                 {
362 
363                 }
364                 else if(dataType ==  REG_UO)
365                 {
366 
367                 }
368                 else if(dataType ==  REG_TIMER)
369                 {
370 
371                 }
372                 else if(dataType ==  REG_TIMER_OVERFLOW)
373                 {
374 
375                 }
376                 else if(dataType ==  REG_P)
377                 {
378 
379                 }
380                 else if(dataType ==  REG_Lpos)
381                 {
382 
383                 }
384                 else if(dataType ==  REG_Jpos)
385                 {
386 
387                 }
388                 else if(dataType ==  REG_UFRAM)
389                 {
390 
391                 }
392                 else if(dataType ==  REG_UTOOL)
393                 {
394                     if(INDIRECT == listData[0].rightVarType)
395                     {
396                         num = utooList[rList[listData[0].i]];
397                     }
398                     else if(DIRECT == listData[0].rightVarType)
399                     {
400                         num = utooList.at(listData.at(0).i);
401                     }
402                     qDebug() <<__LINE__ <<"***num**"<<num<<endl;
403                 }
404                 listData.removeFirst();
405                 numStack.push(num);
406                 if(listData.size() == 0)
407                 {
408                     break;
409                 }
410             }
411         }
412         else if(dataType == REG_ADD ||
413                 dataType == REG_DEC ||
414                 dataType == REG_DIV ||
415                 dataType == REG_LEFT_BRK ||
416                 dataType == REG_MOD ||
417                 dataType == REG_MUL ||
418                 dataType == REG_DIVIVIDE ||
419                 dataType == REG_RIGHT_BRK)
420         {
421             listData.removeFirst();
422             if(chStack.isEmpty() ||
423 //               chStack.top() == REG_LEFT_BRK ||
424                     dataType == REG_LEFT_BRK)
425             {
426                 chStack.push(dataType);
427                 //listData.removeFirst();
428                 continue;
429             }
430             switch (dataType)
431             {
432                 case REG_RIGHT_BRK:
433                 {
434                     while((numStack.size() >= 2) &&
435                           !chStack.isEmpty()&&
436                           (chStack.top() != REG_LEFT_BRK))
437                     {
438                         qDebug() << __LINE__<<"***numStack****"<<numStack.size()<<endl;
439                         calc();
440                     }
441                     if(!chStack.isEmpty() &&
442                         (chStack.top() == REG_LEFT_BRK))
443                     {
444                         qDebug() <<"***right****"<<chStack.size()<<"%%%%chStack%%%"<<endl;
445                         chStack.pop();
446                         continue;
447                     }
448                     else
449                     {
450                         qDebug()<<"The number of barckets are not equals!!"<<endl;
451                     }
452                     break;
453                 }
454                 case REG_DIV:
455                 case REG_MOD:
456                 case REG_MUL:
457                 case REG_DIVIVIDE:
458                 {
459                     /**若符号栈栈顶元素为+、-、( 或者符号栈为空,
460                      * 则意味着符号栈栈顶符号比ch优先级底,
461                      * 所以,将ch压栈。否则,将符号栈栈顶元素弹出来,
462                      * 然后开始计算。*/
463                     while ((numStack.size() >= 2) &&
464                            !(chStack.isEmpty() ||
465                              (chStack.top() == REG_LEFT_BRK) ||
466                              (chStack.top() == REG_ADD) ||
467                              (chStack.top() == REG_DEC)))
468                     {
469                         qDebug() << __LINE__<<"***numStack****"<<numStack.size()<<endl;
470                         calc();
471                     }
472                     /**若符号栈顶元素优先级比ch的低*/
473                     if((chStack.isEmpty()) ||
474                        (chStack.top() == REG_LEFT_BRK) ||
475                             (chStack.top() == REG_ADD)||
476                             (chStack.top() == REG_DEC))
477                     {
478                         chStack.push(dataType);
479                         //listData.removeFirst();
480                         continue;
481                     }
482 
483                 }
484                 case REG_ADD:
485                 case REG_DEC:
486                 {
487                     while((numStack.size() >= 2) &&
488                           !chStack.isEmpty() &&
489                            (chStack.top() != REG_LEFT_BRK))
490                     {
491                         qDebug() << __LINE__<<"***numStack****"<<numStack.size()<<endl;
492                         calc();
493                     }
494                     qDebug() << "***chStack**"<<chStack.size()<<endl;
495                     if(chStack.isEmpty() || (chStack.top() == REG_LEFT_BRK))
496                     {
497                         chStack.push(dataType);
498                         //listData.removeFirst();
499                         continue;
500                     }
501                     else
502                     {
503                         qDebug()<<"this string is not illeagal"<<endl;
504                     }
505                 }
506                 default:
507                 {
508                     qDebug()<<"argument error!!!"<<endl;
509                 }
510             }
511              //listData.removeFirst();
512              if(listData.size() == 0)
513              {
514                  break;
515              }
516         }
517     }//while结束
518 
519      // 若符号栈不为空,则不断的从符号栈和数字栈中弹出元素,进行计算
520     while(!chStack.isEmpty())
521     {
522         qDebug() << __LINE__<<"***numStack****"<<numStack.size()<<endl;
523         calc();
524     }
525     qDebug() << "***numStackSize***"<<numStack.size()<<endl;
526     return (numStack.size() == 1)?numStack.pop():0;
527 }
528 
529 void ParseStack::calc()
530 {
531 
532     qDebug() << "**num#######stack###size####"<<numStack.size()<<endl;
533 
534     double b = numStack.pop();
535     double a = numStack.pop();
536 
537     int operatorType = chStack.pop();
538 
539     qDebug() <<__FUNCTION__<< "******"<<__LINE__<<"***a**"<<a<<
540                "***b**"<<b<<"**oper**"<<operatorType<<endl;
541 
542     double result = 0;
543 
544     switch (operatorType)
545     {
546         case REG_ADD:
547         {
548             result = a + b;
549             break;
550         }
551         case REG_DEC:
552         {
553             result = a -b;
554             break;
555         }
556         case REG_MUL:
557         {
558             result = a * b;
559             break;
560         }
561         case REG_DIV:
562         {
563             if( b == 0)
564             {
565                 qDebug() << "divisor can not be zero!!!"<<endl;
566             }
567             else
568             {
569                 result = int(a / b);
570             }
571             break;
572         }
573         case REG_DIVIVIDE:
574         {
575             if( b == 0)
576             {
577                 qDebug() << "divisor can not be zero!!!"<<endl;
578             }
579             else
580             {
581                 result = a / b;
582             }
583             break;
584         }
585         case REG_MOD:
586         {
587             if( b == 0)
588             {
589                 qDebug() << "divisor can not be zero!!!"<<endl;
590             }
591             else
592             {
593                 result = (int)a%(int)b;
594             }
595             break;
596         }
597     }
598 
599     qDebug() << "***result#**"<<result<<endl;
600     numStack.push(result);
601 }
602 
603 //void ParseStack::calc()
604 //{
605 //    QVector <int> aVector;
606 //    QVector <int> bVector;
607 
608 
609 //    aVector.resize(3);
610 //    bVector.resize(3);
611 
612 
613 //    bVector = numStack.pop();
614 //    aVector = numStack.pop();
615 
616 //    qDebug() << "**a**"<<aVector<<"***b***"<<bVector<<endl;
617 
618 //    int operatorType = chStack.pop();
619 
620 
621 
622 //    switch (operatorType)
623 //    {
624 //        case REG_ADD:
625 //        {
626 //            for(int i = 0; i < 3;i++)
627 //            {
628 //                cVector[i] = aVector[i] + bVector[i];
629 //            }
630 //            break;
631 //        }
632 //        case REG_DEC:
633 //        {
634 //            for(int i = 0; i < 3;i++)
635 //            {
636 //                cVector[i] = aVector[i] - bVector[i];
637 //            }
638 //            break;
639 //        }
640 //    }
641 //    numStack.push(cVector);
642 //}
643 
644 
645 void ParseStack::startReg(Register reg)
646 {
647     for(int i = 0; i < reg.regcondition.size();++i)
648     {
649         listData.append(reg.regcondition[i]);
650     }
651     qDebug() << __FUNCTION__<<"******"<<__LINE__<< "***reg**Type**"<<reg.type<<endl;
652     switch(reg.type)
653     {
654         case AR_PAL_REG_INS:
655         {
656             switch (reg.addressType)
657             {
658                 case INDIRECT:
659                 {
660                     qDebug() << "****INDIRECT***"<<endl;
661 //                    parsePlData();
662                     break;
663                 }
664                 case DIRECT:
665                 {
666                     qDebug() << "****DIRECT***"<<endl;
667 //                    parsePlData();
668                     break;
669                 }
670             }
671             break;
672         }
673         case REG_INS:
674         {
675             switch(reg.addressType)
676             {
677                 case INDIRECT:
678                 {
679                     qDebug() << "****INDIRECT***"<<endl;
680                     double result = parseData();
681                     qDebug() << __FUNCTION__ <<"******"<<__LINE__<<"***RESULT**"<<result<<endl;
682                     break;
683                 }
684                 case DIRECT:
685                 {
686                     qDebug() << "****DIRECT***"<<endl;
687                     double result = parseData();
688                     qDebug() << __FUNCTION__ <<"******"<<__LINE__<<"***RESULT**"<<result<<endl;
689                     break;
690                 }
691             }
692             break;
693         }
694     }
695 }
696 /*
697 void ParseStack::parsePlData()
698 {
699     QVector <int> plTempList;
700     plTempList.resize(3);
701     while(listData.size() > 0)
702     {
703         //获取当前表达式头部的第一个字符
704         int dataType = listData.at(0).valueType;
705         double num = 0;
706         bool existNum = false;
707 
708         if(dataType == REG_PL_CONST ||
709                 dataType == REG_PL)
710         {
711             existNum = true;
712             if(existNum)
713             {
714                 if(dataType == REG_PL_CONST)
715                 {
716                     if(INDIRECT == listData[0].pl_iVarType)
717                     {
718                         plTempList[0] = rList[listData[0].i];
719                     }
720                     else if(DIRECT == listData[0].pl_iVarType)
721                     {
722                         plTempList[0] = listData[0].i;
723                     }
724                     if(INDIRECT == listData[0].pl_jVarType)
725                     {
726                         plTempList[1] = rList[listData[0].j];
727                     }
728                     else if(DIRECT == listData[0].pl_jVarType)
729                     {
730                         plTempList[1] = listData[0].j;
731                     }
732                     if(INDIRECT == listData[0].pl_kVarType)
733                     {
734                         plTempList[2] = rList[listData[0].k];
735                     }
736                     else if(DIRECT == listData[0].pl_kVarType)
737                     {
738                         plTempList[2] = listData[0].k;
739                     }
740                 }
741                 else if(dataType == REG_PL)
742                 {
743                     if(INDIRECT == listData.at(0).rightVarType)
744                     {
745                         qDebug()<<"***r[i]***"<<listData[0].plVal<<endl;
746                         plTempList = realPList[rList[listData[0].plVal]];
747                         qDebug() << "***plTempList***"<<plTempList<<endl;
748                     }
749                     else if(DIRECT == listData.at(0).rightVarType)
750                     {
751                        plTempList = realPList[listData[0].plVal];
752                     }
753                 }
754 
755                 listData.removeFirst();
756 //                numStack.push(num);
757 
758                 numStack.push(plTempList);
759                 if(listData.size() == 0)
760                 {
761                     break;
762                 }
763             }
764         }
765         else if(dataType == REG_ADD ||
766                 dataType == REG_DEC ||
767                 dataType == REG_LEFT_BRK ||
768                 dataType == REG_RIGHT_BRK)
769         {
770             listData.removeFirst();
771             if(chStack.isEmpty() ||
772                chStack.top() == REG_LEFT_BRK ||
773                     dataType == REG_LEFT_BRK)
774             {
775                 chStack.push(dataType);
776                 //listData.removeFirst();
777                 continue;
778             }
779             switch (dataType)
780             {
781                 case REG_RIGHT_BRK:
782                 {
783                     while(numStack.size() >= 2 &&
784                           !chStack.isEmpty()&&
785                           chStack.top() != REG_LEFT_BRK)
786                     {
787                         calc();
788                     }
789                     if(!chStack.isEmpty() &&
790                         chStack.top() == REG_LEFT_BRK)
791                     {
792                         chStack.pop();
793                         continue;
794                     }
795                     else
796                     {
797                         qDebug()<<"The number of barckets are not equals!!"<<endl;
798                     }
799                     break;
800                 }
801                 case REG_ADD:
802                 case REG_DEC:
803                 {
804                     while(numStack.size() >= 2 &&
805                           !chStack.isEmpty() &&
806                            chStack.top() != REG_LEFT_BRK)
807                     {
808                         calc();
809                     }
810                     if(chStack.isEmpty() || chStack.top() == REG_LEFT_BRK)
811                     {
812                         chStack.push(dataType);
813                         //listData.removeFirst();
814                         continue;
815                     }
816                     else
817                     {
818                         qDebug()<<"this string is not illeagal"<<endl;
819                     }
820                 }
821                 default:
822                 {
823                     qDebug()<<"argument error!!!"<<endl;
824                 }
825             }
826              //listData.removeFirst();
827              if(listData.size() == 0)
828              {
829                  break;
830              }
831         }
832     }//while结束
833 
834      // 若符号栈不为空,则不断的从符号栈和数字栈中弹出元素,进行计算
835     while(!chStack.isEmpty())
836     {
837         calc();
838     }
839 
840     qDebug() <<"***result***"<<cVector<<endl;
841 
842 //    return numStack.size() == 1?numStack.pop():0;
843 }
844 */

解析函数

  1 #include "register.h"
  2 
  3 
  4 
  5 
  6 Register::Register()
  7 {
  8 }
  9 
 10 int Register::strToInt(QString in)
 11 {
 12     QString tmp;
 13     for(int j = 0; j < in.length(); j++)
 14     {
 15         if(in[j] >= '0' && in[j] <= '9')
 16             tmp.append(in[j]);
 17     }
 18     bool ok;
 19     int tar=tmp.toInt(&ok,10); // ok=rue
 20     return tar;
 21 }
 22 
 23 double Register::strToDouble (QString in)
 24 {
 25     QString tmp;
 26     for(int j = 0; j < in.length(); j++)
 27     {
 28         if((in[j] >= '0' && in[j] <= '9')||in[j]=='.')
 29             tmp.append(in[j]);
 30     }
 31     bool ok;
 32     double tar=tmp.toDouble(&ok); // ok=rue
 33     return tar;
 34 }
 35 
 36 QString Register::strFilt(QString in)
 37 {
 38     QString tmp;
 39     for(int j = 0; j < in.length(); j++)
 40     {
 41         if((in[j] >= 'a' && in[j] <= 'z') || (in[j] >= 'A' && in[j] <= 'Z')||in[j]=='['||in[j]==']'||in[j] =='%'||in[j] == '/')
 42             tmp.append(in[j]);
 43     }
 44     return tmp;
 45 }
 46 
 47 
 48 int Register::patRegister(QString programStr)
 49 {
 50     //  qDebug()<<"patRegister*****************









*****************



******************"<<endl;
 51     int ownerStart = programStr.indexOf("//");
 52     programStr = programStr.left(ownerStart);
 53 //    this[0].type = REG;
 54     QString pattern1 = ("([PSRL]{1,2})\[([R]?\[?\d+\]?)\s*,?\s*(\d*)\s*:?\s*(\w*)\]\s*=(.*)");
 55     QRegExp rx1(pattern1);
 56     programStr.indexOf(rx1);
 57 
 58     qDebug() << "***cap**1**"<<rx1.cap(1)<<endl;
 59     /*********存储等号左边的内容**********/
 60     if(rx1.cap(1) == "R")
 61     {
 62         this[0].type = REG_INS;
 63     }
 64     else if(rx1.cap(1) == "PR")
 65     {
 66         if(rx1.cap(3) == "")
 67         {
 68             this[0].type = POS_REG_INS;
 69         }
 70         else
 71         {
 72             this[0].type = POS_REG_AXIS_INS;
 73         }
 74     }
 75     else if(rx1.cap(1) == "PL")
 76     {
 77         this[0].type = AR_PAL_REG_INS;
 78     }
 79     else if(rx1.cap(1) == "SR")
 80     {
 81         this[0].type = STR_REG;
 82     }
 83 
 84     qDebug() << "***cap**2**"<<rx1.cap(2)<<endl;
 85     qDebug() << "***cap**3**"<<rx1.cap(3)<<endl;
 86     qDebug() << "***cap**4**"<<rx1.cap(4)<<endl;
 87 
 88     int ri = strToInt(rx1.cap(2));
 89     int rj = strToInt(rx1.cap(3));
 90     this[0].i = ri;
 91     this[0].j = rj;
 92     this[0].expression = rx1.cap(4);
 93     if(strFilt(rx1.cap(2)) == "R[]")
 94     {
 95         this[0].addressType = INDIRECT;
 96     }
 97     else
 98     {
 99         this[0].addressType = DIRECT;
100     }
101     /*********存储等号后边的内容***********/
102     /****先取出等号后边的内容,再放在QMap中****/
103     QMap<int, QString> map;
104     QString strpro = rx1.cap(5);
105     strpro.replace(QString(" "),QString(""));//  去掉空格
106     QString  strchar ;
107     QStringList  strList;
108     int xi = 0;
109     int p1;
110     int p2;
111 //    qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***strpro**"<<strpro<<endl;
112     /*************获取TIMER[] , UFRAM[], UTOOL[]*********/
113     strchar  = "TIMER;UFRAM;UTOOL";
114     strList = strchar.split(";");
115     xi = 0;
116     while(xi < strList.length())
117     {
118         p1 = strpro.indexOf(strList[xi]);
119 //        qDebug() << __FUNCTION__<<"**1111111**"<<__LINE__<<"***p1**"<<p1<<endl;
120         if(p1 != -1)
121         {
122             p2 = p1;
123             while(1)
124             {
125 //                qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***mid***p2**1**"<<strpro.mid(p2,1)<<endl;
126                 if(strpro.mid(p2,1) == "]")
127                 break;
128                 p2++;
129             }
130             QString strget = strpro.mid(p1,p2-p1+1);
131 //            qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***p1**"<<p1<<"**p2***"<<p2<<"**strget**"<<strget<<endl;
132             map.insert(p1,strget);      //插入到QMAP中
133             strpro.replace(p1,5,"@@@@@");
134             int R = strget.indexOf("R");
135             if(R != -1)
136             {
137                 strpro.replace(p1+R,1,"@");
138 //                qDebug() << __FUNCTION__<<"***@@***"<<__LINE__<<"***strpro**"<<strpro<<endl;
139             }
140             qDebug() << __FUNCTION__<<"***@@***"<<__LINE__<<"***strpro**"<<strpro<<endl;
141         }
142         else if(p1 == -1)
143         {
144             xi++;
145         }
146     }
147 //     qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***map**"<<map.size()<<endl;
148     /************获取 DIV MOD******************/
149     strchar  = "MOD;DIV";
150     strList = strchar.split(";");
151     xi = 0;
152     while(xi < strList.length())
153     {
154         p1 = strpro.indexOf(strList[xi]);
155 //        qDebug() << __FUNCTION__<<"**22222222**"<<__LINE__<<"***p1**"<<p1<<endl;
156         if(p1 != -1)
157         {
158             QString strget = strpro.mid(p1,3);
159 //            qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***p1**"<<p1<<"**strget**"<<strget<<endl;
160             map.insert(p1,strget);      //插入到QMAP中
161             strpro.replace(p1,3,"###");
162             qDebug() << __FUNCTION__<<"***##***"<<__LINE__<<"***strpro**"<<strpro<<endl;
163         }
164         else if(p1 == -1)
165         {
166             xi++;
167         }
168     }
169     /*******PR GI GO AI AO DI DO RI RO SI SO UI UO SR AR PL R[ P[,要放在获取完TIMER[] 和DIV之后*********/
170     strchar  = "PR:GI:GO:AI:AO:DI:DO:RI:RO:SI:SO:UI:UO:SR:AR:PL:R[:P[";
171     strList = strchar.split(":");
172     xi = 0;
173     while(xi < strList.length())
174     {
175         p1 = strpro.indexOf(strList[xi]);
176 //        qDebug() << __FUNCTION__<<"**3333333**"<<__LINE__<<"***p1**"<<p1<<endl;
177         if(p1 != -1)
178         {
179             p2 = p1;
180             while(1)
181             {
182 //                qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***mid***p2**1**"<<strpro.mid(p2,1)<<endl;
183                 if(strpro.mid(p2,1) == "]")
184                 break;
185                 p2++;
186             }
187             QString strget = strpro.mid(p1,p2-p1+1);
188 //            qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***p1**"<<p1<<"**p2***"<<p2<<"**strget**"<<strget<<endl;
189             map.insert(p1,strget);      //插入到QMAP中
190             strpro.replace(p1,2,"@@");
191 //            qDebug() << __FUNCTION__<<"***@@***"<<__LINE__<<"***strpro**"<<strpro<<endl;
192             strget.replace(0,2,"@@");   //因为PR[R[]]里面有两个R;
193             qDebug() << __FUNCTION__<<"****"<<__LINE__<<"***p1**"<<p1<<"**p2***"<<p2<<"**strget**"<<strget<<endl;
194             int R = strget.indexOf("R");     //判断字符串里面是否有R[],如果有应该替换掉,避免误认为是外面的R[];
195             if(R != -1)
196             {
197                 strpro.replace(p1+R,1,"@");
198 //                qDebug() << __FUNCTION__<<"***@@***"<<__LINE__<<"***strpro**"<<strpro<<endl;
199             }
200         }
201         else if(p1 == -1)
202         {
203             xi++;
204         }
205     }
206     /*********************获取“+-* / ( )****************/
207     strchar = "+ - * / ( )";
208     strList = strchar.split(" ");
209     xi  = 0;
210     int op = 0;
211     while(xi < strList.length() )
212     {
213         op = strpro.indexOf(strList[xi]);
214 //        qDebug() << __FUNCTION__<<"**4444444**"<<__LINE__<<"***op**"<<op<<endl;
215         if(op != -1)
216         {
217             QString oper = strpro.mid(op,1);
218 //            qDebug() << __FUNCTION__<<"******"<<__LINE__<<"***strpro**"<<strpro<<"***oper****"<<oper<<endl;
219             map.insert( op,oper);     //插入到QMAP
220             strpro.replace(op,1,"#");
221             qDebug() << __FUNCTION__<<"******"<<__LINE__<<"***strpro**"<<strpro<<endl;
222         }
223         else if(op == -1)
224         {
225             xi++;
226         }
227     }
228     /***********获取 Lpos Jpos ,要 放在获取完+-*/()之后**************/
229     strchar  = "Lpos;Jpos";
230     strList = strchar.split(";");
231     xi = 0;
232     while(xi < strList.length())
233     {
234         p1 = strpro.indexOf(strList[xi]);
235 //        qDebug() << __FUNCTION__<<"**555555**"<<__LINE__<<"***p1**"<<p1<<endl;
236         if(p1 != -1)
237         {
238             QString strget = strpro.mid(p1,4);
239 //            qDebug() << __FUNCTION__<<"******"<<__LINE__<<"***strpro**"<<strpro<<"***strget****"<<strget<<endl;
240             map.insert(p1,strget);      //插入到QMAP中
241             strpro.replace(p1,4,"@@@@");
242             qDebug() << __FUNCTION__<<"******"<<__LINE__<<"***strpro**"<<strpro<<endl;
243         }
244         else if(p1 == -1)
245         {
246             xi++;
247         }
248     }
249     QMap <int,int> plMap;
250     plMap.clear();
251 
252     QVector <int> leftList;
253     QVector <int> rightList;
254     leftList.clear();
255     rightList.clear();
256 
257     int plCount = 0;
258     int pcCount = 0;
259     /*********获取【i,j,k】**********/
260     for(int i = 0; i < strpro.length();i++)
261     {
262         if('[' == strpro[i])
263         {
264             leftList.append(i);
265         }
266         else if(']' == strpro[i])
267         {
268             rightList.append(i);
269         }
270     }
271     /***************获取相匹配的括号的位置*****************/
272     for(int i = leftList[pcCount]; i < strpro.length();i++)
273     {
274         if('[' == strpro[i])
275         {
276             plCount++;
277         }
278         else if(']' == strpro[i])
279         {
280             plCount--;
281         }
282 
283         if(0 == plCount)
284         {
285            plMap.insert(leftList[pcCount],i);
286            if(pcCount < leftList.size() - 1)
287            {
288                i = leftList[++pcCount] - 1;
289            }
290         }
291     }
292 
293     qDebug() << __LINE__<<"***STRPRO***"<<strpro<<endl;
294     QString tempStr;
295     int front_i,back_i;
296     for(int i = 0; i < plMap.size();i++)
297     {
298         front_i = plMap.keys().at(i);
299         back_i = plMap.values().at(i);
300         tempStr = strpro.mid(front_i,back_i - front_i + 1);
301         qDebug() << __LINE__<<"****i**"<<i<<"**front_i***"<<front_i<<"***back_i***"<<back_i<<"***tempStr**"<<tempStr<<endl;
302         int count = tempStr.count(",");
303         if(2 == count)
304         {
305 //            qDebug() << "****i**"<<i<<"**front_i***"<<front_i<<"***back_i***"<<back_i<<"***tempStr**"<<tempStr<<endl;
306             QString strget = tempStr;
307             map.insert(front_i,strget);
308             QString str;
309             str.fill('@',back_i - front_i + 1);
310             strpro.replace(front_i,back_i - front_i + 1,str);
311         }
312     }
313 
314     /**************获取常数项***************/
315     while(1)
316     {
317         p1 = strpro.indexOf("#");
318         qDebug() << __FUNCTION__<<"**66666**"<<__LINE__<<"***p1**"<<p1<<endl;
319         if(p1 == -1)
320         {
321             break;
322         }
323         qDebug() << __FUNCTION__<<"**66666**"<<__LINE__<<"***p1+1**"<<strpro.mid(p1+1,1)<<endl;
324         if(strpro.mid(p1+1,1)>="0" && strpro.mid(p1+1,1)<="9")
325         {
326             p2 = p1;
327             while(1)
328             {
329                 p2++;
330                 qDebug() << __FUNCTION__<<"**66666**"<<__LINE__<<"***p2**"<<strpro.mid(p2,1)<<endl;
331                 if(strpro.mid(p2,1) == "#" || strpro.mid(p2,1) == "")
332                 {
333                     break;
334                 }
335             }
336             QString strget = strpro.mid(p1+1,p2-p1-1);
337             qDebug() << __FUNCTION__<<"******"<<__LINE__<<"***strpro**"<<strpro<<"***strget****"<<strget<<endl;
338             map.insert(p1+1,strget);      //插入到QMAP中
339         }
340         strpro.replace(p1,1,"$");
341         qDebug() << __FUNCTION__<<"******"<<__LINE__<<"***strpro**"<<strpro<<endl;
342     }
343     //第一个字符串为常数项的情况
344     if(!strpro.contains("$"))//全是数字,没有字母
345     {
346         QString strget = strpro;
347         map.insert(0,strget);
348     }
349     else
350     {
351         if(strpro.mid(0,1) >= "0" && strpro.mid(0,1)<="9")
352         {
353             p1 = 0;
354             while(1)
355             {
356                 p1++;
357                 if(strpro.mid(p1,1) == "$")
358                 {
359                     break;
360                 }
361             }
362             QString strget = strpro.mid(0,p1);
363             qDebug() << __FUNCTION__<<"******"<<__LINE__<<"***strpro**"<<strpro<<"***strget****"<<strget<<endl;
364             map.insert(0,strget);      //插入到QMAP中
365         }
366     }
367     for(int i = 0; i < map.size();i++)
368     {
369         qDebug() << "***i=***"<<i<<
370                     "***key***"<<map.keys().at(i)<<
371                     "***value***"<<map.values().at(i)<<endl;
372     }
373 
374     /********************将获得的每个字符串按顺序存储**********************/
375     int pi ;
376     int pj ;
377     int sum = 0;
378     float val;
379     QString strfile;
380     QString plStr;
381     QMap<int, QString>::const_iterator mi;
382     for( mi=map.constBegin(); mi!=map.constEnd(); ++mi)
383     {
384         sum++;
385         this[0].regcondition.resize(sum);
386         if(this[0].type == AR_PAL_REG_INS)
387         {
388             qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
389             strList = mi.value().split("[");
390             if("PL" == strList[0])
391             {
392                qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
393                this[0].regcondition[sum - 1].valueType = REG_PL;
394                if(strList.size()>1)
395                {
396                     if(strList[1] == "R")
397                     {
398                          qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
399                         this[0].regcondition[sum-1].rightVarType = INDIRECT;
400                         qDebug() << "**strList[1]***"<<strList[2]<<endl;
401                         this[0].regcondition[sum - 1].plVal = strToInt(strList[2]);
402                     }
403                     else
404                     {
405                         qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
406                         this[0].regcondition[sum-1].rightVarType = DIRECT;
407                         this[0].regcondition[sum-1].plVal = strToInt(strList[1]);
408                     }
409                }
410 
411             }
412             else if("+" == strList[0])
413             {
414                 qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
415                this[0].regcondition[sum-1].valueType = REG_ADD;
416             }
417             else if("-" == strList[0])
418             {
419                 qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
420                this[0].regcondition[sum-1].valueType = REG_DEC;
421             }
422             else if(strList[0] == "(")
423             {
424                 qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
425                 this[0].regcondition[sum-1].valueType = REG_LEFT_BRK;
426             }
427             else if(strList[0] == ")")
428             {
429                 qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
430                 this[0].regcondition[sum-1].valueType = REG_RIGHT_BRK;
431             }
432             else
433             {
434                 qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
435                 this[0].regcondition[sum - 1].valueType = REG_PL_CONST;
436                 plStr = mi.value();
437                 if(2 == plStr.count(","))
438                 {
439                     plStr = plStr.remove(" ");
440                     plStr = plStr.remove("[");
441                     plStr = plStr.remove("]");
442                     qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
443                     strList = plStr.split(",");
444                     for(int j = 0; j < strList.size();j++)
445                     {
446                         if("*" == strList[j])
447                         {
448                             strList[j] = "-100000";
449                         }
450                         else if("2-0" == strList[j])
451                         {
452                             strList[j] = "20000";
453                         }
454                         else if("2-1" == strList[j])
455                         {
456                             strList[j] = "-20000";
457                         }
458                          qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
459                         QString str_i,str_j,str_k;
460 
461                         str_i = strList[0];
462                         str_j = strList[1];
463                         str_k = strList[2];
464                          qDebug() << __FUNCTION__<<"******"<<__LINE__<<endl;
465                         if(str_i.contains("R"))
466                         {
467                            this[0].regcondition[sum - 1].pl_iVarType = INDIRECT;
468                            this[0].regcondition[sum - 1].i = strToInt(str_i);
469                         }
470                         else
471                         {
472                             this[0].regcondition[sum - 1].pl_iVarType = DIRECT;
473                             this[0].regcondition[sum - 1].i = strToInt(str_i);
474                         }
475                         if(str_j.contains("R"))
476                         {
477                             this[0].regcondition[sum - 1].pl_jVarType = INDIRECT;
478                             this[0].regcondition[sum - 1].j = strToInt(str_j);
479                         }
480                         else
481                         {
482                             this[0].regcondition[sum - 1].pl_jVarType = DIRECT;
483                             this[0].regcondition[sum - 1].j = strToInt(str_j);
484                         }
485                         if(str_k.contains("R"))
486                         {
487                             this[0].regcondition[sum - 1].pl_kVarType = INDIRECT;
488                             this[0].regcondition[sum - 1].k = strToInt(str_k);
489                         }
490                         else
491                         {
492                             this[0].regcondition[sum - 1].pl_kVarType = DIRECT;
493                             this[0].regcondition[sum - 1].k = strToInt(str_k);
494                         }
495                     }
496                 }
497             }
498         }
499         else
500         {
501             strList = mi.value().split("[") ;                          //如 :R[R[2]] -> R   R 2]];
502             qDebug() << __LINE__ <<"****strList*******"<<strList[0]<<endl;
503             if(strList[0] == "AR")
504             {
505                 this[0].regcondition[sum-1].valueType = REG_AR;
506             }
507             else if(strList[0] == "R")
508             {
509                 this[0].regcondition[sum-1].valueType = REG_R;
510             }
511             else if(strList[0] == "P")
512             {
513                 this[0].regcondition[sum-1].valueType = REG_P;
514             }
515             else if(strList[0] == "PR")
516             {
517                 this[0].regcondition[sum-1].valueType = REG_PR;
518             }
519             else if(strList[0] == "GI")
520             {
521                 this[0].regcondition[sum-1].valueType = REG_GI;
522             }
523             else if(strList[0] == "GO")
524             {
525                 this[0].regcondition[sum-1].valueType = REG_GO;
526             }
527             else if(strList[0] == "AI")
528             {
529                 this[0].regcondition[sum-1].valueType = REG_AI;
530             }
531             else if(strList[0] == "AO")
532             {
533                 this[0].regcondition[sum-1].valueType = REG_AO;
534             }
535             else if(strList[0] == "DI")
536             {
537                 this[0].regcondition[sum-1].valueType = REG_DI;
538             }
539             else if(strList[0] == "DO")
540             {
541                 this[0].regcondition[sum-1].valueType = REG_DO;
542             }
543             else if(strList[0] == "RI")
544             {
545                 this[0].regcondition[sum-1].valueType = REG_RI;
546             }
547             else if(strList[0] == "RO")
548             {
549                 this[0].regcondition[sum-1].valueType = REG_RO;
550             }
551             else if(strList[0] == "SI")
552             {
553                 this[0].regcondition[sum-1].valueType = REG_SI;
554             }
555             else if(strList[0] == "SO")
556             {
557                 this[0].regcondition[sum-1].valueType = REG_SO;
558             }
559             else if(strList[0] == "UI")
560             {
561                 this[0].regcondition[sum-1].valueType = REG_UI;
562             }
563             else if(strList[0] == "UO")
564             {
565                 this[0].regcondition[sum-1].valueType = REG_UO;
566             }
567             else if(strList[0] == "TIMER")
568             {
569                 this[0].regcondition[sum-1].valueType = REG_TIMER;
570             }
571             else if(strList[0] == "TIMER_OVERFLOW")
572             {
573                 this[0].regcondition[sum-1].valueType = REG_TIMER_OVERFLOW;
574             }
575             else if(strList[0] == "Lpos")
576             {
577                 this[0].regcondition[sum-1].valueType = REG_Lpos;
578             }
579             else if(strList[0] == "Jpos")
580             {
581                 this[0].regcondition[sum-1].valueType = REG_Jpos;
582             }
583             else if(strList[0] == "UFRAM")
584             {
585                 this[0].regcondition[sum-1].valueType = REG_UFRAM;
586             }
587             else if(strList[0] == "UTOOL")
588             {
589                 this[0].regcondition[sum-1].valueType = REG_UTOOL;
590             }
591 //            else if(strList[0] == "PL")
592 //            {
593 //                this[0].regcondition[sum-1].valueType = REG_PL;
594 //            }
595             else if(strList[0] == "MOD")
596             {
597                 this[0].regcondition[sum-1].valueType = REG_MOD;
598             }
599             else if(strList[0] == "DIV")
600             {
601                 this[0].regcondition[sum-1].valueType = REG_DIV;
602             }
603             else if(strList[0] == "+")
604             {
605                 this[0].regcondition[sum-1].valueType = REG_ADD;
606             }
607             else if(strList[0] == "-")
608             {
609                 this[0].regcondition[sum-1].valueType = REG_DEC;
610             }
611             else if(strList[0] == "*")
612             {
613                 this[0].regcondition[sum-1].valueType = REG_MUL;
614             }
615             else if(strList[0] == "/")
616             {
617                 this[0].regcondition[sum-1].valueType = REG_DIVIVIDE;
618             }
619             else if(strList[0] == "(")
620             {
621                 this[0].regcondition[sum-1].valueType = REG_LEFT_BRK;
622             }
623             else if(strList[0] == ")")
624             {
625                 this[0].regcondition[sum-1].valueType = REG_RIGHT_BRK;
626             }
627             else
628             {
629                 this[0].regcondition[sum-1].valueType = REG_CONST;
630                 val = strToDouble(strList[0]);
631                 this[0].regcondition[sum-1].val = val;
632             }
633             /*************判断地址类型************/
634             if(strList.size()>1)
635             {
636                 if(strList[1] == "R")
637                 {
638                     this[0].regcondition[sum-1].rightVarType = INDIRECT;
639                 }
640                 else
641                 {
642                     this[0].regcondition[sum-1].rightVarType = DIRECT;
643                 }
644             }
645             /***************存储 i,j***************/
646             if( this[0].regcondition[sum-1].valueType != REG_CONST)
647             {
648                 strList = mi.value().split(",") ;           //如 R[2,4] ->R[2  ;     4];
649                 pi = strToInt(strList[0]);
650                 this[0].regcondition[sum-1].i = pi;
651                 if(strList.size() > 1)
652                 {
653                     this[0].regcondition[sum-1].valueType = REG_PR_IJ;
654                     pj = strToInt(strList[1]);
655                     this[0].regcondition[sum-1].j = pj;
656                 }
657             }
658         }
659     }
660     return 1;
661 }

以上为对字符串的提取解析以及运算操作




 
原文地址:https://www.cnblogs.com/wanzaiyimeng/p/5672484.html