歡迎您光臨本站 註冊首頁

Antlr入門詳細教程

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0
  一、 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:jdklibtools.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:>


[火星人 ] Antlr入門詳細教程已經有514次圍觀

http://coctec.com/docs/java/show-post-61820.html