如果你正在构建一个编译器,那么AST级别的优化是最好的吗?
compiler-construction abstract-syntax-tree compiler-optimization
对你们所有人都有一个相当抽象的问题.我正在考虑参与静态代码分析项目.它使用C和C++作为开发语言,因此如果您的响应中的任何一种语言中的任何一种语言都很好.
我的问题:我需要了解一些用于处理静态分析代码的基本概念/结构.我听说人们使用AST和标记化等等.我只是想知道是否有什么可以澄清这些东西如何应用于创建静态分析工具?我更像是对标记化的解释,因为我真的不太了解它.我知道这是一种处理字符串的方法,但我对这个答案没有信心.此外,我知道我正在研究的项目在分析之前将代码传递给预处理器.有谁能解释一下?当然,如果是静态代码分析,它不需要预处理?
希望有人可以为我清除这一点.
干杯.
我正在编写一个编译器/校对检查器,我想知道,如果我有一个这样的语法树,例如:
data Expr
= Lambdas (Set String) Expr
| Var String
| ...
Run Code Online (Sandbox Code Playgroud)
如果有办法检查Exprs 的alpha等价(等价模重命名).Expr然而,这与lambda演算的不同之处在于lambda中的变量集是可交换的 - 即参数的顺序不会影响检查.
(但是,为了简单起见,与此Lambda ["x","y"] ...不同Lambda ["x"] (Lambda ["y"] ...),在这种情况下,顺序确实很重要).
换句话说,给定两个Exprs,如何才能有效地找到从一个到另一个的重命名?NP-complete这种组合问题的气味.
syntax haskell lambda-calculus np-complete abstract-syntax-tree
我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以产生我需要的AST,但由于我是ANTLR的新手,我该如何让它显示?到目前为止我所做的是将语法文件与我现有的java语法放在一起.但我不知道如何从文件中使用和输出我需要的AST.我该怎么做?
如何将FieldDeclaration(type:ASTNode)转换为IField(type:JavaElement).是否可以从FieldDeclaration ASTNode获取绑定,就像node.resolveBinding()和MethodDeclaration节点一样.
需要:我正在访问具有公共常量的类中的FieldDeclaration节点,并且想要在项目中搜索该字段的引用.我正在使用JDT的SearchEngine.为此,我想创建一个搜索模式,如下所示:
SearchPattern.createPattern(iField, IJavaSearchConstants.REFERENCES);
Run Code Online (Sandbox Code Playgroud)
我已将此问作为对我的一个问题的评论,但没有得到相同的答案.将其作为单独的问题发布.
在此先感谢您的回答.
回答Deepak的回答.
使用您的方法,我可以检索JavaElement,如下所示
List<VariableDeclarationFragment> fragments = node.fragments();
VariableDeclarationFragment fragment = fragments.get(0);
IJavaElement fieldElement = fragment.resolveBinding().getJavaElement();
Run Code Online (Sandbox Code Playgroud)
如果我传递此IJavaElement来创建搜索模式而不是IField,它将返回与IField相同的结果.
在给定抽象语法树的情况下,我被要求编写一个程序来构造输入程序代码的数据流图.我在线搜索数据流图的定义,发现在代码段的数据流分析中有很多事情发生.我想知道我必须绘制什么来构建给定代码的数据流图.很感谢任何形式的帮助!
我想知道是否有一个SCSS(或Sass)解析器,最好用JavaScript编写,它将输出一个抽象语法树.
这些是我正在寻找的完美例子:
更新:我问的原因是我想构建一个工具来强制执行SCSS的特定编码风格,我不能用上面的代码来重新缩进编译的CSS,移动大括号等.
可以像这样采用引用的Elixir表达式(AST树):
quote do: 1 + 1
=> {:+, [context: Elixir, import: Kernel], [1, 1]}
Run Code Online (Sandbox Code Playgroud)
并将其转换为Erlang AST?
我查看了代码模块以及一些寻找功能的内核模块,但是我找不到任何东西.我甚至不确定这是否可能......我不知道如何在Ellang AST中表示像Elixir宏这样的东西.
提前致谢!
我有这个简单的ExprAST,我可以轻松地将其转换为String.
import Prelude hiding (Foldable)
import qualified Prelude
import Data.Foldable as F
import Data.Functor.Foldable
import Data.Monoid
import Control.Comonad.Cofree
data ExprF r = Const Int
| Add r r
deriving ( Show, Eq, Ord, Functor, Prelude.Foldable )
type Expr = Fix ExprF
testExpr = Fix $ Add (Fix (Const 1)) (Fix (Const 2))
convertToString :: Expr -> String
convertToString = cata $ \case
e@(Const x) -> show x
e@(Add x y) -> unwords [x, "+", y]
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个额外的数据.所以我想尝试使用 …
haskell abstract-syntax-tree catamorphism comonad recursion-schemes
我有一个ADT如下:
sealed trait Tree[A]
case object EmptyTree extends Tree[Nothing]
case class Leaf[A](value: A) extends Tree[A]
case class Node[A](op: Seq[A] => A, branches: Tree[A]*) extends Tree[A]
Run Code Online (Sandbox Code Playgroud)
当我尝试构建一个随机创建树的函数时,我遇到了EmptyTree的问题,类型系统不允许通过
def create(acc: Tree[A], currentDepth: Int): Tree[A] = currentDepth match {
case maxDepth => Leaf(terminalSet(r.nextInt(terminalSet.length)))
case 0 => {
val op_pos = r.nextInt(fSetLength)
val branches: Seq[Tree[A]] = for (i <- 0 to r.nextInt(fSetLength)) yield create(EmptyTree, currentDepth+1)
Node(functionSet(op_pos)._1, branches:_*)
}
case _ => {
if (r.nextFloat() <= probF) {
val op_pos = r.nextInt(fSetLength)
val branches = …Run Code Online (Sandbox Code Playgroud) generics scala abstract-data-type covariance abstract-syntax-tree
haskell ×2
java ×2
antlr ×1
beam ×1
c ×1
c++ ×1
catamorphism ×1
comonad ×1
covariance ×1
eclipse-jdt ×1
elixir ×1
erlang ×1
generics ×1
np-complete ×1
parsing ×1
quote ×1
sass ×1
scala ×1
syntax ×1
tree ×1