Kotlin你不知道的秘密(二),Github标星25K+超火的Android实战项目
KotlinParser ktParsing = KotlinParser.createForTopLevel(new SemanticWhitespaceAwarePSIImpl(PSIObject));
String extension = FileUtilRt 获取文件扩展名;
if (extension为空 或者 等于指定类型 或者 输入为已编译的KtFile){
ktParsing 解析该文件;
}else{
ktParsing 解析该脚本;
}
return PSIObject的结果;
}
该文档展示了Kotlin语法解析的过程,主要依赖于KotlinParsing库中的parse方法。在解析方法中初始化一个KotlinParsing实例,并将其用于解析目标文件。这里的文件通常指的是具有.kt扩展名的源代码文件。当然,并非仅限于.kt格式的文件。随后我们将深入探讨ktParsering库中的parseFile()方法的工作原理。
public class KotlinParsing extends AbstractKotlinParsing {
void parseFile() {
PsiBuilder.Marker fileMarker = mark();
//分析类的注释、package、import*
parsePreamble();
while (!eof()) {
//分析包、类、方法的声明方法,例如:package、class、function
parseTopLevelDeclaration();
}
checkUnclosedBlockComment();
fileMarker.done(KT_FILE);
}
}
parseFile中做的.
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 开源分享
在kt类中进行声明分析,在代码层面即指那些在KtTokens中预先定义的关键字和运算符等元素。此外,在语法分析过程中通常会将其划分为两大类:
自顶向下分析遵循形式语法规则,在自顶向下的语法分析过程中搜索输入符号串可能的最左推导。
每个单词依次按照从左到右的位置被处理。
基于自顶向下的方法:语法分析器从现有输入的符号串出发,并按照指定的形式语法规则对其进行转换。最终结果即为语法起始符号。
在Koltin中使用自顶向下的解析方法,在这种情况下这种方法对我们编写代码的习惯也比较友好。到目前为止已经完成了语法解析的大致框架。然而目前还没有展示我们之前提到过的if语句以及括号的应用。实际上,在KotlinParser中会实现一个名为KotlinExpressionParsing类的对象。该类的主要职责是处理与表达式相关的各种解析逻辑。
public class expression-parsing extends AbstractKotlinParser {
private boolean parseAtomicExpression() {
布尔型变量ok初始化为true;
if (at(LPAR)) {
执行括号内的解析操作;
}else if (at(LBRACKET)) {
执行集合字典项解析;
} else if (at(IF_KEYWORD)) {
执行条件语句解析;
} … return ok; }
private void parseIf() {
advance();
parseCondition();
PsiBuilder.Marker thenBranch = mark();
if (!at(ELSE_KEYWORD) && !at(SEMICOLON)) {
parseControlStructureBody();
}
if (at(SEMICOLON) && lookahead(1) == ELSE_KEYWORD) {
advance(); // SEMICOLON
}
thenBranch.done(THEN);
}
private void parseCondition() {
myBuilder.disableNewlines();
if (expect(LPAR, “Expecting a condition in parentheses ‘(…)’”, EXPRESSION_FIRST)) {
PsiBuilder.Marker condition = mark();
parseExpression();
condition.done(CONDITION);
expect(RPAR, “Expecting ')”);
}
myBuilder.restoreNewlinesState();
}
}
parseAtomicExpression方法中根据getTokenType判断当前关键字是this、try、if、when等,然后对单个关键字进行分析,以parseIf为例会先通过parseCondition检验if后有没有LPAR KtSingleValueToken LPAR = new KtSingleValueToken("LPAR", "(");LPAR也就是我们在Token定义的“(”,如果发现没有括号也就会给我们提示前面我再studio中写if语句中的错误信息Expecting a condition in parentheses '(...)'然后进行后续的判断,直到满足语法的要求,是一个完整的句子才不会给错误的提示。当然没有错误后会回到KotlinParser中的psiBuilder.getTreeBuilt();并生成AST抽象语法树
抽象语法树

通过图1构建抽象语法树的过程能够帮助您更好地理解本文的核心内容。在图形中提及的关键组件及其相关类别的具体内容也已在前述章节中有所阐述。每个步骤的详细说明以及IntelliJ平台插件SDK所扮演的角色已经被充分阐述。值得注意的是,在此部分中我们不充当代码搬运者的角色
总结
我们了解语法分析器是按照词法分析的顺序进行工作的。它通过利用词法分析得到的信息以及预先定义好的语法规则来检测输入程序是否存在语法错误。除了了解表层现象之外,深入探究其中的本质规律后可知,在Kotlin编程语言中使用if/When结构结合起来能有效地实现特定逻辑需求。大致分为以下三个步骤:
1、我们解析后得到一个包含关键字及运算符类型的信息流,在此过程中会生成if()、for()以及final等 (获取Token流)
2、基于上述Token信息流的识别结果,在正确的语法构造下不会触发异常;否则会导致解析失败,并返回相应的错误提示信息如:Expecting a condition in parentheses ‘(…)’ (KotlinParsing语法分析)
如果构造不满足语法规范,则会导致解析失败并返回错误提示信息如:Expecting a condition in parentheses ‘(…)' (KotlinParsing语法分析)
