亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? parsesubst.java

?? java xml開發(fā)指南(初學(xué)者推薦)Java Xml 編程指南書籍源碼
?? JAVA
字號(hào):
package MyNa.utils;
import java.io.*;
import java.util.*;
import java.sql.SQLException;
/* *****************************************************************
The ParseSubst class introduces minilanguage processing at the
parse-tree level, but in this case we have only a list of lists.
Consider the sample input string inStr=
  "The time <myna:SUBST> has come, |speaker1| said, to |communicateAbout|
  many </myna:SUBST> things, of <myna:SUBST delim="$"> $topicA$ and $topicB$, 
  of $topicC$ and $topicD$</myna:SUBST>; of why the sea is boiling hot, and 
  whether pigs have wings."
If we now say
 ParseSubst pS=new ParseSubst(new StringBuffer(inStr));
we are breaking the inStr up as if it were labelled as follows:
<ROOT>
  <TEXT>The time </TEXT>
  <myna:SUBST>
     <TEXT> has come, </TEXT>
     <DELIM>speaker1</DELIM>
     <TEXT> said, to </TEXT>
     <DELIM>communicateAbout</DELIM>
     <TEXT>  many </TEXT>
  </myna:SUBST>
  <TEXT> things, of </TEXT>
  <myna:SUBST delim="$">
    <TEXT> </TEXT>
    <DELIM>topicA</DELIM>
    <TEXT> and </TEXT>
    <DELIM>topicB</DELIM>
    <TEXT>,   of </TEXT>
    <DELIM>topicC</DELIM>
    <TEXT> and </TEXT>
    <DELIM>topicD</DELIM>
  </myna:SUBST>
  <TEXT>; of why the sea is boiling hot, and 
    whether pigs have wings.</TEXT>

We now see that
  pS.theTree.numChildren()==5
  pS.getText(pS.theTree.child(1).child(0))==" has come, "
and in an Env where speaker1="the Walrus", we see
  pS.getVal(pS.theTree.child(1).child(1))=="the Walrus"

and so on. Actually, theTree is not public, but this should
indicate the structures generated. Note that although
   pS.theTree.child(1).child(0).getText()==" has come, "
would be more intuitive, it isn't true: the tree does not
know how to interpret itself as a text. The ParseSubst object
has additional data, namely the input stringbuffer and the env.

We work with a grammar which is not completely context-free:
  Root ::= T (Subst T)* ;
  Subst ::= SubstTok(tok,d) T (Delim(d) T)* EndTok(tok);
  Delim(d) ::= d T d;


Read this as follows: The input contains initial text, and then
zero or more repetitions of a Subst followed by more text. A
Subst begins with a SubstTok (defining the actual token and delim
to be used), and it ends with a matching endTok (thus <myna:SUBST> will
end with </myna:SUBST> but <myna:SUBSTROW> will end with </myna:SUBSTROW>.
 In between we have initial text, then zero or more repetitions of
a Delim followed by more text. Finally, we see that a Delim begins
and ends with the defined delimiter, and has plain text in between.
  
***************************************************************** */
public class ParseSubst {
  StringBuffer theBuff; String theString; 
  MyNaLex lex=null;
  ParseTree theTree=null; 
  Env theEnv=null; RowSequence theRows=null;
  boolean substFailure;
  StringBuffer outBuff;
  Logger lg;

public String toString(Env env) throws ParseSubstException{
  theEnv=env; 
  outBuff=new StringBuffer();
  toStringBuffer(theTree);
  return outBuff.toString();
}
public String toString(RowSequence rows) throws ParseSubstException{
  theRows=rows;
  if(null==rows)throw new ParseSubstException("empty RowSequence in toString");
  theEnv=theRows.getRow(); 
  outBuff=new StringBuffer();
  toStringBuffer(theTree);
  return outBuff.toString();
}
public String getText(ParseTree T){
  int low=T.getLow(); int high=T.getHigh();
  if(low>=high)return "";
  return theString.substring(low,high);
}
public String getVal(ParseTree T){
  int low=T.getLow(); int high=T.getHigh();
  if(low>=high)return "";
  return theEnv.getStr(theString.substring(low,high));
}

String treeReport(ParseTree T){
  if(T==null)return "<NULLTREE>";
  String tag=T.getTagName();
  String S="<"+tag+">";
  for(int i=0;i<T.numChildren();i++)
    S+=treeReport(T.child(i));
  if("TEXT".equals(tag))S+=getText(T);
  S+="</"+tag+">";
  return S;
}
String treeReport(){return treeReport(theTree);}

public void toStringBuffer(ParseTree T) throws ParseSubstException{
  if(T==null)return;
  int N=T.numChildren(); 
  String tag=T.getTagName();
  if(tag.equals("ROOT"))
    for(int i=0;i<N;i++)
      toStringBuffer(T.child(i));
  else if(tag.equals("TEXT"))
    outText(T);
  else if(tag.startsWith("myna:"))
    substStringBuffer(tag,T);
  else throw new ParseSubstException("expected ROOT or 'myna:', found "+tag);
}

public void newQuery(ParseTree T) throws ParseSubstException{
  Hashtable H=T.getProps(); 
  if(H==null)return; 
  String theOp=(String)H.get("dbOperation");
  if(theOp==null)return;
  theEnv.addHashtable(H);
  DBHandler theDBHandler=(DBHandler)theEnv.get("dbHandler");
  if(theDBHandler==null)
    throw new ParseSubstException("no dbhandler for op "+theOp);
  try{
    theRows=theDBHandler.getQueryRows(theEnv);
  }catch(SQLException ex){
    throw new ParseSubstException("dbHandler for op "+theOp+
             "failed with SQLException "+ex);
  }
}
public void doDef(ParseTree T) throws ParseSubstException{
  Hashtable H=T.getProps(); String name;
  if(H==null || null==(name=(String)H.get("name")))
    throw new ParseSubstException("SUBSTDEF needs a 'name' property");
  StringBuffer valBuff=new StringBuffer();
  outSubVals(T,valBuff);
  theEnv.put(name,valBuff.toString());
  }
  
   
public void substStringBuffer(String tag,ParseTree T) throws ParseSubstException{
  newQuery(T);
  if(tag.equals("myna:SUBST")) outSubVals(T);
  else if(tag.equals("myna:SUBSTROW")){
    if(substFailure || null==theRows || 
       !theRows.next())
      {substFailure=true; return;}
    else {
      theEnv=theRows.getRow();
      outSubVals(T);
      }
    } else if(tag.equals("myna:SUBSTERR")){
      if(substFailure) outSubVals(T);
    } else if(tag.equals("myna:SUBSTROWLIST")){
      if(substFailure || null==theRows)return;
      while(theRows.next()){
        theEnv=theRows.getRow();
        outSubVals(T);
        }
    } else if(tag.equals("myna:SUBSTDEF"))doDef(T);      
    else throw new ParseSubstException("unrecognized tag "+tag);
}

public void outSubVals(ParseTree T){
  int N=T.numChildren();
  for(int i=0;i<N;i++)
    if(T.child(i).getTagName().equals("DELIM"))
      outVal(T.child(i));
    else outText(T.child(i));
}
  
public void outText(ParseTree T){
  int low=T.getLow(); int high=T.getHigh();
  if(low>=high)return;
  outBuff.append(theString.substring(low,high));
}
public void outVal(ParseTree T){
  int low=T.getLow(); int high=T.getHigh();
  if (low>=high)return;
  outBuff.append(theEnv.getStr(theString.substring(low,high)));
}

/* copy the three "out" functions for generating output
text and values, give them a StringBuffer as explicit param;
now they can be used to generate definitions which are not
sent to the output but placed in the Env. */

public void outSubVals(ParseTree T,StringBuffer sB){
  int N=T.numChildren();
  for(int i=0;i<N;i++)
    if(T.child(i).getTagName().equals("DELIM"))
      outVal(T.child(i),sB);
    else outText(T.child(i),sB);
}
public void outText(ParseTree T,StringBuffer sB){
  int low=T.getLow(); int high=T.getHigh();
  if(low>=high)return;
  sB.append(theString.substring(low,high));
}
public void outVal(ParseTree T,StringBuffer sB){
  int low=T.getLow(); int high=T.getHigh();
  if (low>=high)return;
  sB.append(theEnv.getStr(theString.substring(low,high)));
}


public String context(int n,int m){
  if(n>=m)return "[no context:"+n+">="+m+"]";
  if(n>=theString.length()) return 
    "[no context: "+n+">= string length "+theString.length()+"]";
  if(m>=theString.length())return theString.substring(n,theString.length());
  return theString.substring(n,m);
}

public ParseSubst(StringBuffer sB) throws ParseSubstException{
  if(sB==null)throw new ParseSubstException("can't parse null string buffer");
  theBuff=sB;
  theString=sB.toString();
  lex=new MyNaLex(theBuff);
  lg=new Logger();  
  theTree=parseRoot();
//  lg.logIt(treeReport(theTree));
  substFailure=false;
}

  // Root ::= (T | Subst)* ;

public ParseTree parseRoot() throws ParseSubstException{
  ParseTree root=new ParseTree("ROOT",0,theString.length());
  int tokType=lex.getToken();
  while(MyNaLex.endAllToken!=tokType){
    if(tokType==MyNaLex.noToken)
      throw new ParseSubstException("ERROR: Bad token at parseRoot:\n "
                          +lex.context());
    int lo=lex.getTokenStart(); int hi=lex.getTokenEnd();
    if(tokType==MyNaLex.textToken)
      root.addChild(new ParseTree("TEXT",lo,hi));
    else if(tokType==MyNaLex.mynaToken)
      root.addChild(parseSub(lo,hi));
    else throw new ParseSubstException("ERROR: Bad token at beginning:\n "
                              +lex.context());
    tokType=lex.getToken();
    }
  return root;
}

//  Subst ::= SubstTok(tok,d) T (Delim(d) T)* EndTok(tok);


public ParseTree parseSub(int lo, int hi) throws ParseSubstException{
  // the current token is a mynaToken, or we wouldn't be here.
  Hashtable tokProps=lex.getTokenProps();
  String tagName=theString.substring(lo,hi);
  ParseTree pS=new ParseTree(tagName,lo,hi,tokProps);
  int tokType; 
  while(MyNaLex.textToken==(tokType=lex.getToken())){
    pS.addChild(new ParseTree("TEXT",
                lex.getTokenStart(),
                lex.getTokenEnd()));
    if(MyNaLex.textToken!=(tokType=lex.getToken()))break;
      // textToken values are TEXT, DELIM alternately.
    pS.addChild(new ParseTree("DELIM",
                lex.getTokenStart(),
                lex.getTokenEnd()));
   }
  String closeTag=null;
  if(tokType!=MyNaLex.endMynaToken
     || !tagName.equals(closeTag=lex.getTokenString()) ) 
    throw new ParseSubstException("ERROR: <XMP>expecting ["+tagName+
                          "], found ["+closeTag+"]\n"+
                         lex.context()+"</XMP>");
  return pS;
}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久亚洲精品国产精品紫薇| 综合色天天鬼久久鬼色| 国产婷婷精品av在线| 亚洲人一二三区| 国产精品综合一区二区三区| 色婷婷亚洲婷婷| 久久亚洲精精品中文字幕早川悠里| 一区二区不卡在线播放 | 亚洲激情图片qvod| 久久99久久99| 在线电影院国产精品| 亚洲欧洲一区二区在线播放| 韩国v欧美v亚洲v日本v| 这里只有精品视频在线观看| 又紧又大又爽精品一区二区| 国产成人av影院| 久久精品人人做| 国产酒店精品激情| 久久女同性恋中文字幕| 日本伊人午夜精品| 91精品婷婷国产综合久久性色| 亚洲黄色av一区| 色屁屁一区二区| 国产精品久久久久久久久久久免费看 | 国产精品538一区二区在线| 91精品久久久久久蜜臀| 亚洲一区二区三区小说| 在线欧美日韩精品| 亚洲一区自拍偷拍| 欧美日韩高清影院| 亚洲国产毛片aaaaa无费看| 色综合天天在线| 亚洲精品成人在线| 欧美日韩在线不卡| 五月天视频一区| 91精品婷婷国产综合久久性色 | 欧美v日韩v国产v| 久久电影国产免费久久电影| 日韩欧美一区二区免费| 玖玖九九国产精品| 久久久久国产精品厨房| 成人精品一区二区三区中文字幕| 国产精品无圣光一区二区| av一区二区三区黑人| 一区二区三区日韩精品| 欧美三级中文字幕在线观看| 日本va欧美va欧美va精品| 日韩免费一区二区| 成人教育av在线| 一区二区三区资源| 欧美一区二区在线视频| 精品午夜久久福利影院| 国产三级精品三级在线专区| k8久久久一区二区三区| 亚洲高清免费观看高清完整版在线观看| 欧美群妇大交群的观看方式| 日本免费在线视频不卡一不卡二 | 日韩一区二区中文字幕| 国产中文字幕一区| 亚洲私人黄色宅男| 欧美一级视频精品观看| 国产精品亚洲午夜一区二区三区| 亚洲男同性恋视频| 日韩欧美中文字幕制服| 成人激情文学综合网| 亚洲图片一区二区| 国产亚洲短视频| 欧美亚洲国产一区二区三区| 久久99久久99精品免视看婷婷 | 韩国精品主播一区二区在线观看| 中文字幕第一区| 4438x成人网最大色成网站| 国产成人在线免费| 三级在线观看一区二区| 国产精品久久久久久久久果冻传媒| 欧美性生活一区| 国产成人在线视频网址| 亚洲国产成人av网| 国产精品久久久久aaaa| 日韩午夜在线播放| 欧美亚洲免费在线一区| 国产一级精品在线| 日韩和欧美一区二区| 国产精品久久久一本精品| 在线播放国产精品二区一二区四区| 国产成人av电影| 美国一区二区三区在线播放| 亚洲免费在线看| 亚洲国产精品黑人久久久| 91精品国产色综合久久不卡蜜臀| 91免费版pro下载短视频| 国产成人免费xxxxxxxx| 欧美a一区二区| 日韩和欧美一区二区三区| 一区二区三区日韩欧美精品| 中文字幕亚洲欧美在线不卡| 欧美精品一区二区三区一线天视频| 欧美三级电影在线看| av在线不卡网| 成人免费视频网站在线观看| 亚洲成人免费影院| 久久蜜桃av一区精品变态类天堂| 色偷偷成人一区二区三区91 | 色综合久久久久综合99| 国产电影一区在线| 麻豆91在线看| 日韩av一区二区三区| 午夜久久久影院| 亚洲国产欧美一区二区三区丁香婷| 国产精品国产三级国产专播品爱网 | 欧美一区二区三区在线电影| 欧美人与禽zozo性伦| 欧美在线高清视频| 欧美日本高清视频在线观看| 欧美美女一区二区| 在线播放91灌醉迷j高跟美女| 欧美系列一区二区| 欧美伦理影视网| 日韩欧美在线综合网| 日韩欧美国产一区在线观看| 日韩欧美综合一区| 国产亚洲一区二区在线观看| 欧美激情综合五月色丁香小说| 欧美激情自拍偷拍| 亚洲精品成人少妇| 天堂在线一区二区| 美国毛片一区二区| 国产乱人伦精品一区二区在线观看| 国产综合一区二区| 成人综合激情网| 一本一道久久a久久精品| 日本精品裸体写真集在线观看| 欧美综合久久久| 日韩视频一区在线观看| 久久伊人中文字幕| 国产精品电影院| 亚洲电影欧美电影有声小说| 日韩av高清在线观看| 国产美女精品人人做人人爽| www.亚洲在线| 欧美精品乱人伦久久久久久| 欧美成人精品1314www| 国产欧美日韩精品在线| 亚洲精品国产成人久久av盗摄 | 精品对白一区国产伦| 国产目拍亚洲精品99久久精品| 国产精品美女一区二区| 亚洲一区av在线| 久久超碰97人人做人人爱| www.亚洲精品| 欧美一区二区不卡视频| 国产嫩草影院久久久久| 亚洲成人免费视频| 成人免费毛片片v| 欧美日产在线观看| 亚洲国产成人午夜在线一区| 亚洲最大的成人av| 国产福利91精品| 91 com成人网| 亚洲三级小视频| 国内偷窥港台综合视频在线播放| 97se亚洲国产综合自在线不卡| 欧美肥妇free| 亚洲激情在线播放| 成人黄色在线视频| 欧美大片一区二区三区| 一区二区日韩电影| 国产成人免费视频网站| 欧美一区二区三区在线| 亚洲自拍都市欧美小说| 国产91精品一区二区麻豆亚洲| 制服丝袜日韩国产| 亚洲精品国产第一综合99久久| 国产九色sp调教91| 日韩精品最新网址| 亚洲va国产天堂va久久en| av网站免费线看精品| 久久久久久毛片| 久草中文综合在线| 欧美性高清videossexo| 《视频一区视频二区| 7777精品伊人久久久大香线蕉完整版| 国产欧美日韩在线视频| 国产中文一区二区三区| 日韩一区二区三区视频在线观看 | 欧美色成人综合| 亚洲三级在线观看| 99久久精品国产毛片| 国产精品色噜噜| 国产成人精品三级麻豆| 欧美极品少妇xxxxⅹ高跟鞋| 国产精品一卡二| 精品粉嫩超白一线天av| 国产在线视视频有精品| 亚洲同性gay激情无套| 国产综合久久久久久鬼色| 欧美精品一区二区精品网| 久久99国内精品| 2023国产精品| 国产成人免费视|