JAvacc学習の概要

8782 ワード

JavaCC(Java Compiler Compiler)は、JAVAで開発された最も人気のある構文解析ジェネレータです.この解析ジェネレータツールは,コンテキストに関係なく特殊な意味を持つ構文を読み出し,その構文を識別してマッチングできるJAVAプログラムに変換することができる.JavaCCは、Java仮想マシン(JVM)V 1で利用可能である.2以上のバージョンで使用され、100%の純粋なJavaコードで、Sunが当時Javaを発売したスローガン「Write Once Run Anywhere」と一致する複数のプラットフォームで実行できます.JavaCCはJJTreeツールを提供して文法ツリーを構築し、JJJDocツールは私たちのソースファイルのためにBNFパターン(バコス・ノルパターン)ドキュメント(Html)を生成します.
私たちはjavaccの開発パッケージをダウンロードして、中の例を全部読めばjavaccの文法過程を深く理解することができます.最初の例を見てみましょう
options {
  LOOKAHEAD = 1;
  CHOICE_AMBIGUITY_CHECK = 2;
  OTHER_AMBIGUITY_CHECK = 1;
  STATIC = true;
  DEBUG_PARSER = false;
  DEBUG_LOOKAHEAD = false;
  DEBUG_TOKEN_MANAGER = false;
  ERROR_REPORTING = true;
  JAVA_UNICODE_ESCAPE = false;
  UNICODE_INPUT = false;
  IGNORE_CASE = false;
  USER_TOKEN_MANAGER = false;
  USER_CHAR_STREAM = false;
  BUILD_PARSER = true;
  BUILD_TOKEN_MANAGER = true;
  SANITY_CHECK = true;
  FORCE_LA_CHECK = false;
}

PARSER_BEGIN(Simple1)

/** Simple brace matcher. */
public class Simple1 {

  /** Main entry point. */
  public static void main(String args[]) throws ParseException {
//  system.in        
    Simple1 parser = new Simple1(System.in);
    parser.Input();
  }

}

PARSER_END(Simple1)

/** Root production. */
void Input() :
{}
{//("
"|"\r")* <EOF> MatchedBraces() ("
"|"\r")* <EOF> } /** , , MatchedBraces {}*/ void MatchedBraces() : {} { "{" [ MatchedBraces() ] "}" }

これはsimple 1です.jjの簡単な例では、このjavaccはjjまたはjjt記述ファイルから構成されています.彼は一般的にoption部分に分けられ、本体部分はclass定義のjavaに相当するクラスであり、token部分であり、上の関数は主にマッチング数{}です.
例えば「{}」,「{{{}}}}}}}}}」
第2例simple 2.jj
PARSER_BEGIN(Simple2)

/** Simple brace matcher. */
public class Simple2 {

  /** Main entry point. */
  public static void main(String args[]) throws ParseException {
    Simple2 parser = new Simple2(System.in);
    parser.Input();
  }

}

PARSER_END(Simple2)
//skip                     
SKIP :
{
//         
  " "
| "\t"
| "
" | "\r" } /** Root production. */ void Input() : {} {//EOF MatchedBraces() <EOF> } /** Brace matching production. */ void MatchedBraces() : {} { "{" [ MatchedBraces() ] "}" }

この例もいくつかの{}に一致しますが、最初の例とは異なり、入力した{と}の間に改行やスペースがあることに一致します.
 
第3例simple 3.jj
PARSER_BEGIN(Simple3)

/** Simple brace matcher. */
public class Simple3 {

  /** Main entry point. */
  public static void main(String args[]) throws ParseException {
    Simple3 parser = new Simple3(System.in);
    parser.Input();
  }

}

PARSER_END(Simple3)

SKIP :
{
  " "
| "\t"
| "
" | "\r" } //TOKEN , , TOKEN : {// LBRACE { token < : > <LBRACE: "{"> | <RBRACE: "}"> } /** Root production. */ void Input() : // count { int count; } { //count MatchedBraces , java count=MatchedBraces() <EOF> // java , { System.out.println("The levels of nesting is " + count); } } /** Brace counting production. */ int MatchedBraces() : //nested_count { int nested_count=0; } { // {}* nested_count {} <LBRACE> [ nested_count=MatchedBraces() ] <RBRACE> // java { return ++nested_count; } }

 simple3.jjは、入力テキストストリームに何個の{}列が含まれているかを計算する
 
4つ目の例:
PARSER_BEGIN(IdList)


/** ID lister. */
public class IdList {

  /** Main entry point. */
  public static void main(String args[]) throws ParseException {
    IdList parser = new IdList(System.in);
    parser.Input();
  }

}

PARSER_END(IdList)
//         
SKIP :
{
  " "
| "\t"
| "
" | "\r" } // id , TOKEN TOKEN : { < Id: ["a"-"z","A"-"Z"] ( ["a"-"z","A"-"Z","0"-"9"] )* > } /** Top level production. */ void Input() : {} {// EOF ( <Id> )+ <EOF> }

5つ目の例
PARSER_BEGIN(NL_Xlator)

/** New line translator. */
public class NL_Xlator {

  /** Main entry point. */
  public static void main(String args[]) throws ParseException {
    NL_Xlator parser = new NL_Xlator(System.in);
    parser.ExpressionList();
  }

}

PARSER_END(NL_Xlator)

SKIP :
{
  " "
| "\t"
| "
" | "\r" } TOKEN : { //ID < ID: ["a"-"z","A"-"Z","_"] ( ["a"-"z","A"-"Z","_","0"-"9"] )* > | //NUM < NUM: ( ["0"-"9"] )+ > } /** Top level production. */ void ExpressionList() : {// s String s; } { // java , { System.out.println("Please type in an expression followed by a \";\" or ^D to quit:"); System.out.println(""); } // ";" ( s=Expression() ";" {// java System.out.println(s); System.out.println(""); System.out.println("Please type in another expression followed by a \";\" or ^D to quit:"); System.out.println(""); } )* <EOF> } /** An Expression. */ String Expression() : {// vector s java.util.Vector termimage = new java.util.Vector(); String s; } { s=Term() {//java termimage.addElement(s); } ( "+" s=Term() { termimage.addElement(s); } )* { if (termimage.size() == 1) { return (String)termimage.elementAt(0); } else { s = "the sum of " + (String)termimage.elementAt(0); for (int i = 1; i < termimage.size()-1; i++) { s += ", " + (String)termimage.elementAt(i); } if (termimage.size() > 2) { s += ","; } s += " and " + (String)termimage.elementAt(termimage.size()-1); return s; } } } /** A Term. */ String Term() : { java.util.Vector factorimage = new java.util.Vector(); String s; } { //s Factor token , factorimage s=Factor() { factorimage.addElement(s); } ( "*" s=Factor() { factorimage.addElement(s); } )* { if (factorimage.size() == 1) { return (String)factorimage.elementAt(0); } else { s = "the product of " + (String)factorimage.elementAt(0); for (int i = 1; i < factorimage.size()-1; i++) { s += ", " + (String)factorimage.elementAt(i); } if (factorimage.size() > 2) { s += ","; } s += " and " + (String)factorimage.elementAt(factorimage.size()-1); return s; } } } /** Factor TOKEN */ String Factor() : { Token t; String s; } { t=<ID> { //t.image t , t <ID> “ABCD” t.image “ABCD” return t.image; } | t=<NUM> { return t.image; } | "(" s=Expression() ")" { return s; } }