2017-02-01 2 views
1

컴파일러의 어휘 분석을 테스트하고 있습니다. JFLEX 안에 minijava.jflex 파일이 있습니다. 나는 minijava.jflex 내부에이 코드를 가지고 : 컴파일러를 만들 때 주 클래스 스캐너를 찾을 수 없거나로드 할 수 없습니다.

import java_cup.runtime.*; 
%% 
%public 
%class Scanner 
%implements sym 
%unicode 
%line 
%column 
%cup 
%debug 
%{ 
    StringBuffer string = new StringBuffer(); 
    private Symbol symbol(int type) { 
    return new Symbol(type, yyline, yycolumn); 
    } 
    private Symbol symbol(int type, Object value) { 
    return new Symbol(type, yyline, yycolumn, value); 
    } 
%} 
/* main character classes */ 
LineTerminator = \r|\n|\r\n 
InputCharacter = [^\r\n] 
WhiteSpace = {LineTerminator} | [ \t\f] 
/* comments */ 
Comment = {TraditionalComment} | {EndOfLineComment} | 
      {DocumentationComment} 
TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" 
EndOfLineComment = "//" {InputCharacter}* {LineTerminator}? 
DocumentationComment = "/*" "*"+ [^/*] ~"*/" 
/* identifiers */ 
Identifier = [:jletter:][:jletterdigit:]* 
/* integer literals */ 
DecIntegerLiteral = 0 | [1-9][0-9]* 
/* floating point literals */   
FloatLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? 
FLit1 = [0-9]+ \. [0-9]* 
FLit2 = \. [0-9]+ 
FLit3 = [0-9]+ 
Exponent = [eE] [+-]? [0-9]+ 
/* string and character literals */ 
StringCharacter = [^\r\n\"\\] 
SingleCharacter = [^\r\n\'\\] 
%state STRING, CHARLITERAL 
%% 
<YYINITIAL> { 
    /* keywords */ 
    "boolean"      { return symbol(BOOLEAN); } 
    "char"       { return symbol(CHAR); } 
    "class"       { return symbol(CLASS); } 
    "else"       { return symbol(ELSE); } 
    "extends"      { return symbol(EXTENDS); } 
    "float"       { return symbol(FLOAT); } 
    "int"        { return symbol(INT); } 
    "new"        { return symbol(NEW); } 
    "if"        { return symbol(IF); } 
    "public"      { return symbol(PUBLIC); } 
    "super"      { return symbol(SUPER); } 
    "return"      { return symbol(RETURN); } 
    "void"       { return symbol(VOID); } 
    "while"      { return symbol(WHILE); } 
    "this"        { return symbol(THIS); } 
    /* boolean literals */ 
    "true"       { return symbol(BOOLEAN_LITERAL, new Boolean(true)); } 
    "false"      { return symbol(BOOLEAN_LITERAL, new Boolean(false)); } 
    /* null literal */ 
    "null"       { return symbol(NULL_LITERAL); } 
    /* separators */ 
    "("        { return symbol(LPAREN); } 
    ")"        { return symbol(RPAREN); } 
    "{"        { return symbol(LBRACE); } 
    "}"        { return symbol(RBRACE); } 
    "["        { return symbol(LBRACK); } 
    "]"        { return symbol(RBRACK); } 
    ";"        { return symbol(SEMICOLON); } 
    ","        { return symbol(COMMA); } 
    "."        { return symbol(DOT); } 
    /* operators */ 
    "="        { return symbol(EQ); } 
    ">"        { return symbol(GT); } 
    "<"        { return symbol(LT); } 
    "!"        { return symbol(NOT); } 
    "?"        { return symbol(QUESTION); } 
    ":"        { return symbol(COLON); } 
    "=="        { return symbol(EQEQ); } 
    "<="        { return symbol(LTEQ); } 
    ">="        { return symbol(GTEQ); } 
    "!="        { return symbol(NOTEQ); } 
    "&&"        { return symbol(ANDAND); } 
    "&"    { return symbol(AT); } 
    "||"        { return symbol(OROR); } 
    "+"        { return symbol(PLUS); } 
    "-"        { return symbol(MINUS); } 
    "*"        { return symbol(MULT); } 
    "/"        { return symbol(DIV); } 
    "%"        { return symbol(MOD); } 
    /* string literal */ 
    \"        { yybegin(STRING); string.setLength(0); } 
    /* character literal */ 
    \'        { yybegin(CHARLITERAL); } 
    /* numeric literals */ 
    {DecIntegerLiteral}   { return symbol(INTEGER_LITERAL, new Integer(yytext())); } 
    {FloatLiteral}     { return symbol(FLOATING_POINT_LITERAL, new Float(yytext().substring(0,yylength()))); } 
    /* comments */ 
    {Comment}      { /* ignore */ } 
    /* whitespace */ 
    {WhiteSpace}     { /* ignore */ } 
    /* identifiers */ 
    {Identifier}     { return symbol(IDENTIFIER, yytext()); } 
} 
<STRING> { 
    \"        { yybegin(YYINITIAL); return symbol(STRING_LITERAL, string.toString()); } 
    {StringCharacter}+    { string.append(yytext()); } 
    /* escape sequences */ 
    "\\b"        { string.append('\b'); } 
    "\\t"        { string.append('\t'); } 
    "\\n"        { string.append('\n'); } 
    "\\f"        { string.append('\f'); } 
    "\\r"        { string.append('\r'); } 
    "\\\""       { string.append('\"'); } 
    "\\'"        { string.append('\''); } 
    "\\\\"       { string.append('\\'); } 
    /* error cases */ 
    \\.       { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); } 
    {LineTerminator}    { throw new RuntimeException("Unterminated string at end of line"); } 
} 
<CHARLITERAL> { 
    {SingleCharacter}\'   { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character(yytext().charAt(0))); } 
    /* escape sequences */ 
    "\\b"\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\b'));} 
    "\\t"\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\t'));} 
    "\\n"\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\n'));} 
    "\\f"\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\f'));} 
    "\\r"\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\r'));} 
    "\\\""\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\"'));} 
    "\\'"\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\''));} 
    "\\\\"\'      { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\\')); } 
    /* error cases */ 
    {LineTerminator}    { throw new RuntimeException("Unterminated character literal at end of line"); } 
} 
/* error fallback */ 
.|\n        { return symbol(ILLEGAL_CHARACTER, yytext());} 
<<EOF>>       { return symbol(EOF); } 

가 그럼 난 jflex 및 유형 찾아이 파일 minijava.jflex을 찾아 이동합니다. 나는 그것으로부터 코드를 생성하고 Scanner 파일은 miniflex.java와 같은 디렉토리에 생성된다. 이 파일 Scanner.java와 sym.java를 JFLEX의 src 폴더 안에 넣었습니다.

Could not find or load main class Scanner 

내가 파일 sym.java을 수정해야하며, 추가 단말기 각각에 대해 상수를 삽입하는 곳 읽기 :이 오류를 찾을 수 끝에

javac Scanner.java 
       javac sym.java 
       java Scanner example.java 

: 는 그럼 다음 명령을 쓰기 minijava.jflex에서,하지만 그 충고를 적용하는 방법을 모르겠습니다.

답변

0

기본적으로 파일은 Scanner 클래스의 파서 코드로 변환됩니다. 그러나 생성 된 코드에는 "main"메소드가 포함되지 않습니다. 그러나 마치 코드가 Scanner 코드의 주된 메소드 인 것처럼 코드를 실행하려고합니다.

당신은 사용Scanner 클래스에가는 코드를 작성해야하고, 당신이 그것을 실행할 수 있도록 그 코드는 main 방법이 필요합니다.

강의 노트, Java 텍스트 북, Java 자습서로 돌아가서 Java 프로그램 실행 방법의 기본 사항을 읽어보십시오. 주요한 방법은 무엇이며 그 중요성은 무엇입니까?

:

또는이 Q & 읽기

관련 문제