检测/ if / while语句

时间:2014-08-07 10:17:17

标签: c# if-statement for-loop while-loop

我正在用C#编写.cpp解析器,我需要检测for/if/while语句。起初我认为修剪线条并检查当前行是否以for/if/while开头就足够了。但是我被告知可能存在一些例外,并且该解决方案无法正常工作。我应该考虑哪些例外情况?在声明之前可以出现哪些字符?有没有更简单的方法呢?

4 个答案:

答案 0 :(得分:2)

修剪线条如果看起来像这样:

/* hello */ while(true) ;

或者这个:

/*
   while(true) ;
 */

您需要(至少)预处理文件(如果是C ++)

答案 1 :(得分:1)

您可能在一行中有多个语句,代码如

f(1); while(x > 0)
{
}

虽然不优雅是完全有效的。通常,C ++是一种过于复杂的语言,用于检查行是否以某些东西开头。

答案 2 :(得分:1)

您可能会遇到这样的函数或者可能是lambda函数。

void max(a,b){if (a>b) return a; return b;}

您可以使用正则表达式

答案 3 :(得分:1)

编译器的工作方式是通过lexer运行源代码,将源转换为令牌或令牌图。

您需要为C#创建一个。最好的起点可能是查看linux的gcc编译器:https://gcc.gnu.org/onlinedocs/cppinternals/Lexer.html#Lexer

如果您只想进行探索,可以使用String.Split并传入所有表达式终止符来进行非常粗略的标记化:

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"));

但同样,这是一种非理想的方法。