Я создаю компилятор.Проверка открытой скобки закрывающей скобки в 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 }
Вот мой компилятор должен проверить правильность всех скобок, и показать сообщение об ошибке.
Моя идея достичь этого - сначала отделить открывающие и закрывающие скобки, а затем соединить их, если какая-либо пара отсутствует, мой компилятор должен выдать сообщение об ошибке. Как я могу это реализовать?
Обратите внимание, что он получает довольно сложным быстро: 'OBSNOW (" {")' '' 'внутри кавычек не следует считать. – xanatos
То, что вы в основном хотите сделать, это увеличить счет, когда вы сталкиваетесь с открывающей скобкой (это не входит в комментарий/кавычки) и уменьшаетесь, когда вы сталкиваетесь с действительной закрывающей скобкой. Если вы когда-либо опускаетесь ниже 0, это означает дополнительную закрывающую фигуру. Если в конце вы обнаружите, что у вас есть счет выше 0, это означает, что у вас отсутствует закрывающая скобка. –
@xanatos, эту сложность довольно легко разрешить: в моем ответе я заменяю текст между qoute-символами с помощью RegEx ... – Shnugo