もう少しJavaCCを使って、
class A { } と、class B { } をいう文字列を受け付けるようなプログラムを作ってみた。これも簡単にできてしまう。
BNF記法で記述すると、
<program> :::= <clazz> <name> <cstart> < cend>
<clazz> ::= “class”
<name> ::= “A” | “B”
<cstart> ::= “{“
<cend> ::= “}”
/**
** MiniP
**/
PARSER_BEGIN(Minip)
public class Minip {
public static void main(String args[]) throws ParseException {
Minip parser = new Minip(System.in);
parser.Start();
}
}
PARSER_END(Minip)
SKIP :
{
” “|”r”|”n”
}
TOKEN :
{
< CLASS: “class” >
| < A: “A” >
| < B: “B” >
| < CLASSSTART: “{” >
| < CLASSEND: “}” >
}
void Start() :
{}
{
clazz()
className()
classStart()
classEnd() { System.out.println(“…done”); }
}
void clazz() :
{}
{
<CLASS> { System.out.println(“class info”); }
}
void className() :
{}
{
<A> { System.out.println(” name : A”); }
| <B> { System.out.println(” name : B”); }
}
void classStart() :
{}
{
<CLASSSTART> { System.out.println(” start”); }
}
void classEnd() :
{}
{
<CLASSEND> { System.out.println(” end”); }
}
** MiniP
**/
PARSER_BEGIN(Minip)
public class Minip {
public static void main(String args[]) throws ParseException {
Minip parser = new Minip(System.in);
parser.Start();
}
}
PARSER_END(Minip)
SKIP :
{
” “|”r”|”n”
}
TOKEN :
{
< CLASS: “class” >
| < A: “A” >
| < B: “B” >
| < CLASSSTART: “{” >
| < CLASSEND: “}” >
}
void Start() :
{}
{
clazz()
className()
classStart()
classEnd() { System.out.println(“…done”); }
}
void clazz() :
{}
{
<CLASS> { System.out.println(“class info”); }
}
void className() :
{}
{
<A> { System.out.println(” name : A”); }
| <B> { System.out.println(” name : B”); }
}
void classStart() :
{}
{
<CLASSSTART> { System.out.println(” start”); }
}
void classEnd() :
{}
{
<CLASSEND> { System.out.println(” end”); }
}