Изучение конечных автоматов без памяти, способов определения КА – канонического, графового и табличного, методов построения недетерминированного КА по системе регулярных выражений, страница 15

    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;

//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_5

//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);

//end of Part_6

//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)

  inpTxt.style.width=document.body.offsetWidth-40;

 if(document.body.offsetHeight>500)

  inpTxt.style.height=document.body.offsetHeight-400;

}

 --></script>

<script for=window event=onload><!--

inpTxt.style.visibility="visible"

tst.style.display="block"

rez.style.display="block"

tresize();

 --></script>

<script for=window event=onresize><!--

tresize();

 --></script>

<!-- end of Part_8 -->