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); }
오 오케이! 정말 고마워요. Flex와 Bison tbh보다 훨씬 복잡합니다. 하지만 내가 관리 할게! 답장 해주셔서 매우 감사합니다! –