抽象语法树#
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: