我有以下课程:
class Foo(object):
def setUp(self):
self.var1 = "some value"
self.var2 = something
def bar(self):
var3 = some value
def baz(self, var):
var4 = some value
Run Code Online (Sandbox Code Playgroud)
我想打印方法中定义的所有变量的名称,例如:
setUp, bar, baz, var1, var2, var3, var4
Run Code Online (Sandbox Code Playgroud)
我试过使用,locals(), vars(), globals()但我只得到方法的名称而不是变量名称。
我也尝试使用ast模块,但没有成功。
考虑以下代码
int function()
{
unknownType variable;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,“unknownType”在编译时没有被解析,所以 clang 会将默认类型作为 int 放入 AST 并将声明标记为无效。
现在的问题是在遍历 AST 时,如何获取名称“unknownType”。使用现有API获取类型名称将给出int,其来源范围也是无效的。
有人遇到过这样的问题吗?请帮忙?
谢谢,赫曼特
我想要一个带注释的 AST,所以我使用Fix以下定义了这些递归数据结构:
data Term a
= Abstraction Name a
| Application a a
| Variable Name
deriving (Read,Show,Eq,Functor,Foldable,Traversable)
data Label a b
= Label a (Term b)
deriving (Read,Show,Eq,Functor,Foldable,Traversable)
newtype Labeled a
= Labeled (Fix (Label a))
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
我希望能够showa Labeled a,但编译器不高兴:
Run Code Online (Sandbox Code Playgroud)No instance for (Show1 (Label a)) arising from the first field of `Labeled' (type `Fix (Label a)')
什么是类Show1以及如何定义适当的实例以显示Labeled a?
haskell abstract-syntax-tree recursive-datastructures deriving
我正在寻找一种方法来向其他开发人员和可选的客户公开我工作场所的过滤功能。
我想基于向我的其他开发人员以及后来向我们的客户公开的用户定义过滤器,对我的数据(python dicts)实现一种简单的查询语言。
在我的 dict / json 数据上公开 SQL 接口会很棒(我不想设置服务器)
db = [
{'first': 'john', 'last': 'doe', 'likes': ['cookies', 'http']},
{'first': 'jane', 'last': 'doe', 'likes': ['cookies', 'donuts']},
{'first': 'danny', 'last': 'foo', 'likes': ['http', 'donuts']},
]
query = '(first == "john" or last == "doe") and likes contains "cookies"'
results = run_query(db, query)
Run Code Online (Sandbox Code Playgroud)
这应该返回(在结果中):
[
{'first': 'john', 'last': 'doe', 'likes': ['cookies', 'http']},
{'first': 'jane', 'last': 'doe', 'likes': ['cookies', 'donuts']},
]
Run Code Online (Sandbox Code Playgroud)
注意:我不介意更改运算符名称,例如or -> OR contains …
我刚开始使用 ASTMatcher 并遵循教程中的代码 - https://github.com/peter-can-talk/cppnow-2017。在这里,可以使用以下命令运行工具 clang-variables:
cd code/clang-variables
docker run -it -v $PWD:/home clang
root@5196c095092d:/home# ./clang-variables test.cpp -- -std=c++14
Run Code Online (Sandbox Code Playgroud)
如果我使用另一个源文件,而不是 test.cpp 文件,则会出现以下错误:
fatal error: 'stddef.h' file not found
#include <stddef.h>
^~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我知道我的源文件有这些需要包含的头文件。我尝试将它们包含在 Makefile 中,如下所示,但错误仍然存在:
clang-variables: $(TARGET).cpp
$(CXX) $(HEADERS) $(LDFLAGS) $(CXXFLAGS) $(TARGET).cpp $(LIBS) -o $(TARGET) -I$(START_DIR)/source -I$(HOME_ROOT)/extern/include
Run Code Online (Sandbox Code Playgroud)
编译时没有错误。所以我想知道,是否可以将包含文件作为 ASTMatcher 的参数提及?请在下面找到代码:
// Clang includes
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/Type.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendAction.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
// LLVM includes
#include "llvm/ADT/ArrayRef.h" …Run Code Online (Sandbox Code Playgroud) 我正在尝试查找 func 参数类型及其名称以生成一些代码。我正在使用ast它的包。我找到了参数名称,但找不到参数类型名称。
for _, fun := range findFunc(node) { //ast.FuncDecl
if fun.Recv != nil {
for _, field := range fun.Type.Params.List {
for _, name := range field.Names {
println(name.Name) //Func field name
//How to find field type name here?
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一些关于 AST/符号表关系的事情我不明白。
我目前有一个在 C# 中实现的 AST,它具有用于变量声明的节点(这些包含有关名称、类型、源位置、可能的常量值作为表达式节点等的信息)。
现在我想填充一个符号表(在我的 AST 上使用访问者模式)但我的问题是:“符号”是新类,例如 VariableSymbol 还是符号表直接存储来自 AST 的 VariableDeclarationNode?
如果符号是新类,那么谁来存储常量变量、VariableDeclarationNode 或 VariableSymbol 或其他地方的计算表达式值?
(我看过一些解释器示例,它们将所有变量值(包括常量)存储在一个附加的哈希表中,但我正在研究源到源编译器而不是解释器,所以我不确定您将评估的常量存储在何处这种情况。对不起,我知道这些问题有点多)
c# compiler-construction compilation abstract-syntax-tree symbol-table
我想在整个应用程序中索引所有方法和它们之间的连接(最终是一个包含子目录和文件的目录)。我正在使用ast,循环遍历目录直到单个文件,然后将它们加载到这样的ast对象中ast.parse(self.file_content)
我试图创建的索引是这个 连接
这是我的代码,如果相关的话。
def scan(self):
'''
scans a file line by line while keeping context of location and classes
indexes a file buffer content into a ast, Abstract Syntax Trees, https://en.wikipedia.org/wiki/AST.
Then, iterate over the elements, find relevant ones to index, and index them into the db.
'''
parsed_result = ast.parse(self.file_content)
for element in parsed_result.body:
results = self.index_element(element)
def index_element(self, element, class_name=None):
'''
if element is relevant, meaning method -> index
if element is …Run Code Online (Sandbox Code Playgroud) 在 Hibernate 6.0 路线图 ( https://github.com/hibernate/hibernate-orm/wiki/Roadmap6.0 ) 中提到 SQM 即将推出。
什么是 SQM?
在此路线图中,以下简短词对其进行了描述:
SQM 集成:改进了 SQL 生成和执行的性能(较小的 SQL,基于位置的结果提取,而不是基于名称(别名));HQL、JPQL 和 Criteria 查询的统一方法。
这就是我发现的关于 SQM 的全部内容。有人可以更详细地解释一下吗?它到底是什么,它在编码时会是什么样子,它有哪些好处?
我希望我的扩展能够读取 .java 文件的 Java AST 以进一步保存所选代码段的节点名称(例如,“ClassDeclaration”)。例如,如果您选择“public”,AST 会告诉您它是一个“修饰符”,然后我想将节点名称“修饰符”保存为变量中的字符串。
首先我需要 Java AST。
我首先查看了 VSCode 市场,但没有适用于 Java 的 AST 扩展(但您会发现一些适用于其他语言,如 TypeScript)。我得到的结果是 Java 扩展包,其中包含许多有用的 Java 扩展,但没有一个明确与 AST 相关。由于有来自 Red Hat 的调试器和语言支持,我很确定他们使用 AST 来使他们的扩展工作,所以我查看了他们的来源,试图找到这一点,但没有成功。我唯一知道的是他们引用了 Eclipse JDT“包”,但我不明白如何。答案可能就在那里,但代码对我来说很复杂。
我尝试的另一种方法是从 TypeScript AST 中获取源代码(git 链接:https : //github.com/krizzdewizz/vscode-typescript-ast-explorer)并尝试编写我自己的 Java AST 扩展(当然是在 TypeScript 中) ,但我很快意识到他使用了 TypeScript 特定的 node_modules。我去找了一个 Java 并想出了这个 npm 包:https ://www.npmjs.com/package/java-ast 。我不确定这是否有用,但我也不知道如何使用它(是的,有一个例子,我尝试过,但正如你所知,我对此很陌生)。
如果有人能进一步帮助我,我将不胜感激。
java abstract-syntax-tree visual-studio-code vscode-extensions language-server-protocol
python ×3
java ×2
llvm-clang ×2
parsing ×2
c# ×1
c++ ×1
clang ×1
class ×1
compilation ×1
deriving ×1
go ×1
haskell ×1
hibernate ×1
json ×1
libtooling ×1
methods ×1
orm ×1
python-3.x ×1
symbol-table ×1
variables ×1