我想在Perl中检查和操作任意Perl程序的代码(由coderefs获取).有没有工具/模块/库?类似于B :: Concise的东西,除了B :: Concise在输出上打印代码,但我想以编程方式检查它.
我想像这样使用它.给定一个coderef F,例如.有10个参数:
$ret = &$F(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10);
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数F1,st.
&$F(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) ==
&$F1(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10)*
&$C(x2, x3, x4, x5, x6, x7, x8, x9, x10)
Run Code Online (Sandbox Code Playgroud)
那就是把它"分解"成两部分,第二部分不依赖于x1第一部分,第一部分尽可能简单(我假设它F是一个巨大的产品).
我想要的应用是Metropolis采样算法的优化 - 假设我正在对分布进行采样p(x1 | x2 = X1, x3 = X3, ...) = f(x1, x2, x3, ...).算法本身是不变的.乘法常数因子和其他变量不会通过算法改变,因此不依赖于x1 …
perl code-analysis abstract-syntax-tree bytecode-manipulation
如何使用ast获取python模块名称?我尝试了以下操作来获取模块节点,但看起来它没有名称信息:
class v(ast.NodeVisitor):
def visit_Module(self, node):
print "Module : %s" % node
v().visit_Module(ast.parse(f.read(), filename))
Run Code Online (Sandbox Code Playgroud)
我基本上需要实际的模块名称(如果它在一个包中,则像abmodule一样完整)。
NodeVisitor首先遍历AST深度优先,并在输入时仅访问每个节点一次.因此,做一些严肃的事情是有问题的.是否可以更改其默认行为?
我正在使用ast.literal_eval将我从json.loads()收到的数据更改为Python字典; 然而,如果我只是以一种完全不同的方式来解决这个问题 - 请随意指出这一点.
# Authentication
buf = StringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, "https://kippt.com/api/account")
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(c.HTTPHEADER, header)
c.perform()
result = buf.getvalue()
buf.close()
print result
# Printing Output
data_string = json.dumps(result)
jsonload = json.loads(data_string)
jsondict = ast.literal_eval(jsonload)
Run Code Online (Sandbox Code Playgroud)
目前它可以正常使用一行JSON返回,例如:
{"username":"my_username","api_token":"my_api_token"}
我可以通过以下方式正确获取值:
print jsondict['username']
print jsondict['api_token']
Run Code Online (Sandbox Code Playgroud)
我遇到问题的部分是数据嵌套的时候,例如:
{"meta":{"next":null,"total_count":6,"previous":null,"limit":20,"offset":0},"objects":[{"rss_url":"https: //kippt.com/feed/username_here/stuff_here/cool-stuff","updated":"1339003710","title":"Cool Stuff","created":"1339001514","slug":"cool-stuff" ",""id":54533,"resource_uri":"/ api/lists/54533 /"},{"rss_url":"https://kippt.com/feed/username_here/stuff_here/programming","updated": "1339003479","title":"Programming","created":"1339001487","slug":"programming","id":54532,"resource_uri":"/ api/lists/54532 /"},{ "rss_url":"https://kippt.com/feed/username_here/stuff_here/android","updated":"1339003520","title":"Android","created":"1339000936","slug": "android","id":54530,"resource_uri":"/ api/lists/54530 /"},{"rss_url":"https://kippt.com/feed/username_here/stuff_here/chrome","已更新":"1339000931","title":"Chrome","created":"1339000412","slug":"chrome","id":54529,"resource_uri":"/ api/lists/54529 /"} ,{"rss_url":"https://kippt.com/feed/use rname_here/stuff_here/inbox","updated":"1338946730","title":"收件箱","已创建":"1338945940","slug":"inbox","id":54432,"resource_uri":"/api/lists/54432 /"},{"rss_url":"https://kippt.com/feed/username_here/stuff_here/read-later","updated":"1338945940","title":"稍后阅读",""创建":"1338945940","slug":"read-later","id":54433,"resource_uri":"/ api/lists/54433 /"}]}
当我使用相同的代码(/ api/lists的Exchange URL)时,运行脚本时出现以下错误:
回溯(最近一次调用最后一次):文件"kippt.py",第48行,在jsondict = ast.literal_eval(jsonload)文件"/usr/local/lib/python2.7/ast.py",第80行,在literal_eval中return _convert(node_or_string)文件"/usr/local/lib/python2.7/ast.py",第63行,在zip中的_convert(node.keys,node.values)中)文件"/ usr/local/lib/python2 .7/ast.py",第62行,返回dict((_ convert(k),_ convert(v))for k,v File"/usr/local/lib/python2.7/ast.py",第63行,在zip中的_convert(node.keys,node.values)中)文件"/usr/local/lib/python2.7/ast.py",第62行,返回dict((_ convert(k),_ convert(v) …
正如我在这里读到的那样,grails正在使用methodMissing将GORM方法注入到域类中,但是已经说过,执行代价很高,只会在调度失败的情况下发生,为什么这些方法不是通过metaClass或AST转换注入的?有线索吗?
grails groovy metaprogramming abstract-syntax-tree grails-orm
我有一个迷你AST结构,其中每个节点可能有一个左和右子,例如:
class AstNode;
typedef std::shared_ptr<AstNode> AstNodePtr;
class AstNode
{
public:
AstNode()
: m_children(2)
{
}
virtual ~AstNode()
{
}
virtual void accept(AstNodeVisitor& visitor) = 0;
void addLeft(const AstNodePtr& child);
void addRight(const AstNodePtr& child);
const AstNodePtr left() const;
const AstNodePtr right() const;
private:
std::vector<AstNodePtr> m_children;
};
Run Code Online (Sandbox Code Playgroud)
它对我到目前为止所需的操作非常有用,但是当涉及到一个分支语句时,我不知道如何使用这个二叉树结构来实现它.根据维基,分支声明将有3个叶子:

我现在可以侥幸逃脱,因为我的大部分if语句都没有,所以条件将是左子,if-body将是正确的孩子.但它不适用于其他身体.我可以在分支节点本身中嵌入条件,这意味着在分支节点上进行预先遍历遍历,但是感觉不舒服,因为在评估自身时没有其他类型的节点涉及潜在的子树遍历.
也许AST不应该是二叉树,而是每个节点都可以有任意数量的子节点,但这(我认为)会使实现有点尴尬.有什么建议吗?
如果不最小化代码,这很容易。但是很难区分最小化和模糊化。我发现了这一点:http : //research.microsoft.com/pubs/148514/tr.pdf
如何检测缩小代码和混淆代码之间的区别?
javascript obfuscation classification abstract-syntax-tree deobfuscation
我正在使用内置的解析器从源代码生成AST:
const ts = require('typescript')
//...
const ast = ts.createSourceFile(filename, fs.readFileSync(filename).toString(), ts.ScriptTarget.ES6, true)
Run Code Online (Sandbox Code Playgroud)
有没有办法从AST中获取变量的推断类型?例如,在下面的代码中,bar类型为IBar。编译器知道该类型- bar.foo()不编译-我如何以编程方式获取该类型?
interface IBar { bar() }
const foo : IBar = //...
export const bar = foo
Run Code Online (Sandbox Code Playgroud) 在学习编译器的过程中,写了一个简单的标记器和解析器(递归下降).解析器构造一个抽象语法树.现在我要进行语义分析.但是我有一些关于语义分析器构造的问题.我是否应该使用树中的递归调用在生成的抽象语法树上语义分析代码,或者我应该构建另一个树(例如使用访问者模式)以进行语义分析.我在网上发现了一个文档,说我应该在解析过程中语义分析代码,但它不符合单一责任规则,并使整个解析器更容易出错.或者我应该将语义分析作为中间表示生成器的一部分?也许我错过了什么,如果有人能为我澄清这件事,我将不胜感激.
compiler-construction parsing abstract-syntax-tree semantic-analysis
朱莉娅手册指出:
每个Julia程序都以字符串开头:
Run Code Online (Sandbox Code Playgroud)julia> prog = "1 + 1" "1 + 1"
我可以很容易地获得简单表达式的AST,甚至可以在quote/ 的帮助下获得一个函数,如果我在字符串中包含表达式code_*,则可以使用Meta.parse/ Meta.show_sexpr。
问题:是否有办法获取编码的整个AST,可能包括几个原子表达式?像,读取源文件并将其转换为AST?
python ×3
parsing ×2
c++ ×1
dictionary ×1
eval ×1
grails ×1
grails-orm ×1
groovy ×1
javascript ×1
json ×1
julia ×1
obfuscation ×1
perl ×1
typescript ×1
visitor ×1