簡體   English   中英

在C#中檢查開括號和右括號

[英]Checking open parenthesis close parenthesis in c#

我正在創建一個編譯器。

當我為編譯器編寫輸入代碼時,如果缺少括號,則編譯器應顯示錯誤。 為此,我使用以下代碼:

Stack<int> openingbraces = new Stack<int>();
string output = string.Empty;

for (int i = 0; i < MELEdtior.Length; i++)
{
    if (MELEdtior[i] == '{')
    {
        openingbraces.Push(i);
        output="close braces missing";
    }
    else if (MELEdtior[i] == '}')
    {
        openingbraces.Push(i);
        output = "Open Braces missing";
    }   
}
if(openingbraces.Count==2)
{
    output = "Build Successfull";
}
else
{
    output = "brace missing";
}`

當我提供像function{}這樣的簡單輸入時,它可以完美工作。 但是我的輸入是:

{global gHCIRCIN = OBSNOW("Head circumf")}
{IF gHCIRCCM <> "" AND HeadCircsDifferrev()  THEN
OBSNOW("Head circumf",str(rnd(ConvertCMtoIN(gHCIRCCM),2)))  ELSE "" ENDIF }

在這里,我的編譯器應檢查所有括號的正確性,並顯示一條錯誤消息。

我要實現這一點的想法是先將左括號和右括號分開,然后將它們配對,如果缺少一對,我的編譯器應拋出一條錯誤消息。 我該如何實現呢?

這是一個解決問題的小程序。 基於o_weisman的評論。

class Program {
    static void Main(string[] args) {

        int currentOpenBracketNum = 0;
        string message = "Brackets OK";
        string input = @"{globa} }{IF gHCIRCCM <> """" AND HeadCircsDifferrev() THEN OBSNOW(""Head circumf"",str(rnd(ConvertCMtoIN(gHCIRCCM),2))) ELSE """" ENDIF }";

        foreach (char c in input) {
            if (c.Equals('{')) currentOpenBracketNum++;
            else if (c.Equals('}')) {
                if (currentOpenBracketNum > 0) {
                    currentOpenBracketNum--;
                } else {
                    message = "Missing open bracket";
                }
            }
        }

        if (currentOpenBracketNum > 0) {
            message = "Missing close bracket";
        }

        Console.WriteLine(message);
        Console.ReadKey(); // suspend screen
    }
}

注意:如果您想解決即將出現的xanatos所指出的問題,則可以跟蹤是否在“”字符之內,並排除對那些被視為字符串的字符的計數。

為了避免援引區域括號中的問題,我只想用正則表達式來替換它們。 然后,您可以計算一下跡象:

char quoteChar = '"';
string s1 = "{global gHCIRCIN = OBSNOW(\"Head circumf\")} {IF gHCIRCCM <> \"\" AND HeadCircsDifferrev() THEN OBSNOW(\"Head circumf\",str(rnd(ConvertCMtoIN(gHCIRCCM),2))) ELSE \"\" ENDIF }";
string s2 = Regex.Replace(s1, quoteChar + ".*?" + quoteChar, "This_was_quoted");
int countOpening = s2.Count(c => c == '{');
int countClosing = s2.Count(c => c == '}');
MessageBox.Show(string.Format("There are {0} opening and {1} closing }}-signs.", countOpening, countClosing));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM