<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網 大學生計算機學習社區

    CowNew開源團隊

    http://www.cownew.com 郵件請聯系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    #


    ANTLR樹分析器
                    本章翻譯人 CowNew開源團隊 周曉

    曾經的SORCERER

    在ANTLR 2.xx版本中,只要增加一些樹操作符,就可以幫助你建立一種中間形式的樹結構(抽象語法樹) 來重寫語法規則和語義動作。ANTLR同樣允許你去指定AST樹的文法結構,因此,可以通過操作或簡單遍歷樹結點的方式來進行文法翻譯。

    以前,樹分析器用一個單獨的工具SORCERER來生成,但是ANTLR已經取代了它的功能。ANTLR現在可以為字符流,記號流,以及樹節點來建立識別器。

    什么是樹分析器?

    分析是決定一個記號串是否能由一個文法產生的過程。ANTLR在這方面比大多數工具考慮的都要深,它把一個二維樹結構看作是一串節點。這樣,在ANTLR中,對記號流分析和樹分析的代碼生成過程來說,真正僅有的區別就變成了對超前掃描,規則方法定義頭部的檢測,以及對二維樹結構代碼生成模板的指定上。

    可以分析什么類型的樹?

    ANTLR樹分析器可以遍歷實現了AST接口的任何樹。AST接口是一種基于類似兒子-兄弟結點的樹通用結構,有如下重要的制導方法:

    • getFirstChild: 返回第一個子結點的引用.
    • getNextSibling: 返回下一個兄弟結點的引用.

    每一個AST結點有一個子女列表,一些文本和一個"記號類型"。每個樹的結點都是一棵樹,因此我們說樹是自相似的。AST接口的完整定義如下:

    
    /** 最小AST結點接口用于ANTLR的AST成生
    *	和樹遍歷
    */
    public interface AST {
    /** 添加一個子結點到最右邊 */
    public void addChild(AST c);
    public boolean equals(AST t);
    public boolean equalsList(AST t);
    public boolean equalsListPartial(AST t);
    public boolean equalsTree(AST t);
    public boolean equalsTreePartial(AST t);
    public ASTEnumeration findAll(AST tree);
    public ASTEnumeration findAllPartial(AST subtree);
    /** 得到第一個子結點; 如果沒有子結點則返回null */
    public AST getFirstChild();
    /** 得到本結點的下一個兄弟結點 */
    public AST getNextSibling();
    /** 得到本結點的記號文本 */
    public String getText();
    /** 得到本結點的記號類型 */
    public int getType();
    /** 得到本結點的子結點總數; 如果是葉子結點, 返回0 */
    public int getNumberOfChildren();
    public void initialize(int t, String txt);
    public void initialize(AST t);
    public void initialize(Token t);
    /** 設置第一個子結點. */
    public void setFirstChild(AST c);
    /** 設置下一個兄弟結點. */
    public void setNextSibling(AST n);
    /** 設置本結點的記號文本 */
    public void setText(String text);
    /** 設置本結點的記號類型 */
    public void setType(int ttype);
    public String toString();
    public String toStringList();
    public String toStringTree();
    }
    

    樹的語法規則

    正如PCCTS1.33的SORCERER工具和ANTLR記號語法中所看到的,樹語法是一個嵌入語義動作,語義斷言和句法斷言的EBNF規則的集合。

    
    規則:	可選產生式1
    |	可選產生式2
    ...
    |	可選產生式n
    ;
    

    每一個可選的產生式都是由一個元素列表所組成的,列表中的元素是加入了樹模式的ANTLR正規語法中的一個,有如下的形式:

    
    #( 根結點 子結點1 子結點2 ... 子結點n )
    
    

    例如:下列的樹模式匹配一個以PLUS為根結點,并有兩個INT子結點簡單樹結構:

    
    #( PLUS INT INT )
    

    樹模式的根必須是一個記號引用,但是子結點元素不限于此,它甚至可以是子規則。例如,一種常見結構是if-then-else樹結構,其中的else子句聲明子樹是可選的:

    
    #( IF expr stat (stat)? )
        

    值得一提的是,當指定樹模式和樹語法后,通常,會進行滿足條件的匹配而不是精確的匹配。一旦樹滿足給定的模式,不管剩下多少沒有分析,都會報告一次匹配。例如,#( A B ),對于像#( A #(B C) D)這樣有相同結構的樹,不管有多長,都會報告一次匹配。

    句法斷言

    ANTLR樹分析器在工作時僅使用一個單獨的超前掃描符號,這在通常情況下不是一個問題,因為這種中間形式被明確設計成利于遍歷的結構。然而,偶爾也需要區別出相似的樹結構。句法斷言就是被用來克服有限確定的超前掃描所帶來的限制。例如:在區分一元和二元減號時,可以為每一種類型的減號都創建操作結點,這樣的做法可以工作的很好。但對于一個相同的根結點,使用句法斷言可以區分以下結構:

    
    expr:   ( #(MINUS expr expr) )=> #( MINUS expr expr )
    |   #( MINUS expr )
    ...
    ;
    

    賦值的次序很重要,因為第二個可選產生式是第一個可選產生式的“子集”.

    語義斷言

    語義斷言在可選產生式的開始,僅僅同可選的斷言表達式合成一體,就像合成一個正規文法。語義斷言在產生式的中間,當它斷言失敗時,也會像正規文法一樣拋出異常。

    一個樹遍歷器的例子

    考慮一下如何去建立一個計算器。一個方法是建立一個分析器,這個分析器識別輸入并計算表達式的值。按照這種方法,我們將會建立一個分析器來為輸入的表達式創建一棵樹,把表達式以這種中間形式表示,然后樹分析器遍歷這個樹,并計算出結果。

    我們的識別器, CalcParser, 通過如下的代碼來定義:

    
    class CalcParser extends Parser;
    options {
    buildAST = true;   // // 默認使用 CommonAST
    }
    expr:   mexpr (PLUS^ mexpr)* SEMI!
    ;
    mexpr
    :   atom (STAR^ atom)*
    ;
    atom:   INT
    ;
    

    PLUSSTAR記號是操作符,因此把它們作為子樹的根結點,在它們后面注釋上字符'^'。SEMI記號后綴有字符'!',這指出了它不應該被加入到樹中。

    這個計算器的詞法分析定義如下:

    
    class CalcLexer extends Lexer;
    WS	:	(' '
    |	'\t'
    |	'\n'
    |	'\r')
    { _ttype = Token.SKIP; }
    ;
    LPAREN:	'('
    ;
    RPAREN:	')'
    ;
    STAR:	'*'
    ;
    PLUS:	'+'
    ;
    SEMI:	';'
    ;
    INT	:	('0'..'9')+
    ;
        

    識別器生成的樹是一棵簡單的表達式樹。例如,輸入"3*4+5"所產生的樹的形式為#( + ( * 3 4 ) 5 )。為了給這種形式的樹建立樹遍歷器,你必須要為ANTLR遞歸的描述樹的結構:

    
    class CalcTreeWalker extends TreeParser;
    expr	:	#(PLUS expr expr)
    |	#(STAR expr expr)
    |	INT
    ;
    

    一旦指定結構,就可以自由的嵌入語義動作去計算出結果。一個簡單的實現辦法就是使expr規則返回一個整型的值,然后使每一條可選產生式計算每個子樹的值。下面的樹文法和動作達到了我們期望的效果:

    
    class CalcTreeWalker extends TreeParser;
    expr returns [int r]
    {
    int a,b;
    r=0;
    }
    :	#(PLUS a=expr b=expr) {r = a+b;}
    |	#(STAR a=expr b=expr) {r = a*b;}
    |	i:INT		      {r = Integer.parseInt(i.getText());}
    ;
        

    注意到當計算表達式值得時候,沒有必要指定優先級,因為它已經隱含在樹的結構中了。這也解釋了為什么在以中間樹形式表示的時候,要比它的輸入要多很多。輸入的符號確實作為結點儲存在樹結構中,而且這種結構隱含了結點之間的關系。

    要想執行分析器和樹遍歷器,還需要以下的代碼:

    
    import java.io.*;
    import antlr.CommonAST;
    import antlr.collections.AST;
    class Calc {
    public static void main(String[] args) {
    try {
    CalcLexer lexer =
    new CalcLexer(new DataInputStream(System.in));
    CalcParser parser = new CalcParser(lexer);
    // 分析輸入的表達式
    parser.expr();
    CommonAST t = (CommonAST)parser.getAST();
    // 以LISP符號的形式輸出樹
    System.out.println(t.toStringList());
    CalcTreeWalker walker = new CalcTreeWalker();
    // 遍歷由分析器建立的樹
    int r = walker.expr(t);
    System.out.println("value is "+r);
    } catch(Exception e) {
    System.err.println("exception: "+e);
    }
    }
    }
        

    翻譯

    樹分析器對檢查樹或者從一棵樹產生輸出來說是很有用的,但必須要為它們添加處理樹轉換的代碼。就像正則分析器一樣,ANTLR樹分析器支持buildAST選項,這類似于SORCERER的翻譯模式。程序員不去修改代碼,樹分析器自動把輸入樹拷貝到作為結果的樹。每一個規則都隱含(自動定義的)一個結果樹。通過getAST 方法,我們可以從樹分析器中獲得此樹的開始符號。如果要一些可選產生式和文法元素不被自動添加到輸入的樹上,它們后面要注釋上"!"。子樹可以被部分的或者全部重寫。

    嵌入到規則中的語義動作可以根據測試和樹結構來對結果樹進行設置。參考文法動作翻譯章節.

    一個樹翻譯的例子

    再來看一下上面提到的簡單計算器的例子,我們可以執行樹翻譯來代替計算表達式的值。下面樹文法的動作優化了加法的恒等運算(加0)。

    
    class CalcTreeWalker extends TreeParser;
    options{
    buildAST = true;	// "翻譯"模式
    }
    expr:!  #(PLUS left:expr right:expr)
    // '!'關閉自動翻譯
    {
    // x+0 = x
    if ( #right.getType()==INT &&
    Integer.parseInt(#right.getText())==0 )
    {
    #expr = #left;
    }
    // 0+x = x
    else if ( #left.getType()==INT &&
    Integer.parseInt(#left.getText())==0 )
    {
    #expr = #right;
    }
    // x+y
    else {
    #expr = #(PLUS, left, right);
    }
    }
    |   #(STAR expr expr)  // 使用自動翻譯
    |   i:INT
    ;
        

    執行分析器和樹翻譯器的代碼如下:

    
    import java.io.*;
    import antlr.CommonAST;
    import antlr.collections.AST;
    class Calc {
    public static void main(String[] args) {
    try {
    CalcLexer lexer =
    new CalcLexer(new DataInputStream(System.in));
    CalcParser parser = new CalcParser(lexer);
    // 分析輸入的表達式
    parser.expr();
    CommonAST t = (CommonAST)parser.getAST();
    // 以LISP符號的形式輸出樹
    System.out.println(t.toLispString());
    CalcTreeWalker walker = new CalcTreeWalker();
    // 遍歷由分析器建立的樹
    walker.expr(t);
    // 遍歷,并得到結果
    t = (CommonAST)walker.getAST();
    System.out.println(t.toLispString());
    } catch(Exception e) {
    System.err.println("exception: "+e);
    }
    }
    }
    }
    

    檢查/調試AST

    當開發樹分析器的時候,經常會得到分析錯誤。不幸的是,你的樹通常異乎尋常的大,使得很難去確定AST結構錯誤到底在哪里。針對這種情況(當創建Java樹分析器的時候,我發現它非常有用),,我創建了一個ASTFrame類(一個JFrame),這樣,你就可以用Swing樹視圖來查看你的AST。它沒有拷貝這棵樹,而是用了一個TreeModel。以應用程序方式運行antlr.debug.misc.ASTFrame去或者看看Java代碼Main.java。就像不確定如何去調試一樣,我不確定它們在相同的包下,總之,將會在以后的ANTLR版本中給出。這里有一個簡單的使用例子:

    public static void main(String args[]) {
    // 創建樹結點
    ASTFactory factory = new ASTFactory();
    CommonAST r = (CommonAST)factory.create(0, "ROOT");
    r.addChild((CommonAST)factory.create(0, "C1"));
    r.addChild((CommonAST)factory.create(0, "C2"));
    r.addChild((CommonAST)factory.create(0, "C3"));
    ASTFrame frame = new ASTFrame("AST JTree Example", r);
    frame.setVisible(true);
    }
    Version: $Id: //depot/code/org.antlr/release/antlr-2.7.6/doc/sor.html#1 $
    posted @ 2007-10-29 22:26 CowNew開源團隊 閱讀(4559) | 評論 (5)編輯 收藏

    寫存儲過程的時候,發現一有意思的現象:語句大概有1k多行,在編譯的時候提示:
    [IBM][CLI Driver][DB2/HP64] SQL0101N  語句太長或者太復雜。  SQLSTATE=54001
    然后就是粗略的優化SQL語句了,什么能不要的全不要,能折行的就折行,但是,效果還是一樣。
    最后,就只能用這招了:更改SQL堆的大小!
    把默認的堆值放大一倍后,執行順利通過!
    -- Start of generated script for NO CONNECTION
    --  Dec-20-2006 at 13:20:35
    #ATTACH NDE4C3D4;
    UPDATE DATABASE CONFIGURATION
      FOR FWMY USING
        stmtheap 50000
      IMMEDIATE;
    DETACH;
    #SYNC 10;
     
    -- End of generated script for NO CONNECTION

    from:http://blog.sina.com.cn/s/blog_55fc875c010007zj.html
    posted @ 2007-10-28 16:56 CowNew開源團隊 閱讀(463) | 評論 (0)編輯 收藏

            本書系統地介紹了SWT、Draw2D、GEF、JET等與Eclipse插件開發相關的基礎知識,并且以實際的開發案例來演示這些知識的實戰性應用,通過對這些實際開發案例的學習,讀者可以非常輕松地掌握Eclipse插件開發的技能,從而開發出滿足個性化需求的插件。.
            本書以一個簡單而實用的枚舉生成器作為入門案例,通過該案例讀者能學習到擴展點、SWT、JET等Eclipse插件開發的基本技能;接著對Eclipse插件開發中的基礎知識進行了介紹,并且對屬性視圖的使用做了重點介紹;最后以兩個具有一定復雜程度的插件(Hibernate建模工具和界面設計器)為案例介紹了SWT、Draw2D、GEF、JET等技術的綜合運用。..
    本書不僅適合于Eclipse插件開發初學者學習,對于有一定相關開發經驗的開發人員也具有很高的參考價值。

    Chinapub購買地址:http://www.china-pub.com/computers/common/info.asp?id=36806

    本書隨書光盤下載地址:http://www.namipan.com/d/b8879fd74ea3e2b2fd092bb3c7550352f5c6f49765b57b00
    posted @ 2007-10-24 22:44 CowNew開源團隊 閱讀(481) | 評論 (3)編輯 收藏

    今天寫了一個Maxthon的“進入編輯模式”插件,可以用來破解防復制的網頁。插件機制真是爽呀,看來我的《網頁復制大師》要徹底退休了,呵呵。
    點此下載:http://www.tkk7.com/Files/huanzhugege/editit.zip

    maxhon已經收錄本插件:http://addons.maxthon.com/post/2007/10/23/進入編輯模式
    posted @ 2007-10-24 00:12 CowNew開源團隊 閱讀(461) | 評論 (0)編輯 收藏

    CowNewSQL多數據庫翻譯器在線演示已經開發完成,歡迎體驗
    http://211.99.196.18:6666/cownewdemo

    由于訪問人數眾多,如果暫時無法訪問,請稍后再試。
    目前已經支持SQLServer、DB2、MySQL、Oracle四種數據庫管理系統。
    CowNewSQL源碼和二進制包可以從CowNew網站(http://www.cownew.com )下載。
    **********************************************
           由于種種原因,各個數據庫系統的SQL語句語法以及支持的函數都不盡相同,這造成了如下兩個問題:(1)使得系統在多個不同數據庫之間移植變得非常困難,特別是需要維護多個數據庫版本的時候;(2)開發人員必須對各種數據庫的語法差異非常了解,這加大了開發難度。

           雖然Hibernate通過HQL等技術部分的解決了跨數據庫移植的問題,但是在對性能要求比較高的場合還是需要直接使用SQL語句訪問數據庫的,在這種情況下如何編寫能被不同數據庫支持的SQL語句就成了。目前解決這種差異的最常用的技術就是SQL語句翻譯,使用SQL翻譯器可以將SQL語句翻譯為在不同的數據庫中支持的特定平臺的SQL語句。CowNewSQL就是這樣一款產品。

           CowNewSQL簡化了跨數據庫產品的開發,比如取當前日期在MSSQL中是“SELECT GETDATE()”,在MYSQL中是“SELECT NOW()”,在Oracle中是“SELECT SYSDATE FROM DUAL”,使用CowNewSQL以后您只要使用“SELECT NOW()”,那么CowNewSQL就會為您自動將其翻譯為對應數據庫平臺支持的SQL語句,而且CowNewSQL的兼容性也非常好,比如“SELECT NOW()”寫成“SELECT GETDATE()”同樣可以被正確的翻譯;取數據庫前10條記錄,在MSSQL中是“Select top 10 from T_1”、在MYSQL中是“SELECT  LIMIT 0, 10 ”、在Oracle中是“SELECT  FROM DUAL WHERE ROWNUM <= 10”,使用CowNewSQL以后您只要使用“Select top 10 from T_1”,那么CowNewSQL就會為您自動將其翻譯為對應數據庫平臺支持的SQL語句。

           CowNewSQL還通過變通的方式對目標數據庫不直接支持的語法進行了支持。比如MYSQL是不支持“select * from t1 where fid in(select fid from t2 limit 0,5)”這樣在子查詢中的Limit語句的,CowNewSQL通過將子查詢進行二次結果集包裝的方式巧妙的對其進行了支持,“delete from T_SaleInvoice where FId in(select top 5 FParentId from T_SaleInvoiceDetails)”通過CowNewSQL的翻譯以后就成了“DELETE FROM T_SaleInvoice WHERE FId IN (select * from(SELECT FParentId FROM T_SaleInvoiceDetails LIMIT 0, 5 ) t_temp_sub)”這樣被MYSQL支持的語法了;MYSQL中沒有提供計算兩個日期之間月份差異的函數,CowNewSQL通過組合其他日期函數的方式模擬了這個函數,這樣使用者只要使用MONTHS_BETWEEN函數即可了,無需關心內部的差異。

           CowNewSQL支持如下幾種類型的SQL語句:CreateTable/DropTable/CreateIndex/DropIndex/Select/Insert/Delete/Update;支持子查詢、JoinUnion等高級的SQL特性;支持日期(包括取當前日期、從日期中提取任意部分、計算日期差異、日期前后推算等)、數學(包括取絕對值、取PI值、四舍五入、對數計算、隨機數等)、字符串(包括取子字符串、取字符串長度、字符串截斷、大小寫轉換等)、基本數據處理(包括數字字符串互轉、日期轉字符串、非空判斷等)等函數。

    posted @ 2007-10-21 23:39 CowNew開源團隊 閱讀(1396) | 評論 (10)編輯 收藏

    自從2005年底discuz 4.0宣布開源以來,國內很多程序都陸續宣布開源,個個都把開源當作一把大旗來鼓吹自己,但它們真的是開源了嗎?

    dedecms是國內用戶最多的CMS,自己搞了個協議。
    discuz最初叫CDB,基于XMB 1.5 Silver開發的,CDB代碼中也寫了遵循BSD許可協議,但CDB后來名字變為discuz,discuz1.X已經去除了BSD授權說明……
    cmsware也很可笑,減少了加密文件的數量,就宣稱自己在“走向開源”。
    上個月PHPCMS宣布開源了,下載了個看看,里面竟然連個license說明文件都沒?難道沒有任何約束和限制?

    希望這些國內的優秀程序更規范一些,開源不僅僅是讓別人看到源代碼,也不僅僅是供別人免費使用,這不是開源的精神,開源的真正目的是讓更多的人參與進來,讓軟件更完美。

    from :http://news.csdn.net/n/20071019/109739.html
    posted @ 2007-10-20 10:27 CowNew開源團隊 閱讀(419) | 評論 (0)編輯 收藏

        今天用通訊前置配置工具連接BICE修改其中的參數,重啟BICE以后BICE報錯“SAXException:文件過早結束”,用通訊前置配置工具再次連接也連不上了,而行科技處的人用他們的通訊前置配置工具修改則沒事。檢查配置工具的版本也一樣。
        最后琢磨出來的原因:BICE服務器(包括配置服務器)是運行的JDK1.4,我機器上的JDK是1.6.所以用通訊前置配置工具修改以后保存的XML格式文件就是JDK1.6能識別的了(呵呵,貌似和XML的語言無關的理念有沖突呀),這樣到JDK1.4中就識別錯誤了。經過驗證也是確實是這個原因。
        我用的是最懶的人的解決方法:把JRE1.4拷貝到通訊前置配置工具的目錄下(命名為jre1.4),然后修改通訊前置配置工具的啟動腳本run.bat為:
    start ./jre1.4/bin/javaw.exe -cp
    ./lib/commons-httpclient-2.0-beta1.jar;./lib/commons-logging.jar;./lib/jgraph.jar;./lib/PropertyPanel.jar;./lib/Utility.jar;./lib/xalan.jar;./lib/tools.jar;./lib/workflow.jar;./lib/org.mortbay.jetty.jar
    cn.com.icbc.bice.ui.ConfigMainPanel

        一切OK!




    posted @ 2007-10-19 19:01 CowNew開源團隊 閱讀(553) | 評論 (0)編輯 收藏

     

    VirtualBoxforLinuxHost-Only設定

    類似VMwareHost-only的作法,需要建立虛擬網卡和GuestOS來通訊。

    工具 tunctl 可從 uml-utilities套件中取得。

    建立虛擬網卡:

    # tunctl -t vmnet1(網卡名稱可自定) -u atsiv(使用者名稱)

    此時用ifconfig -a 查看會多出一個虛擬網卡界面。

    # chmod 666 /dev/net/tun

    為虛擬網卡設定 IP (私有private ip)

    # ifconfig vmnet1 192.168.0.1 netmask 255.255.255.0

    VirtualBox的設定:

    Attached to 選擇 Host Interface

    Interface Name 鍵入 vmnet1(就是上面所設的名稱)

    然后在GuestOS中設定同網段的IP,例如 192.168.0.2

    HostOSGuestOSPing看看是否可連通。

    若要讓GuestOS也可架站或連上網絡,則可在HostOS中用iptables設定DNAT, SNAT即可。

    刪除 虛擬網卡

    # tunctl -d vmnet1

    目前用CentOS 4.4 母機養了一只Win2K小機。

    轉貼自:http://www.xuniji.com/forum/view.asp?id=7661&p=1&page=1

    楊中科注:如果按照上面方法設置還ping不通的話,請查看是否是防火墻的問題,可以將GuestOSHostOS的防火墻的ping規則放開。由于我是用VirtualBox做沒有網絡環境時候的數據庫服務器用的,不會有網絡攻擊的問題,所以我干脆直接將兩個系統的防火墻都關掉了。對于HostOS來說只要關閉針對于虛擬網卡的防火墻就可以了。

    posted @ 2007-10-17 22:16 CowNew開源團隊 閱讀(790) | 評論 (0)編輯 收藏

    設定lib包下所有的jar到classpath
    1、windows下的方法:
    首先創建文件setenv.bat,內容如下:
    set CLASSPATH=.\bin\
    for %%f in (".\lib\*.jar") do call cpappend.bat %%f

    然后創建主腳本:
    if "%OS%" == "Windows_NT" setlocal
    call setenv.bat
    java cn.com.agree.isbp.schedule.Startup
    if "%OS%" == "Windows_NT" endlocal
    2、Linux下的方法:
    首先創建文件setenv.sh,內容如下:
    #!/bin/sh
    CP=./bin/
    for i in ./lib/*.jar
    do
        CP="$i:$CP"
    done
    export CP
    然后創建主腳本:
    #!/bin/sh
    source setenv.sh
    java -cp "$CP" cn.com.agree.isbp.schedule.Startup &

    posted @ 2007-10-12 15:57 CowNew開源團隊 閱讀(904) | 評論 (0)編輯 收藏

    今天需要為產品增加Linux下的啟動腳本,編寫完成運行以后發現不能正常執行,而是提示:
    'etenv.sh:line 4:syntax error near unexpected token do
    檢查腳本沒有發現任何語法問題。經過自己研究發現是不同的系統下換行符造成的。我是在Windows下的Eclipse中編寫的腳本,然后通過虛擬機的共享目錄方式傳遞到虛擬機中的Linux中的,這樣換行符就是Windows格式的了,使用Dos2Unix等工具或者直接使用UE的DOS轉Unix功能轉換以后就正常了。
    posted @ 2007-10-12 15:43 CowNew開源團隊 閱讀(2001) | 評論 (0)編輯 收藏

    僅列出標題
    共30頁: First 上一頁 7 8 9 10 11 12 13 14 15 下一頁 Last 
    主站蜘蛛池模板: 好男人视频在线观看免费看片| 东北美女野外bbwbbw免费 | 日本zzzzwww大片免费| 中文字幕视频免费| 天天摸夜夜摸成人免费视频| 久久精品国产亚洲av麻豆图片| 亚洲中文字幕无码爆乳| 一级毛片a免费播放王色| 鲁丝片一区二区三区免费| 成年人网站在线免费观看| 国产亚洲成人久久| 亚洲喷奶水中文字幕电影| 美女被吸屁股免费网站| 国产92成人精品视频免费| 亚洲国产91在线| 可以免费观看的毛片| 无码久久精品国产亚洲Av影片| 亚洲国产情侣一区二区三区| 青青草a免费线观a| 久久99国产亚洲精品观看| 最近新韩国日本免费观看| 国产亚洲国产bv网站在线| 国产黄色片在线免费观看| 亚洲精品视频久久| 亚洲免费无码在线| 成人免费看黄20分钟| 精品一区二区三区免费毛片| 国内精自视频品线六区免费| 亚洲av伊人久久综合密臀性色 | 国产精品亚洲一区二区三区在线观看| 国产国产人免费人成免费视频 | 免费人成在线观看视频播放| 亚洲中文久久精品无码1 | 国产精品亚洲不卡一区二区三区| 亚洲人成网站在线在线观看| 十八禁无码免费网站| 在线观看亚洲av每日更新| 美女裸体无遮挡免费视频网站| 亚洲永久精品ww47| 水蜜桃视频在线观看免费| 国产成人青青热久免费精品|