2014-03-28 4 views
1

C의 하위 집합에 대한 컴파일러를 만들어야하고 JFlex 및 컵을 사용하기로 결정했습니다. 그러나 .jflex 파일을 만들면 JFlex로 제대로 컴파일되지만 출력 (.java 파일)은 컴파일되지 않습니다.컴파일 할 JFlex 출력을 얻을 수 없습니다.

디렉토리는 다음 follwing을

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 

Basicly가 그것이 알고하지 않습니다 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

sym 클래스는 일반적으로 CUP로하지 JFlex에 의해 생성됩니다. 생성 된 클래스의 기호는 .cup 파일에 정의한 모든 터미널을 기반으로합니다. sym 클래스를 사용하려면 해당 기호가 모두 들어있는 .cup 파일을 만들거나 당분간 클래스를 수동으로 만들어야합니다.

+0

오 오케이! 정말 고마워요. Flex와 Bison tbh보다 훨씬 복잡합니다. 하지만 내가 관리 할게! 답장 해주셔서 매우 감사합니다! –

관련 문제