2015-03-10 3 views
0

Я пытаюсь связать свою parser.java и yylex.java используя помощь
http://www2.cs.tum.edu/projects/cup/examples.php
http://www.cs.princeton.edu/~appel/modern/java/CUP/manual.html
http://jflex.de/manual.htmlLinking CUP и jflex

Но я получаю эти ошибки.

error: Yylex is not abstract and does not override abstract method next_token() in Scanner

error: next_token() in Yylex cannot implement next_token() in Scanner

Как их решить?

Мой 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: warning: [deprecation] lr_parser() in lr_parser has been deprecated public Parser() {super();}
^Parser.java:22: warning: [deprecation] lr_parser(Scanner) in lr_parser has been deprecated public Parser(java_cup.runtime.Scanner s) {super(s);}
^Parser.java:96: warning: [deprecation] lr_parser(Scanner) in lr_parser has been deprecated public Parser (java.io.Reader input) { super(new Yylex(input)); }
^Parser.java:137: warning: [cast] redundant cast to Object Object start_val = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
^Yylex.java:12: error: Yylex is not abstract and does not override abstract method next_token() in Scanner
public class Yylex implements java_cup.runtime.Scanner { ^
Yylex.java:474: error: next_token() in Yylex cannot implement next_token() 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); }
^required: int
found: Symbol
3 errors
4 warnings

+1

Показать Ваш код. – tnw

ответ

1

Проблема заключается в том, что next_token() не компилируется, потому что:

return type int is not compatible with Symbol

и

Yylex.java:631: error: incompatible types
{ return new java_cup.runtime.Symbol(sym.EOF); }
^required: int
found: Symbol

Сгенерированный код

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; 
} 

Из документации:

The %type directive overrides settings of the %cup switch.

Решение: Удалить директиву %type int от mini.jflex (и использовать чашку java_cup.runtime.Symbol).

 Смежные вопросы

  • Нет связанных вопросов^_^