2016-03-01 40 views
1

我正在創建一個編譯器。在c中檢查左括號右括號#

當我爲我的編譯器編寫輸入代碼時,如果缺少括號,編譯器應該顯示一個錯誤。當我給簡單的輸入像function{}它完美

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

:對於我使用這個代碼。但我的輸入是:

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

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

我的想法是實現這個目標,首先分開開括號和閉括號,然後將它們配對,如果缺少任何一對,我的編譯器應該會拋出一條錯誤消息。我怎樣才能實現這個?

+2

注意,它很快變得相當複雜: 'OBSNOW(「{」)'引號內的'{'不應該統計。 – xanatos

+4

基本上你想要做的是當你遇到大括號(不在評論/引號內)時增加計數,當你遇到有效的大括號時減少計數。如果你降到0以下,這意味着一個額外的大括號。如果最後發現您的計數大於0,則意味着您缺少右括號。 –

+0

@xanatos,這種複雜性很容易解決:在我的回答中,我使用RegEx替換了qoute字符之間的文本... – Shnugo

回答

0

這是一個解決問題的小程序。基於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 
    } 
} 

注:如果你是內「字,您可以跟蹤並排除那些被認爲是字符串的計數,如果要解決未來的問題是什麼薩那託斯被指出

+0

感謝它的作品完美地滿足我的需求 – malathi

+0

@malathi歡迎來到SO!由於您是新來賓,請允許我提示一個提示:「謝謝」,這真是太好了,但如果答案能夠解決您的問題,那麼使用驗收檢查更加友好。這將把問題標記爲已關閉,DDan將對聲望點感到滿意。一旦你自己超過了15分,你也應該使用高票和低票。 [請閱讀:人 - 答案](http://stackoverflow.com/help/someone-answers)。 – Shnugo

0

要。避免與援引區域內支架的問題,我只想用正則表達式來替換它們。然後你可以指望的跡象:

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