未执行效果:
执行效果:
实现方法跟找出Java没什么不同,不同之处就是:
/// <summary>
/// 判断是否正确的Java标识符
/// 标识符
/// 标识符可以简单地理解为一个名子,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。
/// Java语言规定标识符由任意顺序的字母、下划线 (_) 、美元符号($)和数字组成,并且第一个字符不
/// 能是数字。标识符不能是Java中的保留关键字。
/// </summary>
/// <param name="sWord"></param>
/// <returns></returns>
public static bool _Syntax_Java_Is_Identifier(this string sWord) => sWord.Length == 0 ? false : Syntax_.Java_Keyword.IndexOf(sWord) == -1;
/// <summary>
/// 判断是否正确的C,C++标识符
/// 标识符
/// 标识符可以简单地理解为一个名子,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。
/// Java语言规定标识符由任意顺序的字母、下划线 (_) 、美元符号($)和数字组成,并且第一个字符不
/// 能是数字。标识符不能是Java中的保留关键字。
/// </summary>
/// <param name="sWord"></param>
/// <returns></returns>
public static bool _Syntax_C_Is_Identifier(this string sWord) => sWord.Length == 0 ? false : Syntax_.C_Keyword.IndexOf(sWord) == -1;
/// <summary>
/// 判断C,C++ 代码中的函数,也可能是类构造函数
/// </summary>
/// <param name="sText"></param>
/// <returns></returns>
/// 创建时间: 2022-10-02 最后一次修改时间:2022-10-02
public static StringList_ _Syntax_C_Get_Function(this string sText)
{
string sTrue = sText._Syntax_C_Remove_ExplanatoryNote();
StringList_ slResul = new StringList_();
for (int i = 0; i < sTrue.Length; ++i)
{
char cLeftBracket = sTrue[i];
if (cLeftBracket == '(')
{
string sWord = sTrue._Syntax_Get_Left_Identifier(i);
if (sWord.Length > 0 && sWord._Syntax_C_Is_Identifier()) //如果左边的标识符是正确的Java标识符,暂时不检查是否语法错误
{
if (slResul.IndexOf(sWord) == -1) //这里也可能是类的构造函数
{
slResul.Add(sWord);
}
}
}
}
return slResul;
}
/// <summary>
/// 获取 nPos左边的第一个标识符
/// </summary>
/// <param name="sText"></param>
/// <param name="nPos"></param>
/// <returns></returns>
/// 创建时间: 2022-09-18 最后一次修改时间:2022-09-18
public static string _Syntax_Get_Left_Identifier(this string sText, int nPos)
{
//找出 nPos 左边的第一个除空格外的可见字符
if (nPos >= sText.Length || nPos < 0) return "";
int nEnd = 0;
for (int i = nPos - 1; i >= 0; --i)
{
char ch = sText[i];
if(ch._IsControl() || ch._IsWhiteSpace() || ch._IsUnPrintable())
{
}
else
{
nEnd = i;
break;
}
}
DList_<char> dl = new DList_<char>();
for (int i = nEnd; i >= 0; --i)
{
char ch = sText[i];
if (ch._IsPunctuation() || ch._IsUnPrintable() || ch._IsControl() || ch._IsWhiteSpace() || ch._IsSeparator() || ch._IsProgramOperationalCharacter())
{
break;
}
dl.Add(ch);
}
StringBuilder sb = new StringBuilder(dl.Count + 5);
DListNote_<char> dn = dl.Last;
while(dn != null)
{
sb.Append(dn.Data);
dn = dn.Prev;
}
return sb.ToString();
}
/// <summary>
/// 判断是否正确的Java标识符
/// 标识符
/// 标识符可以简单地理解为一个名子,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。
/// Java语言规定标识符由任意顺序的字母、下划线 (_) 、美元符号($)和数字组成,并且第一个字符不
/// 能是数字。标识符不能是Java中的保留关键字。
/// </summary>
/// <param name="sWord"></param>
/// <returns></returns>
public static bool _Syntax_Java_Is_Identifier(this string sWord) => sWord.Length == 0 ? false : Syntax_.Java_Keyword.IndexOf(sWord) == -1;
/// <summary>
/// 判断是否正确的C,C++标识符
/// 标识符
/// 标识符可以简单地理解为一个名子,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。
/// Java语言规定标识符由任意顺序的字母、下划线 (_) 、美元符号($)和数字组成,并且第一个字符不
/// 能是数字。标识符不能是Java中的保留关键字。
/// </summary>
/// <param name="sWord"></param>
/// <returns></returns>
public static bool _Syntax_C_Is_Identifier(this string sWord) => sWord.Length == 0 ? false : Syntax_.C_Keyword.IndexOf(sWord) == -1;