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
Правила грамматики
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.