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

          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開源團隊 閱讀(2220) 評論(2)  編輯  收藏

          評論

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

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

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

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


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


          網站導航:
           
          主站蜘蛛池模板: 武胜县| 平塘县| 文昌市| 上虞市| 河曲县| 黄浦区| 封开县| 沛县| 静宁县| 黑水县| 繁峙县| 胶南市| 永仁县| 满城县| 南昌市| 涞源县| 满洲里市| 来宾市| 富宁县| 马尔康县| 云林县| 临猗县| 怀远县| 无锡市| 新泰市| 荣昌县| 温州市| 嘉祥县| 烟台市| 阿尔山市| 鄯善县| 麦盖提县| 大邑县| 灌南县| 高台县| 永吉县| 定安县| 镇安县| 崇礼县| 南雄市| 华阴市|