state=new faState(2);
state.setArc(1,"");
state.setArc(2,"/");
lexAcceptors[3].setState(0,state);
state=new faState(1);
state.setArc(-2,"");
lexAcceptors[3].setState(1,state);
state=new faState(1);
state.setArc(-3,"");
lexAcceptors[3].setState(2,state);
lexAcceptor=lexAcceptors[0]; //установим автомат с индексом 0 в качестве стартового лексического акцептора
lexStk.push(lexAcceptor); //и запомним это в стеке
}
//Part_4_3: распознавание слова и формирование лексемы
public lexem getLexem(){
if(lexStk.size()<=0){ //если стек пуст - вернуть лексему с ошибкой
Lexem.groupIndex=-2147483647;return Lexem;
}
ignoreLastWord=true; //временно установим флажок, чтобы войти в цикл
while(ignoreLastWord){ //пока флажок установлен - читаем очередное слово (игнорируя предыдущие, если цикл выполняется более одного раза)
ignoreLastWord=false; //перед чтением следующего слова сбросим флажок
//вызовем лексический акцептор и получим от него лексему:
Lexem=lexAcceptor.getLexem();
//для каждого автомата и каждой группы слов обеспечим возможность выполнения действий (имена автоматов и групп слов в примечаниях)
//индексы групп слов, имена которых используются в грамматике, преобразуются в те значения, который присвоил им построитель синтаксического акцептора
//в действиях, в частности, может быть взведен флажок ignoreLastWord и изменены поля лексемы, установленные акцептором
switch(lexAcceptor.getIndex()){
case 0: // Автомат main
switch(Lexem.groupIndex){
case -1: //EOF
Lexem.groupIndex=0;break;
case -2: //spaces
ignoreLastWord=true;break;
case -3: //delimiter
break;
case -4: //cinteger
break;
case -5: //brackets
break;
case -6: //arith
break;
case -7: //StartString
ignoreLastWord=true;stack.push(lexAcceptor);lexAcceptor=lexAcceptors[1];break;
case -8: //CommBegin
ignoreLastWord=true;stack.push(lexAcceptor);lexAcceptor=lexAcceptors[2];break;
case -9: //id
ti.put(Lexem.groupIndex,Lexem.textOfWord+" Идентификатор");break;
case -10: //cdouble
break;
case -11: //cbool
break;
case -12: //dfdfsadf
break;
}
break;
case 1: // Автомат StringsBody
switch(Lexem.groupIndex){
case -1: //EOF
Lexem.groupIndex=0;break;
case -2: //other
ti.put(Lexem.groupIndex,Lexem.textOfWord);break;
case -3: //EndString
ignoreLastWord=true;lexAcceptor=(fAutomat)stack.pop();break;
}
break;
case 2: // Автомат CommentBody
switch(Lexem.groupIndex){
case -1: //EOF
Lexem.groupIndex=0;break;
case -2: //other
ignoreLastWord=true;ti.put(Lexem.groupIndex,Lexem.textOfWord);break;
case -3: //star
ignoreLastWord=true;stack.push(lexAcceptor);lexAcceptor=lexAcceptors[3];break;
}
break;
case 3: // Автомат CommentBodyEnd
switch(Lexem.groupIndex){
case -1: //EOF
Lexem.groupIndex=0;break;
case -2: //other
ignoreLastWord=true;lexAcceptor=(fAutomat)stack.pop();break;
case -3: //slash
ignoreLastWord=true;stack.pop();lexAcceptor=(fAutomat)stack.pop();break;
}
break;
}
}
//вернем лексему
return Lexem;
}
}
//end of Part_4
//Part_6: синтаксический акцептор/анализатор
class parser{
lexAnalyzer la; //экземпляр лексического анализатора
lexem currentLexem; //текущая лексема
int cCnt=0;
//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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.