首先,抱歉我的英语不好,但我不是本地人。
我在大学学习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;?我错过了什么?