2016-03-01 3 views
1

Я создаю компилятор.Проверка открытой скобки закрывающей скобки в 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 } 

Вот мой компилятор должен проверить правильность всех скобок, и показать сообщение об ошибке.

Моя идея достичь этого - сначала отделить открывающие и закрывающие скобки, а затем соединить их, если какая-либо пара отсутствует, мой компилятор должен выдать сообщение об ошибке. Как я могу это реализовать?

+2

Обратите внимание, что он получает довольно сложным быстро: 'OBSNOW (" {")' '' 'внутри кавычек не следует считать. – xanatos

+4

То, что вы в основном хотите сделать, это увеличить счет, когда вы сталкиваетесь с открывающей скобкой (это не входит в комментарий/кавычки) и уменьшаетесь, когда вы сталкиваетесь с действительной закрывающей скобкой. Если вы когда-либо опускаетесь ниже 0, это означает дополнительную закрывающую фигуру. Если в конце вы обнаружите, что у вас есть счет выше 0, это означает, что у вас отсутствует закрывающая скобка. –

+0

@xanatos, эту сложность довольно легко разрешить: в моем ответе я заменяю текст между qoute-символами с помощью RegEx ... – 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 Welcom на 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)); 
Смежные вопросы