Синтаксис языков программирования. Нисходящий синтаксический анализ, процедурная и автоматные реализации, страница 3

   case /*^=currentNonTerminal.index^*/:// нетерминал /*^=currentNonTerminal.Name^*/ из стека

    switch (curWordIndex){/*^forEach(currentRule in currentNonTerminal.rules)^*//*^forEach(symbolFromSS in currentRule.selectionSet)^*/

    case /*^=symbolFromSS.index^*/:// на входе терминал /*^=symbolFromSS.Name^*//*^endFor^*//*^forEach(rightPartOFESymbol in currentRule.rightPart.orderFromEnd)^*//*^if(currentRule.rightPart.isNoEmpty)^*/

     stk.push(new Integer(/*^=rightPartOFESymbol.index^*/));// индекс символа /*^=rightPartOFESymbol.name^*/ в стек/*^endIf^*//*^endFor^*/

     break;/*^endFor^*/

    default:return false;// входной терминал не принадлежит множеству выбора ни одного правила для /*^=currentNonTerminal.Name^*/

    }break;

/*^endFor^*/

/*^forEach(currentAction in grammar.symbolSet)^*/

   case /*^=currentAction.index^*/:// действие (индекс из стека)

    /*^=currentAction.text^*/

    break;

/*^endFor^*/

   default:// терминалы из стека

    if(stkItem.intValue()!=curWordIndex)     //индекс этого терминала должен быть равен индексу текущего входного слова

     return false;    //иначе входной поток неверен, возвращаем ошибку

    curWordIndex=getWordIndex();              //если ошибки нет - читаем следующее слово из входного потока

    break;

   }

   cCnt+=1;          //увеличиваем счетчик количества выполненных циклов

  }

  return false;       //если стек опустел - входной поток неверен, вернем ошибку

 }

/*^else^*/

//Part_6_4: заглушка для случая, когда нет синтаксических правил

 public parser(String s){

  la=new lexAnalyzer(new textReader(s));   //создание экземпляра лексического анализатора

 }

 private int getWordIndex(){

  currentLexem=la.getLexem();

  return currentLexem.groupIndex;

 }

 public String getStatistic(int i){

  if(i==0)

   return " "+cCnt+" ";

  else

   return"";

 }

 public boolean parse(){

  int wi;

  while(((wi=getWordIndex())!=0)&&(wi>-100))if(cCnt++>9998)break;

  return wi==0;

 }

/*^endIf^*/

}

//end of Part_6

Правила грамматики