<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 的主要類:

    Antlr 中有主要類有兩種(其實還有一種 TreeLexer

    Lexer: 文法分析器類。主要用于把讀入的字節流根據規則分段。既把長面條根據你要的尺寸切成一段一段:)并不對其作任何修改。

    Parser: 解析器類。主要用于處理經過 Lexer 處理后的各段。一些具體的操作都在這里。

    二、 Antlr 文法文件形式:

    Antlr 文件是 *.g 形式,即以 g 為后綴名。

    例如: t.g

    class P extends Parser;

    startRule

    ??? :?? n:NAME

    ??????? {System.out.println("Hi there, "+n.getText());}

    ??? ;

    class L extends Lexer;

    // one-or-more letters followed by a newline

    NAME:?? ( 'a'..'z'|'A'..'Z' )+ NEWLINE

    ??? ;

    NEWLINE

    ??? :?? '\r' '\n'?? // DOS

    ??? |?? '\n'??????? // UNIX

    ;

    具體成分分析:

    1 、總體結構

    Class P extends Parser

    Class L extends Lexer

    兩行同 JAVA 繼承一樣, P 繼承 Parser 類; L 繼承 Lexer 類。每個 .g 文件只能各有一個。

    2 Lexer 類分析

    一般按照

    類型名:
    ????
    匹配的具體規則
    ????

    的形式構成。是分隔字節流的依據。同時可以看到里面可以互相引用。如本例中的類型名 NEWLINE 出現在 NEW 的匹配規則中。

    3 Parser 類分析

    一般按照

    起始規則名:

    ???????? 規則實例名:類型名或規則名

    ??????????????????????????? {Java 語句。。。; }

    ????????

    ???????? 。。。。。。。。。

    的形式構成。

    起始規則名:任意。

    規則實例名:就象 Java 中“ String s ;”的 s 一樣。規則實例名用于在之后的 JAVA 語句中調用。

    類型名或規則名:可以是在 Lexer 中定義的類型名,也可以是 Parser 中定義的規則名。感覺就像是 int Integer 的區別。

    Java 語句:指當滿足當前規則時所執行的語句。 Antlr 會自動嵌入生成的 java 類中。

    ?

    ?

    ?

    三、生成 Java

    1 、從 www.antlr.org 上下載 antlr-x.x.x.jar

    2 、配置環境變量: classpath=.;x:\jdk\lib\tools.jar;x:\antlr-x.x.x.jar

    3 、在 t.g 所在目錄下執行:

    java antlr.Tool t.g

    會在當前目錄下生成如下文件:

    L.java Lexer 文法分析器 java 類。

    P.java Parser 解析器 java 類。

    PTokenTypes.java Lexer 中定義的類型具體化,供 Parser 解析器調用。

    PTokenTypes.txt :當外部的(如 t2.g )要調用當前的類型或規則時要用到本文件。

    ?

    ?

    ?

    四、執行

    1 、編寫 Main
    import java.io.*;
    ????? class Main {
    ?public static void main(String[] args) {

    try {


    L lexer = new L(new DataInputStream(System.in));
    P parser = new P(lexer); parser.startRule();
    } catch(Exception e)
    {
    System.err.println("exception: "+e);
    }


    ? }
    }

    2 、執行
    c:\> javac *.java
    c:\> java Main
    Terence
    ^Z
    Hi there, Terence
    c:\>

    本文作者kingchou是CowNew開源團隊SQL解析引擎項目組負責人。
    更多內容請見CowNew開源團隊網站
    www.cownew.com
    論壇 http://www.cownew.com/newpeng/

    posted on 2006-05-23 02:22 CowNew開源團隊 閱讀(2218) 評論(2)  編輯  收藏

    評論

    # re: antlr入門教程1 2006-05-23 10:05 Long Long Ago
    把代碼整理一下會更好  回復  更多評論
      

    # re: antlr入門教程1 2006-05-25 19:17 Programus
    只有1?

    后續呢?具體些的例子和做法呢?

    期待期待……  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 黄视频在线观看免费| 国产精品亚洲专区无码不卡| 国产精品永久免费| 日韩亚洲国产综合久久久| 亚洲AV无码一区二区一二区| 久久精品a一国产成人免费网站 | 特级av毛片免费观看| 久久久久久久99精品免费| 国产亚洲人成网站观看| 三年片在线观看免费| 亚洲av日韩av天堂影片精品| 18级成人毛片免费观看| 亚洲国产成人久久| 无码视频免费一区二三区| 亚洲人片在线观看天堂无码| 四虎永久免费地址在线观看| 久香草视频在线观看免费| 亚洲老妈激情一区二区三区| 久操视频在线免费观看| 亚洲AⅤ视频一区二区三区| 免费的黄色网页在线免费观看| 成年在线观看网站免费| 亚洲精品乱码久久久久久V | 色se01短视频永久免费| 亚洲妇女无套内射精| 国产亚洲av片在线观看18女人| 成人精品一区二区三区不卡免费看| 久久亚洲精品国产精品| 岛国大片免费在线观看| 永久免费无码日韩视频| 亚洲免费视频网站| 日韩免费高清视频网站| 亚洲专区一路线二| 日本免费一区尤物| 全黄大全大色全免费大片| 亚洲乱码一二三四区国产| 亚洲精品国产V片在线观看| 黄网站色视频免费观看45分钟| 久久精品国产亚洲网站| 久艹视频在线免费观看| 亚洲熟妇AV日韩熟妇在线|