JFlex + byaccj упражнение не работает правильно

Прежде всего, извините за мой плохой английский, но я не родной.

Я изучаю jflex и byaccj в университете, и я сделал простое упражнение, чтобы узнать, как все работает.

У меня есть файл test.xml, подобный этому:

<collezione_film><film></film></collezione_film>

Мое упражнение

%%
%byaccj

%{

 private Parser yyparser;
 public Yylex(java.io.Reader r, Parser yyparser) {
   this(r);
   this.yyparser = yyparser;
 }
%}

%x IN_GROUP IN_PROPERTY

%state COLLEZIONE_FILM

TAG_COLLEZIONE_FILM_START = <collezione_film>
TAG_FILM_OPEN_START = <film+[ \t]
%%

<YYINITIAL> {
  {TAG_COLLEZIONE_FILM_START} {
    yyparser.yylval = new ParserVal("collezione_film");
    yybegin(COLLEZIONE_FILM);
    return Parser.TAG_START;
  }
  [^] { /* Non fare nulla */ }
}

<COLLEZIONE_FILM> {
  {TAG_FILM_OPEN_START} {
    yyparser.yylval = new ParserVal("film");
    return Parser.TAG_START;
  }
  [^] { /* Non fare nulla */ }
}

и мое упражнение.

%token<sval> TAG_START
%type<sval> tags

%%

config :    tags { System.out.print($1); }

tags :      TAG_START tags { 
                $$ = $1 + " " + $2;
            }
            | TAG_START { $$ = $1; }
            ; 

%%

private Yylex lexer;
private int yylex () {
  int yyl_return = -1;
  try {
    yylval = new ParserVal(0);
    yyl_return = lexer.yylex();
  }
  catch (java.io.IOException e) {
    System.err.println("IO error :"+e);
  }
  return yyl_return;
}

public void yyerror (String error) {
  System.err.println ("Error: " + error);
}

public Parser(java.io.Reader r) {
  lexer = new Yylex(r, this);
}

public static void main(String args[]) throws java.io.IOException {
  Parser yyparser;
  if ( args.length > 0 ) {
    yyparser = new Parser(new java.io.FileReader(args[0]));
    yyparser.yyparse();
  }
  else {
    System.out.println("Nessun file specificato.");
  }
}

Я понимаю, что вы не можете использовать этот код в более общем примере, но мой вопрос таков: почему анализатор в этом конкретном примере (см. Test.xml) печатает только "collezione_film", а не "collezione_film film"? Что мне не хватает?

0 ответов

Другие вопросы по тегам