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の文法過程を深く理解することができます.最初の例を見てみましょう
これはsimple 1です.jjの簡単な例では、このjavaccはjjまたはjjt記述ファイルから構成されています.彼は一般的にoption部分に分けられ、本体部分はclass定義のjavaに相当するクラスであり、token部分であり、上の関数は主にマッチング数{}です.
例えば「{}」,「{{{}}}}}}}}}」
第2例simple 2.jj
この例もいくつかの{}に一致しますが、最初の例とは異なり、入力した{と}の間に改行やスペースがあることに一致します.
第3例simple 3.jj
simple3.jjは、入力テキストストリームに何個の{}列が含まれているかを計算する
4つ目の例:
5つ目の例
私たちは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;
}
}