getNextToken() による読み飛ばし

PARSER_BEGIN(Test)

import java.io.*;

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

    while (true) {
      try {
        parser.Input();
      } catch (ParseException e) {
        System.out.println(e.getMessage());
      }
    }
  }
}

PARSER_END(Test)

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

TOKEN :
{
    <A: "a"> |
    <B: "b"> |
    <C: "c"> |
    <SM: ";">
}

void Input() :
{}
{
    try {
        (<A> <B> <C> <SM> { System.out.println("*ABC*"); })+
    } catch (ParseException e) {
        Token t;

        System.out.println(e.getMessage());
        do {
            t = getNextToken();
        } while (t.kind != SM && t.kind != EOF);
    }
}

で、

abc;abccc;abc;
*ABC*
Encountered "c" at line 1, column 8.
Was expecting:
    ";" ...

*ABC*
  • C-d を入力すると凍りついてしまう。どういう状況か不明…
  • ungetc みたいにトークンを戻す手段はないの?捨てられないトークンがある場合はどうしたら?先読みと併用???