抽象语法树#

Kork 将代码解析为以下 AST https://github.com/langchain-ai/kork/blob/main/kork/ast.py。

下面我们将展示一些用于解析和打印 ast 的实用工具。

解析#

from kork.parser import parse
parse("x")
Program(stmts=(Variable(name='x'),))
parse("x = 1")
Program(stmts=(Assign(name='x', value=Literal(value=1)),))
parse(
    """
extern fn foo() -> Any # Comment

x = 1; // Comment
y = x * x + foo()
"""
)
Program(stmts=(ExternFunctionDef(name='foo', params=ParamList(params=[]), return_type='Any', implementation=None, doc_string=''), Assign(name='x', value=Literal(value=1)), Assign(name='y', value=Binary(left=Binary(left=Variable(name='x'), operator='*', right=Variable(name='x')), operator='+', right=FunctionCall(name='foo', args=[])))))

AstPrinter#

AST 打印器可用于将 AST 语法转换为程序的字符串表示形式。

此功能用于为 LLM 生成提示词,我们将在文档的后面看到。

from kork import AstPrinter
program = parse(
    """
    extern fn foo() -> Any # Comment
x=1; // Comment
y=x*x + foo()
"""
)
program.stmts[0].params
ParamList(params=[])
print(AstPrinter().visit(program))
extern fn foo() -> Any
x = 1
y = x * x + foo()

节点#

ast 中的节点位于 ast 模块中。

from kork.ast import FunctionCall, FunctionDef
?FunctionCall
Init signature: FunctionCall(name: 'str', args: 'Sequence[Expr]') -> None
Docstring:      Represent a function call.
File:           ~/src/kork/kork/ast.py
Type:           ABCMeta
Subclasses:     
?FunctionDef
Init signature:
FunctionDef(
    name: 'str',
    params: 'ParamList',
    body: 'Sequence[Union[Stmt, Expr]]',
    return_type: 'str',
) -> None
Docstring:      Represent a function definition with an implementation.
File:           ~/src/kork/kork/ast.py
Type:           ABCMeta
Subclasses: