【问题标题】:Linking CUP and jflex连接 CUP 和 jflex
【发布时间】:2015-03-10 19:58:30
【问题描述】:

我正在尝试使用
http://www2.cs.tum.edu/projects/cup/examples.php
http://www.cs.princeton.edu/~appel/modern/java/CUP/manual.html
http://jflex.de/manual.html

的帮助来链接我的 parser.java 和 yylex.java

但我收到了这些错误。

错误: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: 警告: [deprecation] lr_parser 中的 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: 警告: [deprecation] lr_parser 中的 lr_parser(Scanner) 已被 不推荐使用的公共解析器(java.io.Reader 输入){ super(new Yylex(输入)); }
^ Parser.java:137: 警告:[cast] 冗余转换为 Object Object start_val = (对象)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
^ Yylex.java:12: 错误:Yylex 不是抽象的,不会覆盖 Scanner 中的抽象方法 next_token()
public 类 Yylex 实现 java_cup.runtime.Scanner { ^
Yylex.java:474: 错误:Yylex 中的 next_token() 无法在 Scanner 中实现 next_token()
public int next_token() throws java.io.IOException {
^ 返回类型 int 与 Symbol
Yylex.java:631 不兼容:错误:不兼容的类型
{ return new java_cup.runtime.Symbol(sym.EOF); }
^ 必需:int
发现:符号
3 个错误
4 个警告

【问题讨论】:

    标签: java flex-lexer jflex cup


    【解决方案1】:

    问题是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 开关的设置。

    解决方案:从mini.jflex 中删除%type int 指令(并使用cup 的java_cup.runtime.Symbol)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多