2014-03-28 58 views
1

我必须为C的一个子集做一个编译器,我决定使用JFlex和Cup。但是,当我创建.jflex文件时,它使用JFlex进行编译,但输出(.java文件)不会编译。无法获得JFlex输出来编译

目录:

src: 
    Lexer.java 
    makefile 
    jflex.jar 
    cup.jar 
    tinyc.jflex 

所以我执行的命令是在follwing:

jflex tinyc.jflex 
javac -cp ".:cup.jar:jflex.jar" Lexer.java 

我不断收到以下错误:

Lexer.java:640: error: cannot find symbol 
      { return new symbol(sym.NOT); 
        ^
    symbol: class symbol 
    location: class Lexer 

Lexer.java:640: error: cannot find symbol 
      { return new symbol(sym.NOT); 
          ^
    symbol: variable sym 
    location: class Lexer 

Basicly它不知道的我想应该是上课。我试图通过以下示例获得基本版本,但我只是不管理。任何指针?

编辑:

我从JFlex的手动输入的例子,并试图编译之一,但它给了我同样的错误也是如此。所以我一定在做错事。任何指针?

tinyc.jflex:

import java_cup.runtime.*; 
import java.io.FileInputStream; 
import java.io.InputStream; 



%% 
%class Lexer 
%cup 
%line 
%column 
%unicode 

%{ 
    StringBuffer string = new StringBuffer(); 

    private Symbol symbol(int type) { 
    return new Symbol(type, yyline, yycolumn); 
    } 

    private Symbol symbol(int type, Object val) { 
    return new Symbol(type, yyline, yycolumn, val); 
    } 

%} 

digit  = [0-9] 
alpha  = [a-zA-Z_] 
alphanum = [A-Za-z0-9] 
symbol  = [_] 
identifier = {alpha}+({alphanum}|{symbol})* 

sl_comment = "//".* 
ml_comment = "/*"((.*?)|[\n]*)*"*/" 
commment = {sl_comment} | {ml_comment} 

%% 
"int"     { return new symbol(sym.INTEGER);} 
"char"     { return new symbol(sym.CHAR);} 
"return"    { return new symbol(sym.RETURN);} 
"if"     { return new symbol(sym.IF); } 
"else"     { return new symbol(sym.ELSE); } 
"while"     { return new symbol(sym.WHILE); } 
"do"     { return new symbol(sym.DO); } 
"length"    { return new symbol(sym.LENGTH); } 
"write"     { return new symbol(sym.WRITE); } 
"read"     { return new symbol(sym.READ); } 

","      { return new symbol(sym.COMMA); } 
";"      { return new symbol(sym.SEMICOLON); } 

"+"      { return new symbol(sym.ADD); } 
"-"      { return new symbol(sym.MIN); } 
"*"      { return new symbol(sym.MUL); } 
"/"      { return new symbol(sym.DIV); } 
"("      { return new symbol(sym.LPAR); } 
")"      { return new symbol(sym.RPAR); } 
"["      { return new symbol(sym.LRBACK); } 
"]"      { return new symbol(sym.RBACK); } 
"{"      { return new symbol(sym.LBRACE); } 
"}"      { return new symbol(sym.RBRACE); } 


">"      { return new symbol(sym.GREATER); } 
"<"      { return new symbol(sym.LESS); } 
"!="     { return new symbol(sym.NEQ); } 
"=="     { return new symbol(sym.EQU); } 

"!"      { return new symbol(sym.NOT); } 
"="      { return new symbol(sym.ASSIGN); } 

{identifier}   { return new symbol(sym.NAME, yytext()); } 
{digit}+    { return new symbol(sym.NUMBER, new Integer(Integer.parseInt(yytext()))); } 

{commment}    { yyline += countLines(yytext()); } 

[\n]     { ++yyline; } 
[\r\t\f\ ]+    { } 
.      { System.err.println("unexpected char " + yytext() + " !\n"); System.exit(0); } 

回答

1

sym类通常产生由CUP,而不是由JFlex的。生成的类中的符号基于您在.cup文件中定义的所有终端。为了能够使用sym类,您必须使用所有相应的符号创建.cup文件,或者只需暂时手动创建该类。

+0

哦,好的!感谢这:)这真的比Flex和Bison tbh更复杂。但我会管!非常感谢您的回复! –