Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

使用语法解析函数示例

使用 parseFile 函数的示例

仓颉文件 a.cj 中有如下代码:

package a

main(){
  var expr = 1 + 2
  println(expr)
}

利用 parseFile 函数将上述文件解析为一个 ParsingResult<SourceFile> 对象,代码如下所示:

import stdx.syntax.*

main() {
    let file = parseFile("a.cj").node.getOrThrow() // 获取一个 SourceFile 类型的语法树
    println(file.toString()) // 打印该语法树, 应与原文件中内容完全一致
}

运行结果:

package a

main(){
  var expr = 1 + 2
  println(expr)
}

使用 parsePackage 函数的示例

文件目录 user 下有仓颉文件 file1.cj 和 file2.cj,file1.cj 和 file2.cj 中均包含如下仓颉代码:

package a

func foo() {
}

利用 parsePackage 函数将上述代码解析为一个 ParsingResult<Package> 对象,代码如下所示:

import stdx.syntax.*

main() {
    let pkg = parsePackage("/user/").node.getOrThrow() // 获取一个 Package 类型的语法树
    println(pkg.toString()) // 打印该语法树,包内的文件按文件名字母序排序,对每个文件依次打印文件名和文件内容
}

运行结果:

// file1.cj
package a

func foo() {
}
// file2.cj
package a

func foo() {
}

使用 parseText 函数的示例

利用 parseText 函数将输入的文本解析为一个 ParsingResult<SyntaxTreeNode> 对象,代码如下所示:

import stdx.syntax.*

main() {
    let result = parseText("    1  + 1").node.getOrThrow() // 解析获得一个语法树节点,示例中为二元表达式
    println(result.toString()) // 打印该语法树节点,应与输入字符串完全一致
    println(result.toTokens().toString()) // Tokens 的 toString 接口不保留位置信息
}

运行结果:

    1  + 1
1 + 1

使用 parseTokens 函数的示例

利用 parseTokens 函数将输入的一组词法单元解析为一个 ParsingResult<SyntaxTreeNode> 对象,代码如下所示:

import stdx.syntax.*

main() {
    let tokens = quote(
      let a    =    1
    )
    let result = parseTokens(tokens).node.getOrThrow() // 解析获得一个语法树节点,默认刷新位置信息,示例中为变量声明
    println(result.toString()) // 打印该语法树节点

    let result_1 = parseTokens(tokens, refreshPos: false).node.getOrThrow() // 不刷新位置信息解析,toString 结果保留原始位置
    println(result_1.toString())
}

运行结果:

let a = 1
let a    =    1