0


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 は抽象的ではなく、スキャナーの抽象メソッド 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 の lr_parser() は非推奨になりました public Parser() {super();}
^ Parser.java:22: 警告: [非推奨] lr_parser の lr_parser(Scanner) は非推奨になりましたpublic Parser(java_cup.runtime.Scanner s) {super(s);}
^ Parser.java:96: 警告: [非推奨] lr_parser の lr_parser(Scanner) は非推奨になりました public Parser (java.io.Reader input) { super (新しい Yylex(入力)); }
^ Parser.java:137: 警告: [キャスト] Object への冗長なキャスト Object start_val = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value ;
^ Yylex.java:12 :エラー: Yylex は抽象化されておらず、スキャナー
の public クラスの抽象メソッド next_token() をオーバーライドしていません Yylex はjava_cup.runtime.Scanner を実装しています() in Scanner public int next_token() throws java.io.IOException { ^ return type int is not compatible with Symbol Yylex.java:631: error: incompatible types { return new java_cup.runtime.Symbol(sym.EOF); } ^ 必須: int検出: シンボル3 エラー4 警告









4

1 に答える 1

2

問題は、次のnext_token()理由でコンパイルされないことです。

戻り型 int は Symbol と互換性がありません

Yylex.java:631: エラー: 互換性のない型
{ return new java_cup.runtime.Symbol(sym.EOF); }
^ 必須: int
検出: シンボル

生成されたコードは

public int next_token() throws java.io.IOException {
...
if (c) {
  // sometimes returns a Symbol
  return new java_cup.runtime.Symbol(sym.EOF);
} else {
  // sometimes returns an int
  return sym.identifier;
}

ドキュメントから:

この%typeディレクティブは、%cupスイッチの設定をオーバーライドします。

解決策:%type intからディレクティブを削除しmini.jflexます (および cup の を使用しますjava_cup.runtime.Symbol)。

于 2015-04-12T17:01:04.053 に答える