2012-01-11 2 views
0

이것은 여러 개의 키워드로 된 간단한 인터프리터의 일부이기 때문에 다른 클래스로 만들었습니다. 이 프로그램은 ArrayList를 반복하고, 문자열을 토큰 화하고 KEYWORD + 지침으로 파싱합니다. 해시 맵을 사용하여 이러한 모든 키워드를 클래스가있는 인터페이스에 매핑합니다. 나머지 처리가 이루어지는 곳입니다. 현재 이러한 키워드 클래스 중 하나를 테스트하지만 컴파일러를 컴파일하려고하면 "식별자가 예상 됨"및 "형식이 잘못되었습니다"메시지가 throw됩니다. 모든 오류 메시지를 던지는 줄은 18 행입니다. 코드가 어색하게 움직이는 곳은 어디입니까? 전에 HashTable을 사용 해본 적이 없으므로 말할 수 없습니다. 도와 주셔서 감사합니다!자바 해시 테이블 오류 - 식별자가 예상되고 잘못된 유형의 시작입니까?

import java.util.*; 

public class StringSplit 
{ 
interface Directive //Map keywords to an interface 
{ 
    public void execute (String line); 
} 
    abstract class endStatement implements Directive 
    { 
     public void execute(String line, HashMap DirectiveHash) 
     { 
      System.out.print("TPL finished OK [" + " x lines processed]"); 
      System.exit(0); 
     } 
    } 
    private Map<String, Directive> DirectiveHash= new HashMap<String, Directive>(); 
    DirectiveHash.put("END", new endStatement()); 

    public static void main (String[]args) 
    { 
     List <String> myString= new ArrayList<String>(); 
     myString.add(new String("# A TPL HELLO WORLD PROGRAM")); 
     myString.add(new String("STRING myString")); 
     myString.add(new String("INTEGER myInt")); 
     myString.add(new String("LET myString= \"HELLO WORLD\"")); 
     myString.add(new String("PRINTLN myString")); 
     myString.add(new String("PRINTLN HELLO WORLD")); 
     myString.add(new String("END")); 


     for (String listString: myString)//iterate across arraylist 
     { 
       String[] line = listString.split("[\\s+]",2); 
       for(int i=0; i<line.length; i++) 
       { 
        System.out.println(line[i]); 
        Directive DirectiveHash=DirectiveHash.get(listString[0]); 
        DirectiveHash.execute(listString); 

       } 

     } 

    } 
} 
+0

어떤 줄에서 컴파일 오류가 발생합니까? 아마 좋은 출발점 일 겁니다. –

+0

18 번 라인에 오류가 있습니다. – Luinithil

+1

18 번 라인입니다. 18 번 라인은 무엇입니까? (예, 셀 수 있습니다. 어떤 줄이 실패했는지 알았을 때 전체 프로그램을 붙여 넣는 것은 다소 비생산적인 것이라고 지적하려고합니다.) –

답변

8

현재 컴파일러 오류가 발생하면 어떤 종류의 블록 안에 DirectiveHash.put("END", new endStatement()); 호출을 넣어야합니다. 인스턴스 이니셜 라이저에서 원한다면 다음을 시도하십시오.

{DirectiveHash.put ("END", new endStatement()); }

+3

'endStatement' 클래스가 추가 매개 변수로 정의하기 때문에'public void execute (String line);'을 구현하지 못한다는 또 다른 오류가 있습니다. 당신은 또한'abstract' 클래스이기 때문에 new endStatement()를 사용하여'abstract' 클래스를 인스턴스화 할 수 없습니다. – jbindel

2

변수 이름은 소문자로 시작해야합니다. DirectiveHash는 변수 이름으로 사용되며 클래스/인터페이스 이름은 대문자로 시작해야합니다.

+0

아니요, DirectiveHash는 변수 일뿐입니다. '지시어'는 인터페이스의 이름입니다. –

+0

고마워요, 그 코드는 쉽지 않았습니다! –

+0

그리고 그것은 여전히 ​​꽤 많은 문제를 일으 킵니다. 저의 요점은 다음과 같습니다. – wmorrison365

2

DirectiveHash.put("END", new endStatement());은 어떤 방법으로 사용해야합니다. 그리고 클래스 endStatement은 추상적이므로 new

0

추상 클래스를 인스턴스화하려고 시도하면 초기화 할 수 없습니다. new 연산자를 사용하여 추상 클래스를 인스턴스화 할 수 없습니다.

어쩌면 당신은 endStatement 클래스를 확장해야한다 (또한 로 이름을 바꿉니다)과

1

몇 가지 문제가 정직에 대한 구체적인 구현을 제공 :

  1. endStatement 올바르게으로 지침을 구현하지 않습니다 #execute 메서드 서명 이 일치하지 않습니다.

  2. endStatement가 추상이므로 (직접 인스턴스화 할 수 없음) 다음을 수행 할 수 없습니다.

    DirectiveHash.put("END", new endStatement()); 
    
  3. 이것은 블록 또는 방법 외부에서 수행 할 수 없습니다.

    DirectiveHash.put("END", new endStatement()); 
    
  4. 당신은 실제로 메인에 DirectiveHash를 초기화하지 : 당신은 일반적으로 생성자를 사용하십시오. 클래스의 인스턴스 변수이고 main은 정적 메소드입니다. main이 DirectiveHash를 사용하려면, 그것을 구하려면 StringSplit 클래스의 인스턴스가 있어야합니다.

  5. 다음 줄은 약간의 오해의 소지가 있습니다. 인스턴스 var name을 클래스 이름과 같게 지정하면됩니다. 법적이지만 지독하게 혼란스럽고 정말 나쁜 생각입니다. 실제로이 경우에는 #main에서 DirectoryHash를 인스턴스화하지 않았으므로 더욱 문제가 있습니다. 따라서 ivar 디렉토리 해시 (혼돈을 막기 위해)가 지시어로 설정되고 "DirectiveHash = DirectiveHash.get (...)"에 대한 후속 호출이 존재하지 않는 Directive # get 호출을 의미하므로 깨집니다."listString [0]"로 잘못

    Directive DirectiveHash=DirectiveHash.get(listString[0]); 
    
  6. 다음 라인은 무효이다. listString을 배열이 아니라 for() 루프에있는 String으로 선언했습니다.

    Directive DirectiveHash=DirectiveHash.get(listString[0]); 
    
  7. 귀하의 총액은 ... 더 rigourous 할 메소드 이름과 바르하기위한 클래스와 인터페이스와 소문자 이니셜 초기 캡을 사용해야합니다.

글쎄, 그건 당신이 컴파일러 인터뷰 중 하나와 같았습니다. 나는 그것에 대해 이미 너무 유감스럽게 게시 된 것을 본다. ... 일부도 놓칠 수

당신은 이러한 문제의 일부 주위를 읽어 들일 필요가 있습니다 : 인스턴스 메소드 대

  • 생성자
  • 정적 메소드
  • 구현 인터페이스의
  • 목적/사용 추상 클래스