2016-03-01 37 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));