lexAcceptors[1].setState(2,state);
lexAcceptors[2]=new fAutomat(2,2,rdr);
state=new faState(1);
state.setArc(1,"0ntr\'\\");
lexAcceptors[2].setState(0,state);
state=new faState(1);
state.setArc(-2,"");
lexAcceptors[2].setState(1,state);
lexAcceptors[3]=new fAutomat(3,4,rdr);
state=new faState(4);
state.setArc(-1,"");
state.setArc(1,"\\");
state.setArc(2,"\'");
state.setArc(3,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя");
lexAcceptors[3].setState(0,state);
state=new faState(1);
state.setArc(-3,"");
lexAcceptors[3].setState(1,state);
state=new faState(1);
state.setArc(-4,"");
lexAcceptors[3].setState(2,state);
state=new faState(2);
state.setArc(-2,"");
state.setArc(3,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя");
lexAcceptors[3].setState(3,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: //operator
break;
case -3: //words
break;
case -4: //operator Delimiter
break;
case -5: //Decconst
break;
case -6: //UseLessWord
ignoreLastWord=true;break;
case -7: //CharConstBegin
ignoreLastWord=true;stack.push(lexAcceptor); lexAcceptor=lexAcceptors[3]; /*ti.put(0,0, "Push");*/break;
case -8: //Brackets
break;
case -9: //id
break;
case -10: //floatconst
break;
}
break;
case 1: // Автомат endsymbolic
switch(Lexem.groupIndex){
case -1: //EOF
Lexem.groupIndex=0;break;
case -2: //Error
Lexem.groupIndex=codeCharError; ti.put(0,0,"char error");break;
case -3: //CharConstEnd
lexAcceptor=(fAutomat)stack.pop();break;
}
break;
case 2: // Автомат specialsymbolic
switch(Lexem.groupIndex){
case -1: //EOF
Lexem.groupIndex=0;break;
case -2: //constchar
/*ti.put(0,0, "go to endsymbolic from specialsymbolic");*/ Lexem.textOfWord=new StringBuffer("\\"+Lexem.textOfWord.toString()); lexAcceptor=lexAcceptors[1];break;
}
break;
case 3: // Автомат symbolic
switch(Lexem.groupIndex){
case -1: //EOF
Lexem.groupIndex=0;break;
case -2: //charconst
/*ti.put(0,0, "go to endsymbolic");*/ lexAcceptor=lexAcceptors[1];break;
case -3: //slash
ignoreLastWord=true;lexAcceptor=lexAcceptors[2]; /*ti.put(0,0, "go to specialsymbolic");*/break;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.