当前位置: 首页 > news >正文

请举例 AST 的更多真实例子

请举例 AST 的更多真实例子

下面给你几个更真实、更接近解析器输出的 AST 例子(我会用“代码片段 → AST(树形/括号式)→ 可能的序列化”来展示)。为了可读性,我会给精简但结构真实的 AST(类似 Tree-sitter / ESTree / Python ast 模块的风格),并标出你关心的点:raw AST 往往只有类型/位置,增强后才更像“可读语义图”


例子 1:Python 赋值 + 二元运算 + 调用

代码

total = add(x, 2) + y

raw AST(括号式,接近 Pythonast.dump/ Tree-sitter 结构)

(Module (Assign targets=[(Name id='total' ctx=Store())] value=(BinOp left=(Call func=(Name id='add' ctx=Load()) args=[(Name id='x' ctx=Load()), (Constant value=2)] ) op=Add() right=(Name id='y' ctx=Load()) ) ) )

关键观察

  • 这里其实已经含有id='total'/'add'/'x'/'y',但很多解析器/标准化 AST可能会把这些 leaf 值抽象成Identifier类型,或只在 token 表里存(AST 节点本身只有 span)。

  • 运算符常常是一个节点Add()或 token,而不是文本"+"


例子 2:Python if + 比较 + 返回(带 else)

代码

def clamp(x, lo, hi): if x < lo: return lo elif x > hi: return hi return x

AST(更完整一点)

(Module (Assign targets=[(Name id='total' ctx=Store())] value=(BinOp left=(Call func=(Name id='add' ctx=Load()) args=[(Name id='x' ctx=Load()), (Constant value=2)] ) op=Add() right=(Name id='y' ctx=Load()) ) ) )

(Module (FunctionDef name='clamp' args=(arguments args=[x,lo,hi]) body=[ (If test=(Compare left=(Name 'x') ops=[Lt()] comparators=[(Name 'lo')]) body=[(Return (Name 'lo'))] orelse=[ (If test=(Compare left=(Name 'x') ops=[Gt()] comparators=[(Name 'hi')]) body=[(Return (Name 'hi'))] orelse=[] ) ] ), (Return (Name 'x')) ] ) )

关键观察

  • “elif” 在 AST 里常常表现成If嵌套在orelse中(这就是结构信息:树上位置决定语义)。

  • 如果你把它“纯前序 token 化”成一串If Compare Name Lt Name Return ...,模型很容易把哪个 return 属于哪个分支搞混。


例子 3:JavaScript(ESTree 风格)箭头函数 + map + 对象字面量

代码

const res = arr.map(x => ({k: x, v: x * 2}));

raw AST(接近 ESTree / Babel AST)

{ "type": "VariableDeclaration", "kind": "const", "declarations": [{ "type": "VariableDeclarator", "id": {"type": "Identifier", "name": "res"}, "init": { "type": "CallExpression", "callee": { "type": "MemberExpression", "object": {"type": "Identifier", "name": "arr"}, "property": {"type": "Identifier", "name": "map"}, "computed": false }, "arguments": [{ "type": "ArrowFunctionExpression", "params": [{"type": "Identifier", "name": "x"}], "body": { "type": "ObjectExpression", "properties": [ {"type": "Property", "key": {"type": "Identifier", "name": "k"}, "value": {"type": "Identifier", "name": "x"}}, {"type": "Property", "key": {"type": "Identifier", "name": "v"}, "value": {"type": "BinaryExpression", "operator": "*", "left": {"type": "Identifier", "name": "x"}, "right": {"type": "NumericLiteral", "value": 2}}} ] } }] } }] }

关键观察

  • JS AST 通常非常“语义化”:BinaryExpression.operator="*"MemberExpressionObjectExpression

  • 但也会很“长”:大量结构包装节点,序列化会爆 token(尤其大函数)。


例子 4:C / C++ 风格:for 循环 + 数组索引 + 累加

代码

for (int i = 0; i < n; i++) { sum += a[i]; }

AST(接近 Clang AST / Tree-sitter C 的结构)

(ForStatement init=(Declaration (InitDeclarator declarator=(Identifier "i") value=(NumberLiteral "0") ) ) condition=(BinaryExpression left=(Identifier "i") operator="<" right=(Identifier "n") ) update=(UpdateExpression operator="++" argument=(Identifier "i") ) body=(CompoundStatement (ExpressionStatement (AssignmentExpression left=(Identifier "sum") operator="+=" right=(SubscriptExpression object=(Identifier "a") index=(Identifier "i") ) ) ) ) )

关键观察

  • a[i]不是Call,而是SubscriptExpression/ArraySubscriptExpr一类节点。

  • 很多解析器会把operator当 token,而不是节点;也有的会把operator变成子节点。


例子 5:Java:try-catch + throw + 方法调用链

代码

try { return service.get(id).toString(); } catch (Exception e) { throw new RuntimeException(e); }

AST(接近 JavaParser / Eclipse JDT)

(TryStatement tryBlock=(Block (ReturnStatement expression=(MethodInvocation name="toString" scope=(MethodInvocation name="get" scope=(NameExpr "service") args=[(NameExpr "id")] ) ) ) ) catchClauses=[ (CatchClause parameter=(Parameter type="Exception" name="e") body=(Block (ThrowStatement expression=(ObjectCreationExpr type="RuntimeException" args=[(NameExpr "e")] ) ) ) ) ] )

关键观察

  • 链式调用service.get(id).toString()在 AST 里是嵌套 MethodInvocation

  • catch (Exception e)是一个带 parameter 的节点,属于TryStatement的子列表。


例子 6:未经增强的 AST(更“原始/抽象”)会长什么样?

很多论文里说的 “raw AST” 指的是:AST 节点只有类型/结构,叶子节点的具体值(标识符名、数字)不在 AST node 内,而在 tokenizer/token-table 里。那它可能更像下面这样:

代码

balance = 0

raw AST(极抽象版本:只剩类型)

(assignment_statement (left (identifier)) (right (integer)) )

这种形式当然也能序列化给 LLM:

assignment_statement left identifier right integer

但它对“总结/注释/意图理解”很不友好:模型不知道 identifier 是balance,integer 是0

而增强后的版本会更像:

(assignment_statement (left (variable:balance)) (right (integer:0)) )

信息密度立刻高很多。


你如果要“更真实”:我可以按你指定语言/解析器输出格式给

你可以告诉我你想看哪种(不用你再解释用途,我直接按常见格式给):

  1. Pythonast.dump()风格

  2. Tree-sitter S-expression 风格(很多论文用这个)

  3. JavaScript ESTree JSON(Babel/Acorn)

  4. Clang AST(C/C++)

  5. 自定义序列化:SBT / Preorder / NIT(带 children id)

你回一句:

  • “给我 3 个 Python 例子,按 tree-sitter 风格 + NIT 序列化”

  • “给我 JS 的 ESTree JSON + 对应的 NIT 序列”

我就可以把每个例子都配上树 → 序列的完整对照。

http://www.jsqmd.com/news/367686/

相关文章:

  • 计算机毕业设计springboot程序设计竞赛团队管理系统 基于SpringBoot的ACM程序设计竞赛战队协同平台 Java技术栈下的算法竞赛队伍全流程管理系统
  • 数据标注:推动大数据领域进步的关键力量
  • Java毕设项目推荐-基于springboot+vue的工厂精密设备销售管理系统的设计与实现【附源码+文档,调试定制服务】
  • 基于VUE+Tailwind CSS的高德地图导航功能开发实战教程
  • 大模型微调内存优化全攻略:无需昂贵显卡,打造你的AI助手
  • 如何进行 OTel : OpenTelemetry 采用蓝图
  • Code vs Serialized AST Inputs for LLM-Based CodeSummarization: An Empirical Study
  • 【无人机三维路径规划】基于蚁群算法ACA、Astar和遗传GA算法实现无人机山地路径规划附matlab代码
  • 收藏备用|2026年AI人才市场真相:缺口500万+,程序员吃透这篇少走3年弯路
  • 千亿美金争夺战:AI军火商为何突然“踩刹车”?Anthropic3500亿美元;OpenAI8300亿美元
  • 【MIMO通信】超越对角线RIS MIMO容量最大化Matlab复现
  • 收藏备用|AI Agent薪资天花板曝光(60W-300W),小白/程序员入局必看
  • 必收藏!5大主流基于图的RAG框架详解(小白程序员入门必备)
  • 字节Seedance 2.0紧急叫停真人人脸上传
  • 2026六盘水购物地标口碑排名:本地人必逛的5家高性价比名单 - 精选优质企业推荐榜
  • AI应用架构师谈企业AI技术栈选型的重要性
  • 大模型幻觉问题详解:小白也能看懂的成因、分类与缓解方案(收藏版)
  • 反悔贪心练习题目
  • 免费降aigc全攻略:如何通过降ai技术降知网、维普 AI率,亲测10款降AI工具【建议收藏】
  • 论文降ai哪家最有效?深度实测10款主流降ai率工具(内附对比表)
  • Java毕设项目:基于springboot的工厂精密设备销售管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 2026六枝逛街搭配指南:本地人必逛的5家好店名单出炉! - 精选优质企业推荐榜
  • 2026六盘水买鞋避坑指南:专业售后口碑店TOP5名单公布! - 精选优质企业推荐榜
  • 编写约会助手APP,根据约会对象,约会主题(第一次约会/纪念日/生日),预算,推荐合适的约会地点,美食,活动,还能生成约会攻略,避免约会难堪,适合年轻人。
  • Perl 运算符
  • 2026六枝特区中产消费指南:本地人私藏的5家必逛好店名单! - 精选优质企业推荐榜
  • Ruby 文件的输入与输出
  • 数据中台在大数据领域的实时数据集成策略
  • Java毕设项目:基于springboot的助农农产品销售平台小程序(源码+文档,讲解、调试运行,定制等)
  • C# 变量详解