-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;
    }
}

而且我需要设置列表中每个标记的NextandPrevious属性,但要避免它们指向NEWLINEor WHITESPACEorTABSPACE标记,而是使用它们的下一个标记。

这是我的代码。

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;
    }
}

但是,它似乎不起作用。请问有什么帮助吗?

4

2 回答 2

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;
    }
}
于 2013-04-22T01:41:27.743 回答
-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();
    }
}
于 2013-04-21T15:58:18.370 回答