recast

AST抽象语法树 Javascript版

妖精的绣舞 提交于 2019-12-05 16:48:30
在javascript世界中,你可以认为抽象语法树(AST)是最底层。 再往下,就是关于转换和编译的“黑魔法”领域了。 现在,我们拆解一个简单的add函数 function add(a, b) { return a + b } 首先,我们拿到的这个语法块,是一个FunctionDeclaration(函数定义)对象。 用力拆开,它成了三块: 一个id,就是它的名字,即add 两个params,就是它的参数,即[a, b] 一块body,也就是大括号内的一堆东西 add没办法继续拆下去了,它是一个最基础Identifier(标志)对象,用来作为函数的唯一标志。 { name: 'add' type: 'identifier' ... } params继续拆下去,其实是两个Identifier组成的数组。之后也没办法拆下去了。 [ { name: 'a' type: 'identifier' ... }, { name: 'b' type: 'identifier' ... } ] 接下来,我们继续拆开body 我们发现,body其实是一个BlockStatement(块状域)对象,用来表示是 {return a + b} 打开Blockstatement,里面藏着一个ReturnStatement(Return域)对象,用来表示 return a + b

UE4的NavArea,AreaFlags和Recast的dtPoly的关系

匿名 (未验证) 提交于 2019-12-02 23:57:01
UE 的导航网格底层使用的是 Recast Navigation ,而 Recast 将网格划分为一个个凸多边形,平时寻路基本上都是使用这些多边形。 /// Defines a polyogn within a dtMeshTile object. /// @ingroup detour struct dtPoly { /// Index to first link in linked list. (Or #DT_NULL_LINK if there is no link.) unsigned int firstLink ; /// The indices of the polygon's vertices. /// The actual vertices are located in dtMeshTile::verts. unsigned short verts [ DT_VERTS_PER_POLYGON ]; /// Packed data representing neighbor polygons references and flags for each edge. unsigned short neis [ DT_VERTS_PER_POLYGON ]; /// The user defined polygon flags. unsigned short flags

UE4的NavArea,AreaFlags和Recast的dtPoly的关系

帅比萌擦擦* 提交于 2019-11-29 03:23:28
UE的导航网格底层使用的是Recast Navigation,而Recast将网格划分为一个个凸多边形,平时寻路基本上都是使用这些多边形。 /// Defines a polyogn within a dtMeshTile object. /// @ingroup detour struct dtPoly { /// Index to first link in linked list. (Or #DT_NULL_LINK if there is no link.) unsigned int firstLink; /// The indices of the polygon's vertices. /// The actual vertices are located in dtMeshTile::verts. unsigned short verts[DT_VERTS_PER_POLYGON]; /// Packed data representing neighbor polygons references and flags for each edge. unsigned short neis[DT_VERTS_PER_POLYGON]; /// The user defined polygon flags. unsigned short flags; /// The

AST抽象语法树 Javascript版

空扰寡人 提交于 2019-11-26 12:08:37
在javascript世界中,你可以认为抽象语法树(AST)是最底层。 再往下,就是关于转换和编译的“黑魔法”领域了。 现在,我们拆解一个简单的add函数 function add(a, b) { return a + b } 首先,我们拿到的这个语法块,是一个FunctionDeclaration(函数定义)对象。 用力拆开,它成了三块: 一个id,就是它的名字,即add 两个params,就是它的参数,即[a, b] 一块body,也就是大括号内的一堆东西 add没办法继续拆下去了,它是一个最基础Identifier(标志)对象,用来作为函数的唯一标志。 { name: 'add' type: 'identifier' ... } params继续拆下去,其实是两个Identifier组成的数组。之后也没办法拆下去了。 [ { name: 'a' type: 'identifier' ... }, { name: 'b' type: 'identifier' ... } ] 接下来,我们继续拆开body 我们发现,body其实是一个BlockStatement(块状域)对象,用来表示是 {return a + b} 打开Blockstatement,里面藏着一个ReturnStatement(Return域)对象,用来表示 return a + b