return info;
}
}
Record R;
Table T = new Table();
//end of Part_6_0
//Part_4_2: конструктор мультиавтоматного ЛА
public lexAnalyzer(textReader rdr){
inp=rdr; //запомним указатель входного потока
//далее для каждого автомата создадим требуемые совокупности диапазонов литер
charToI0.addRange('\u0009','\n',1);
charToI0.addRange('\r','\r',1);
charToI0.addRange(' ',' ',2);
charToI0.addRange('\"','\"',3);
charToI0.addRange('(',')',4);
charToI0.addRange('{','{',4);
charToI0.addRange('}','}',4);
charToI0.addRange('*','*',5);
charToI0.addRange('+','+',6);
charToI0.addRange(',',',',7);
charToI0.addRange('-','-',8);
charToI0.addRange('/','/',9);
charToI0.addRange('0','9',10);
charToI0.addRange(';',';',11);
charToI0.addRange('<','<',12);
charToI0.addRange('A','Z',13);
charToI0.addRange('b','d',13);
charToI0.addRange('g','k',13);
charToI0.addRange('m','q',13);
charToI0.addRange('v','z',13);
charToI0.addRange('А','я',13);
charToI0.addRange('a','a',14);
charToI0.addRange('e','e',15);
charToI0.addRange('f','f',16);
charToI0.addRange('l','l',17);
charToI0.addRange('r','r',18);
charToI0.addRange('s','s',19);
charToI0.addRange('t','t',20);
charToI0.addRange('u','u',21);
charToI1.addRange('\"','\"',1);
charToI2.addRange('*','*',1);
charToI3.addRange('/','/',1);
//создадим все лексические акцепторы
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(1);
lexAcceptors[3]=new fAutomat(3,charToI3,controlTable3,rdr);
lexAcceptors[3].setOther(1);
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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.