在 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 指出的即将到来的问题.
为了避免括号 在 引用区域内出现问题,我会使用 RegEx 来替换它们。然后你可以数符号:
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));
我正在创建一个编译器。
当我为编译器编写输入代码时,如果缺少括号,编译器应该会显示错误。为此,我使用此代码:
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 指出的即将到来的问题.
为了避免括号 在 引用区域内出现问题,我会使用 RegEx 来替换它们。然后你可以数符号:
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));