}
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)
return " "+cCnt+" ";
else
return"";
}
public boolean parse(){
int wi;
while(((wi=getWordIndex())!=0)&&(wi>-100))if(cCnt++>9998)break;
return wi==0;
}
}
//end of Part_6
//Part_7: обработка HTTP-запроса, создание экземпляра синтаксического акцептора/анализатора
//start:
decoderEscaped dE=new decoderEscaped();
String qs="";
if((qs=request.getParameter("inputText"))==null)
if(request.getQueryString()!=null)qs=new String(request.getQueryString());
if((qs!=null)&&(qs.length()>0))
qs=dE.decode(qs).toString();
else qs="";
textReader str=new textReader(qs);
parser p=new parser(qs);
//Part_7_1: HTML-часть страницы, вызов синтаксического анализатора, отображение результатов работы
response.setDateHeader("Expires",0);%>
<html><meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<style type="text/css">
.bd {font-family:Arial,Helvetica,sans-serif;font-size:14;}
.RMn {font-family:Arial,Helvetica,sans-serif;font-size:14;border-collapse:collapse;}
.Hid {display:none}
</style>
</HEAD><body><div class='bd' align=center><u>Лексика</u>: автомат, управляемый таблицей переходов.</div>
<div class='bd' align=center><u>Синтаксис</u>: нисходящий автомат с несколькими состояниями.</div>
<div align=center><textarea id=inpTxt rows=30 cols=160 class=bd style='visibility:hidden'><%=qs%></textarea></div>
<form id=tst method='POST' align=center style='display:none' action='/wtl<%=request.getServletPath()%>'><textarea name=inputText style='display:none'></textarea>
<div align=center><input type=button align=center class=bd onclick='tst.inputText.value=escape(inpTxt.value);tst.submit()' value='Проверить'></div></form>
<div id=rez style='display:none'>
<%if(qs.length()>0){%><div class=bd align=center>Проверяемый текст лексически <%=(p.parse()?"правилен":"неверен")%>.</div>
<table border=1 align=center class=RMn cellspacing=0 cellpadding=0>
<tr><td align=right>Общее количество циклов: <td><%=p.getStatistic(0)%>
</table><%}%>
<table border=1 class=bd style='display:one;border-collapse:collapse'><%=ti.getTraceTable()%></table></div>
</body></html>
<!-- end of Part_7
<!-- Part_8: скрипты для браузера -->
<script><!--
function tresize(){
if(document.body.offsetWidth>100)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.