JFlex + byaccj练习无法正常工作

时间:2017-01-16 10:57:07

标签: yacc lex jflex

首先,抱歉我的英语不好,但我不是本地人。

我在大学学习jflex和byaccj,我做了一个简单的练习来学习如何运作。

我有一个像这样的test.xml文件:

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

我的exercise.flex是

%%
%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 */ }
}

和我的exercise.y是

%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)仅打印&#34; collezione_film&#34;而不是&#34; collezione_film电影&#34;?我错过了什么?

0 个答案:

没有答案