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

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

?? parsesubst.java

?? java web 開發(fā),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一区二区三区免费野_久草精品视频
亚洲欧洲日韩在线| 蜜桃一区二区三区四区| 91麻豆精品在线观看| 日韩一区日韩二区| 97久久精品人人澡人人爽| 一区二区三区四区不卡视频| 欧美乱妇15p| 国产在线一区二区| 中文字幕综合网| 欧美精品丝袜久久久中文字幕| 奇米亚洲午夜久久精品| 欧美极品美女视频| 欧美无乱码久久久免费午夜一区| 久久成人久久鬼色| 亚洲欧洲在线观看av| 欧美日韩综合一区| 狠狠色狠狠色综合系列| 亚洲免费在线播放| 日韩欧美国产午夜精品| 成人av网站在线观看免费| 天天av天天翘天天综合网 | 久久久久久亚洲综合| 99在线热播精品免费| 日韩高清不卡一区二区三区| www久久久久| 欧美日韩一区成人| 国产aⅴ精品一区二区三区色成熟| 一区二区三区日韩| 久久精品一区蜜桃臀影院| 欧美在线三级电影| 国产成人丝袜美腿| 亚洲成人激情综合网| 国产精品网站在线播放| 91精品国产色综合久久不卡蜜臀 | 国产成人亚洲综合色影视| 国产一区二区三区在线观看免费视频| 精彩视频一区二区三区| 91看片淫黄大片一级在线观看| 欧美日韩免费观看一区二区三区 | 欧美男生操女生| 在线精品视频一区二区三四| 日韩专区中文字幕一区二区| 91极品视觉盛宴| 中文字幕在线一区免费| 国产成人在线视频网址| 日本一区二区视频在线| 国产一二精品视频| 丝袜诱惑亚洲看片| 美脚の诱脚舐め脚责91| 欧美卡1卡2卡| jiyouzz国产精品久久| 日韩和的一区二区| 亚洲综合一区二区| 欧美一级午夜免费电影| 国产成人综合亚洲91猫咪| 精品久久久久久久久久久久包黑料| 天堂成人国产精品一区| 成人精品免费网站| 91精品国产入口在线| 久久精品一区二区| 亚洲午夜av在线| 美女久久久精品| 国产精品视频九色porn| 欧美三片在线视频观看| 国产精品综合久久| 一区免费观看视频| 欧美一区二区三区日韩视频| 成人精品免费看| 青青草97国产精品免费观看无弹窗版| 精品国产三级a在线观看| 色屁屁一区二区| 精品一区二区三区蜜桃| 亚洲午夜在线视频| 国产午夜精品一区二区三区嫩草 | 2022国产精品视频| 欧美色爱综合网| 国产aⅴ综合色| 看国产成人h片视频| 亚洲欧美日韩综合aⅴ视频| 日韩美一区二区三区| 日本道在线观看一区二区| 国产成人自拍网| 美女脱光内衣内裤视频久久网站| 亚洲女爱视频在线| 中文字幕乱码久久午夜不卡 | 国产在线精品免费av| 亚洲在线观看免费视频| 国产精品美女www爽爽爽| 精品国产一区a| 91精品国产乱| 欧美日韩成人在线一区| 91蝌蚪国产九色| 北条麻妃国产九九精品视频| 国产jizzjizz一区二区| 蜜桃av一区二区| 日韩制服丝袜av| 日韩专区一卡二卡| 亚洲二区在线视频| 亚洲gay无套男同| 亚洲综合网站在线观看| 久久中文字幕电影| 欧美日韩精品高清| 色婷婷久久99综合精品jk白丝| 国产成人自拍高清视频在线免费播放| 久久综合综合久久综合| 日韩和欧美一区二区三区| 亚洲一二三四在线| 亚洲午夜久久久久久久久电影院| 亚洲精品久久久蜜桃| 中文字幕一区二区三区不卡| 久久精品人人做人人综合 | 亚洲精品一区二区三区在线观看| 日韩欧美综合在线| 日韩一区二区三区在线视频| 日韩欧美一级在线播放| 精品福利一二区| 久久久九九九九| 亚洲国产精品精华液2区45| 国产精品你懂的在线| 亚洲三级免费电影| 亚洲精品国久久99热| 亚洲激情五月婷婷| 亚洲va欧美va人人爽午夜| 亚洲3atv精品一区二区三区| 日韩成人av影视| 看国产成人h片视频| 国产高清不卡二三区| 99久久精品免费观看| 欧美三片在线视频观看 | 韩国v欧美v亚洲v日本v| 国产成人免费在线| 91在线观看高清| 欧美老女人在线| 久久久久免费观看| 亚洲日本乱码在线观看| 九九视频精品免费| 国产精品一二二区| 91国偷自产一区二区三区观看 | 欧美国产精品一区二区三区| 国产精品卡一卡二卡三| 亚洲午夜日本在线观看| 黄色小说综合网站| 99国产精品视频免费观看| 欧美日韩日日摸| 国产日韩欧美精品综合| 亚洲狠狠爱一区二区三区| 韩国三级在线一区| 日本久久电影网| 精品国产人成亚洲区| 玉米视频成人免费看| 久久99久久久久| 色偷偷久久人人79超碰人人澡| 69堂国产成人免费视频| 国产精品入口麻豆九色| 日本最新不卡在线| 99这里都是精品| 精品三级av在线| 亚洲国产裸拍裸体视频在线观看乱了 | 2欧美一区二区三区在线观看视频| 中文成人综合网| 免费欧美在线视频| 日本道在线观看一区二区| 精品三级av在线| 亚洲成人福利片| 99久免费精品视频在线观看| 日韩精品一区二区三区视频在线观看 | 欧美三级资源在线| 国产精品国产三级国产aⅴ入口| 天堂蜜桃91精品| 91色在线porny| 欧美激情在线看| 黄色精品一二区| 日韩欧美在线网站| 亚洲一区二区三区四区中文字幕 | 欧美日本精品一区二区三区| 国产精品欧美久久久久无广告| 久久精品国产免费| 在线成人免费观看| 一区二区三区精品在线| 成人国产精品免费| 久久精品一区八戒影视| 狠狠色丁香久久婷婷综合_中| 欧美日韩成人一区二区| 一区二区三区丝袜| 色狠狠色狠狠综合| 亚洲天堂2014| 91一区一区三区| 最新不卡av在线| 成人黄色电影在线 | 国产精品热久久久久夜色精品三区| 麻豆成人在线观看| 精品三级在线看| 国产一区二区三区香蕉| 亚洲精品一区二区三区在线观看 | 国产亚洲午夜高清国产拍精品| 精品一区二区三区免费播放| 精品第一国产综合精品aⅴ| 老司机免费视频一区二区 | 亚洲婷婷在线视频| 91在线视频观看|