无法获得JFlex输出进行编译

时间:2014-03-28 16:12:04

标签: jflex

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

目录:

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

所以我执行的命令是以下内容:

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

基本上,我认为它不知道sym类。我试图通过以下示例获得基本版本,但我只是不管理。有什么指针吗?

编辑:

我输入了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 个答案:

答案 0 :(得分:1)

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