charToI2.addRange('\'','\'',1);
charToI2.addRange('0','0',1);
charToI2.addRange('\\','\\',1);
charToI2.addRange('n','n',1);
charToI2.addRange('r','r',1);
charToI2.addRange('t','t',1);
charToI3.addRange('\'','\'',1);
charToI3.addRange('A','Z',2);
charToI3.addRange('a','z',2);
charToI3.addRange('А','я',2);
charToI3.addRange('\\','\\',3);
//создадим все лексические акцепторы
lexAcceptors[0]=new fAutomat(0,charToI0,controlTable0,rdr);
lexAcceptors[0].setOther(0);
lexAcceptors[1]=new fAutomat(1,charToI1,controlTable1,rdr);
lexAcceptors[1].setOther(1);
lexAcceptors[2]=new fAutomat(2,charToI2,controlTable2,rdr);
lexAcceptors[2].setOther(0);
lexAcceptors[3]=new fAutomat(3,charToI3,controlTable3,rdr);
lexAcceptors[3].setOther(0);
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;
case -4: //error
Lexem.groupIndex=codeCharError; ti.put(0,"char error");break;
}
break;
}
}
return Lexem;
}
}
//end of Part_4
//Part_6: синтаксический акцептор/анализатор
class parser{
lexAnalyzer la; //экземпляр лексического анализатора
lexem currentLexem; //текущая лексема
int cCnt=0;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.