LOOKAHEAD、規則を記述 再び

任意の規則が書けるのかな?

PARSER_BEGIN(Test)

import java.io.*;

public class Test {
  public static void main(String args[]) throws ParseException {
    Test parser = new Test(System.in);
    parser.Input();
  }
}

PARSER_END(Test)

SKIP :
{
    <SPACE:  " " | "\t" | "\n" | "\r">
}

TOKEN :
{
      <A: "a">
    | <B: "b">
    | <C: "c">
    | <D: "d">
}

void Input() :
{}
{
    (  LOOKAHEAD( (<A> <B> | <B> <C>) ) abc()
     |                                  abd())+
}

void abc() :
{}
{
      <A> <B> <C> { System.out.println("*ABC*"); }
    | <B> <C>     { System.out.println("*BC*"); }
}

void abd() :
{}
{
    <A> <D> { System.out.println("*AD*"); }
}

で、

abc
*ABC*
bc
*BC*
ad
*AD*

「(< A > < B > | < B > < C >)」は「< A > < B >」と「< B > < C >」のつもり