我正在尝试使用
http://www2.cs.tum.edu/projects/cup/examples.php
http://www.cs.princeton.edu/~appel/的帮助来链接我的 parser.java 和 yylex.java现代/java/CUP/manual.html
http://jflex.de/manual.html
但我收到了这些错误。
错误:Yylex 不是抽象的,并且不会覆盖 Scanner 中的抽象方法 next_token()
错误:Yylex 中的 next_token() 无法在 Scanner 中实现 next_token()
如何解决它们?
我的 mini.flex 文件是:
import java.io.*;
%%
%public
%cup
%line
%column
%type int
identifier = {letter} ( {letter} | {decimal_digit} )*
letter = [a-z] | "_"
decimal_digit = [0-9]
LineTerminator = \r|\n|\r\n
WhiteSpace = {LineTerminator} | [ \t\f]
Comment = {GeneralComment} | {LineComment}
GeneralComment = "/*"([^*]|\*+[^*/])*\*+"/"
LineComment = "//" {LineTerminator}?
%%
<YYINITIAL> {
"break" { return sym.breakd; }
"default" { return sym.defaultd; }
}
<YYINITIAL> {
{identifier} { return sym.identifier; }
}
<YYINITIAL> {
"+" {return sym.plus_op;}
"&" {return sym.amp_op;}
}
<YYINITIAL> {
{Comment} { /* ignore */ }
\n { }
{WhiteSpace} { /* ignore */ }
[^] { /*Illegeal Character*/ }
}
我的 mini.cup 文件是:
// import java-cup-11b-runtime.*;
import java_cup.runtime.*;
parser code {: public Parser (java.io.Reader input) { super(new Yylex(input)); } :};
/* Preliminaries to set up and use the scanner. */
/*init with {: scanner.init(); :};
scan with {: return scanner.next_token(); :};*/
terminal identifier;
terminal breakd, defaultd, plus_op, amp_op;
non terminal SourceFile, UnaryExpr, Expression, Statement, SimpleStmt, EmptyStmt, ExpressionStmt, unary_op;
precedence left plus_op;
Expression ::= UnaryExpr | Expression plus_op UnaryExpr;
UnaryExpr ::= unary_op identifier;
unary_op ::= plus_op | amp_op;
Statement ::= SimpleStmt;
SimpleStmt ::= EmptyStmt | ExpressionStmt;
EmptyStmt ::= ; // should be Empty
ExpressionStmt ::= Expression;
SourceFile ::= Statement;
我编译使用:
java -jar java-cup-11b.jar -interface -parser Parser mini.cup
jflex mini.flex
javac -cp java-cup-11b-runtime.jar:. -Xlint *.java
抛出的错误是:
Parser.java:19:警告:lr_parser 中的 [deprecation] lr_parser() 已弃用 public Parser() {super();}
^ Parser.java:22:警告:lr_parser 中的 [deprecation] lr_parser(Scanner) 已弃用public Parser(java_cup.runtime.Scanner s) {super(s);}
^ Parser.java:96: 警告:lr_parser 中的 [deprecation] lr_parser(Scanner) 已被弃用 public Parser (java.io.Reader input) { super (新的 Yylex(输入));}
^ Parser.java:137: 警告:[cast] 冗余转换为 Object Object start_val = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value ;
^ Yylex.java:12 :错误: Yylex 不是抽象的并且不会覆盖 Scanner
公共类中的抽象方法next_token () () in Scanner public int next_token() throws java.io.IOException { ^ return type int is not compatible with Symbol Yylex.java:631: error: in compatible types { return new java_cup.runtime.Symbol(sym.EOF); } ^ 必需:找到 int :符号3 个错误4 个警告