-5

C#を使用してWord文書にあるIF、Then、Else、およびEnd If条件を確認する方法

いくつかのコードを提案してください...またはロジックを手伝ってください。前もって感謝します..

Stack stackWords = new Stack();
string[] words = SplitWords(sLine);

foreach(string s in words)
{
    if(s.Contains("IF") || s.Contains("ELSE") ||  (sLine.Contains("THEN")) || (sLine.Contains("ENDIF")))
    {
        for (; i < words.Length; i++)
        {
            if (words[i] == "IF" || words[i] == "ELSE" ||
            words[i] == "ELSEIF" || words[i] == "THEN" || words[i] == "END IF")
            {
                stackWords.Push(words[i]);
            }
        }
       // stackWords.Push(s);
    }
  //  MessageBox.Show(s);
}
4

2 に答える 2

1

@Evelieの回答に基づいて、チェックを行う実際のサンプルプログラムを次に示します(検証方法でいくつかのケースをカバーし、シーケンス内の誤ったキーワードの追跡も追加したと思います)。

備考:これで問題が解決しない場合は、@Evelie の回答を回答としてマークしてください。セット全体の印象を与えるためにこれを投稿しました。

class Program
{
    static void Main(string[] args)
    {
        Stack stackWords = new Stack();

        var app = new Microsoft.Office.Interop.Word.Application();
        var file = Environment.CurrentDirectory + @"\doc.docx";
        var document = app.Documents.Open(file);

        try
        {
            int count = document.Words.Count;
            for (int i = 1; i <= count; i++)
            {
                string text = document.Words[i].Text.Trim().ToUpper();
                Vals val;
                if(Enum.TryParse<Vals>(text, out val))
                {
                    Console.WriteLine("Word {0} = {1}", i, text);
                    if (stackWords.Count > 0)
                    {
                        var peeked = (Vals)stackWords.Peek();
                        if (IsValidFollower(peeked, val))
                        {
                            stackWords.Push(val);
                        }
                        else
                        {
                            throw new Exception(String.Format("Exception occured at word {0}. {1} was not expected after {2}",i, val, peeked));
                        }
                    }
                    else
                    {
                        stackWords.Push(val);
                    }
                }
            }
            Console.WriteLine("Syntax sequence is valid");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Syntax sequence is invalid");
            Console.WriteLine(ex.Message);
        }
        finally
        {
            document.Close();
            app.Quit();
        }

    }

    public enum Vals
    {
        IF,
        THEN,
        ENDIF,
        ELSE,
        ELSEIF
    }

    public static bool IsValidFollower(Vals val1, Vals val2)
    {
        if (val1 == Vals.IF)
            return val2 == Vals.THEN;
        if (val1 == Vals.THEN)
            return val2 == Vals.ENDIF || val2 == Vals.ELSEIF || val2 == Vals.ELSE;
        if (val1 == Vals.ENDIF)
            return val2 == Vals.IF;
        if (val1 == Vals.ELSE)
            return val2 == Vals.ENDIF;
        if (val1 == Vals.ELSEIF)
            return val2 == Vals.THEN;
        return false;
    }
于 2013-02-22T09:11:08.073 に答える
0

自分自身を取得し、値を列挙します。紐より扱いやすい。

    public enum Vals
    {
        IF,
        THEN,
        ENDIF,
        ELSE,
    }

次の値が現在と正しいペアであるかどうかを比較する方法があります。

    public static bool IsValidFollower(Vals val1, Vals val2)
    {
        if (val1 == Vals.IF)
            return val2 == Vals.THEN;
        if (val1 == Vals.THEN)
            return val2 == Vals.ENDIF;
        if (val1 == Vals.ENDIF)
            return val2 == Vals.IF || val2 == Vals.ELSE;
        if (val1 == Vals.ELSE)
            return val2 == Vals.THEN;
        return false;
    }

そして、スタックの代わりに通常のリストを使用します。(個人的な好みで、逆の順序は望まない)

        List<Vals> ListWords = new List<Vals>();

        foreach (string str in s.Split(' '))
        {
            if (str.Contains("ENDIF"))
                ListWords.Add(Vals.ENDIF);

            else if (str.Contains("ELSE"))
                ListWords.Add(Vals.ELSE);

            else if (str.Contains("THEN"))
                ListWords.Add(Vals.THEN);

            else if (str.Contains("IF"))
                ListWords.Add(Vals.IF);
        }

すべての値のリストがある場合。それらが論理的に有効かどうかを確認します。

        bool valid = true;
        for (int i = ListWords.Count - 1; i +1< ListWords.Count; i++)
        {
            if (!IsValidFollower(ListWords[i], ListWords[i + 1]))
            {
                valid = false;
                break;
            }
        }
于 2013-02-22T08:53:35.737 に答える