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