检测/if/while语句
本文关键字:语句 while if 检测 | 更新日期: 2023-09-27 18:16:50
我正在用c#编写。cpp解析器,我需要检测for/if/while
语句。起初,我认为修剪线条并检查当前线条是否以for/if/while
开头就足够了。然而,有人告诉我,可能会有一些例外,这种解决方案不会正常工作。我应该考虑哪些例外情况?语句之前可以出现哪些字符?有更简单的方法吗?
如果该行看起来像这样,则无法修剪该行:
/* hello */ while(true) ;
或:
/*
while(true) ;
*/
您需要(至少)预处理文件(如果是c++)
一行中可能有多条语句,例如
f(1); while(x > 0)
{
}
虽然不优雅,但是完全有效。一般来说,c++是一种太复杂的语言,无法解决诸如检查行是否以某些东西开头的问题。
您可能会遇到这样的函数,也可能是lambda函数。
void max(a,b){if (a>b) return a; return b;}
可以使用正则表达式
编译器的工作方式是通过词法分析器运行源代码,词法分析器将源代码转换为Token或Token图。
您需要为c#创建一个。最好的起点可能是查看linux的gcc
编译器:https://gcc.gnu.org/onlinedocs/cppinternals/Lexer.html#Lexer
如果您只是想继续探索,您可以通过使用String得到一个非常粗略的标记化。分割并传入所有表达式终止符:
var expressionTerminators = new []{';','{','}'};
var sourceTokens = sourceCode.Split(expressionTerminators);
var forIfWhileStatements = sourceTokens.Where(
x => x.ToLower().StartsWith("if") ||
x.ToLower().StartsWith("for") ||
x.ToLower().StartsWith("while"));