草庐IT

ruby - Ruby 的 AST 中的 'send' 关键字是什么意思?

我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的

ruby - 我如何将 Ripper 的 AST 重新编译回 Ruby 代码?

Ripper是Ruby1.9附带的解析库。它将Ruby代码转换为AST,如下所示:ppRipper.sexp("deffoo;yield:a;return1end")#=>[:program,[[:def,[:@ident,"foo",[1,4]],[:params,nil,nil,nil,nil,nil],[:bodystmt,[[:yield,[:args_add_block,[[:symbol_literal,[:symbol,[:@ident,"a",[1,16]]]]],false]],[:return,[:args_add_block,[[:@int,"1",[1,26]]

ruby - 如何手动构建 AST?

我目前正在学习解析,但我对如何生成AST有点困惑。我编写了一个解析器,可以正确验证表达式是否符合语法(当表达式符合时它会保持沉默,否则会引发异常)。我从这里去哪里构建AST?我找到了很多关于构建我的LL(1)解析器的信息,但是关于构建AST的信息却很少。我当前的代码(用非常简单的Ruby编写,包括词法分析器和解析器)可在github上找到:https://gist.github.com/e9d4081b7d3409e30a57有人能解释一下我是如何从目前拥有的东西变成AST的吗?或者,如果您不熟悉Ruby,但知道C,您能告诉我如何为recursivedescentparsing中的C代

javascript - 如何通过remark从markdown获取AST树

使用这样的代码:varremarkAbstract=require("remark");varremark=remarkAbstract();letremark=remarkAbstract();varast=remark.process(input);但它返回的输出如下:AssertionError:VFile{contents:'#header\n\n20December2012\n\n![alt](http://yo.io/)\n\ncontent1\n\ncontent2\n\n##header2\n',messages:=我想获得AST树likethis

javascript - 操纵 V8 ast

我打算直接在v8代码中实现一个js代码覆盖。我最初的目标是为抽象语法树中的每个语句添加一个简单的打印。我看到有一个AstVisitor类,它允许您遍历AST。所以我的问题是如何在访问者当前访问的语句之后向AST添加语句? 最佳答案 好的,我将总结我的实验。首先,我写的内容适用于V8,因为它在Chromium版本r157275中使用,因此可能不再有效-但我仍然会链接到当前版本中的位置。如前所述,您需要自己的AST访问者,例如MyAstVisior,它继承自AstVisitor并且必须实现一堆VisitXYZ那里的方法。唯一需要检测/检

javascript - : "Requesting JavaScript AST from selection" 期间发生内部错误

我在Eclipse中编辑JavaScript文件时遇到了独特的错误/警报弹出窗口,每次我将光标放在该行时都会弹出此错误。JS:NullPointerExceptionwhencursorisplacedontheendofthelinereturnstatement.foo.bar=function(x){if(xyz){returnfn(x);«error»}returnfn(x);«error»return(fn(x));«error»returnnewfn(x);«ok»returnx;«sometimes»return"";«error»returnx+"x";«error»r

go - 解析器包解析go源文件时如何优雅地跳过包标识?

当我用parser包解析go源文件时,packagexxx语句被认为是一个普通的*ast.Ident。有什么方法可以将它与其他声明区分开来吗?或者在解析时优雅地忽略包语句?funcwalk(nodeast.Node)bool{switchn:=node.(type){case*ast.File:returntruecase*ast.Ident://Iwanttocheckwhetheritisapackagestatementcase*ast.GenDecl:returntruecase*ast.TypeSpec:returntruecase*ast.StructType:return

go - 判断动态指定的Go变量是否有特定类型

我正在编写一个命令行应用程序,其中用户指定1)包含Go文件的目录,2)应该是http.Handler的变量名称,例如goruncli.go/path/to/a/go/libraryMyCustomHandler我正在努力解析文件找到给定名称的变量验证它是一个http.Handler我可以完成前两个没问题-我调用parser.ParseDir,然后将我想要的包作为*ast.Package获取,然后循环遍历它这个:funcfindHttpHandler(pkg*ast.Package,handlerNamestring)(*ast.FuncDecl,error){for_,file:=ra

Go AST/Types——如何判断错误?

有更好的方法吗?我需要知道v的类型是否是内置的“错误”类型。我觉得应该有一种更简洁的方法来做到这一点:import("go/ast""go/types")funcIsError(vast.Expr,infotypes.Info)bool{t:=info.Types[v]returnt.Type.String()=="error"&&t.Type.Underlying().String()=="interface{Error()string}"} 最佳答案 Typeassertion是检查变量类型的惯用方法。鉴于您正在处理一个AST表

go - 为什么 ast.CallExpr 不是有效的 ast.Expr?

我正在编写一些GoAST代码,而编译器在这一行上令人窒息:varcallast.Expr=ast.CallExpr{Fun:ast.NewIdent("foo"),Args:[]ast.Expr{ast.NewIdent("api")}}它给我的错误是:cannotuseast.CallExprliteral(typeast.CallExpr)astypeast.Exprinassignment:ast.CallExprdoesnotimplementast.Expr(Endmethodhaspointerreceiver)我不知道这是在说什么;accordingtothedocume