2013-04-21 3 views
-1

Tokeniser가 생성 한 토큰 목록이 있습니다.다음 및 이전 속성 설정

List<Token> tokenList = new List<Token>(); 

여기 토큰 클래스가 있습니다.

public class Token 
{ 
    public Tokens TokenName { get; set; } 

    public string TokenValue { get; set; } 

    public Token Previous { 
     get; set; 
    } 

    public Token Next { 
     get; set; 
    } 

    public Token(Tokens name, string value) 
    { 
     TokenName = name; 
     TokenValue = value; 
    } 
} 

는 그리고 목록의 각 토큰의 NextPrevious 속성을 설정하지만, NEWLINE 또는 WHITESPACE 또는 TABSPACE 토큰을 지적하지만, 그들의 다음 사람을 사용하도록 않도록해야합니다.

여기 내 코드가 있습니다.

Token token = null; 

foreach (Token tkn in tokenList) 
{ 
    if (token != null) 
    { 
     switch (token.TokenName) 
     { 
      case Tokens.NEWLINE: 
      case Tokens.WHITESPACE: 
      case Tokens.TABSPACE: 
       break; 
      default: 
       switch (tkn.TokenName) 
       { 
        case Tokens.NEWLINE: 
        case Tokens.WHITESPACE: 
        case Tokens.TABSPACE: 
         break; 
        default: 
         tkn.Previous = token; 
         token.Next = tkn; 
         token = tkn; 
         break; 
       } 
       break; 
     } 
    } 
    else 
    { 
     token = tkn; 
    } 
} 

그러나 작동하지 않는 것 같습니다. 어떤 도움을 주시겠습니까?

+2

코드가 정확히 어떻게 작동하지 않습니까? 그것은 무엇을 하는가? – svick

+0

속성은 항상 WhiteSpace 토큰을 참조합니다. –

+1

이 코드는 의미가 없습니다. 예를 들어, 변수 이름 토큰을 설정하는 루프가 있고 때로는 그렇지 않을 수도 있습니다. 그러나이 값으로는 아무런 효과가 없습니다. 정확히이 루프의 요점은 무엇입니까? 정확히 무엇을하려고하는지 설명하십시오. – Hogan

답변

-1

고객님의 문제를 개선하기 바랍니다. 확인해주세요

class Program 
{ 
    public enum TokenName { NEWLINE, WHITESPACE, TABSPACE, A, B, C}; 
    public class Token 
    { 
     public TokenName TokenName { get; set; } 
     public string TokenValue { get; set; } 

     public Token Previous 
     { 
      get; 
      set; 
     } 

     public Token Next 
     { 
      get; 
      set; 
     } 

     public Token(TokenName name, string value) 
     { 
      TokenName = name; 
      TokenValue = value; 
     } 
    } 

    static void Main(string[] args) 
    { 
     int count = 0, j=0; 
     Token tkn = null; 
     List<Token> tokenList = new List<Token>(); 

     tokenList.Add(new Token(TokenName.NEWLINE, "7")); 
     tokenList.Add(new Token(TokenName.A, "1")); 
     tokenList.Add(new Token(TokenName.B, "2")); 
     tokenList.Add(new Token(TokenName.TABSPACE, "5")); 
     tokenList.Add(new Token(TokenName.C, "3")); 
     tokenList.Add(new Token(TokenName.WHITESPACE, "8")); 

     foreach (Token tken in tokenList) 
     { 
      Console.WriteLine(tken.TokenName.ToString() +" "+ tken.TokenValue.ToString()); 
     } 

     for(int i=0; i<tokenList.Count; i++) 
     { 
      switch (tokenList[i].TokenName) 
      { 
       case TokenName.NEWLINE: 
       case TokenName.TABSPACE: 
       case TokenName.WHITESPACE: break; 

       default: 

        count++; 
        if (tkn == null) 
        { 
         tkn = tokenList[i]; 
         j=i;        
        } 

        if (count > 1) 
        { 
         tokenList[i].Previous = tkn; 
         tkn.Next = tokenList[i]; 
         tkn = tokenList[i]; 
         count++; 
        } 
        break;           
      }       
     } 

     tkn = tokenList[j]; 
     do 
     { 
      Console.WriteLine(tkn.TokenName.ToString() +" "+ tkn.TokenValue.ToString()); 
      tkn = tkn.Next;     
     } 
     while (tkn != null); 

     Console.ReadLine(); 
    } 
} 
+1

정확히 무엇이 바뀌 었는지 설명해 주시겠습니까? – svick

+0

귀하의 요구 사항에 따라 작업하는 경우, 당신은 그것을 알아낼 수 확신합니다. –

+0

나는 그 질문을 한 사람이 아니다. 그리고 저는 정말로 대답이 수수께끼가되어야한다고 생각하지 않습니다. 좋은 답변은 원본 코드의 문제점, 변경 방법 및 이유를 설명합니다. – svick

0

많은 불필요한 코드를 사용했다고 생각해보십시오. 고맙습니다. @Lee, 저는 디버거를 사용했습니다. 중단 점을 설정하면 많은 코드가 단순히 실행되지 않는다는 것을 알 수 있습니다. 여기에 제 작업 코드가 있습니다.

Token token = null; 

foreach (Token tkn in tokenList) 
{ 
    switch (tkn.TokenName) 
    { 
     case Tokens.NEWLINE: 
     case Tokens.WHITESPACE: 
     case Tokens.TABSPACE: 
      break; 
     default: 
      tkn.Previous = token; 
      if (token != null) 
       token.Next = tkn; 
      token = tkn; 
      break; 
    } 
}