检测/if/while语句

本文关键字:语句 while if 检测 | 更新日期: 2023-09-27 18:16:50

我正在用c#编写。cpp解析器,我需要检测for/if/while语句。起初,我认为修剪线条并检查当前线条是否以for/if/while开头就足够了。然而,有人告诉我,可能会有一些例外,这种解决方案不会正常工作。我应该考虑哪些例外情况?语句之前可以出现哪些字符?有更简单的方法吗?

检测/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"));