标签: abstract-syntax-tree

如何迭代 Pandoc 的 lua-filter 函数中的列表项?

Pandoc 的lua 过滤器使得迭代文档和修改文档变得非常容易。我的问题是我不知道如何隔离列表项元素。我可以在每个列表项中找到列表和块级内容,但我无法找到迭代列表项的方法。

例如,假设我有以下 Markdown 文档:

1.  One string

    Two string

2.  Three string

    Four string
Run Code Online (Sandbox Code Playgroud)

假设我想将每个列表项的第一行设为粗体。我可以轻松更改 OrderedLists 中段落的处理方式,例如使用此过滤器和pandoc --lua-filter=myfilter.lua --to=markdown input.md

1.  One string

    Two string

2.  Three string

    Four string
Run Code Online (Sandbox Code Playgroud)

这确实会将第一个段落元素更改为粗体,但它只会更改第一个列表项的第一段,因为它会遍历列表中所有列表项中的所有段落,而不是遍历每个列表项,然后遍历每个段落。

1.  **One string**

    Two string

2.  Three string

    Four string
Run Code Online (Sandbox Code Playgroud)

如果我再次将两个列表项分成两个单独的列表,第一个项目的第一段将被捕获,但我想捕获每个列表项的第一段!我在文档中找不到有关迭代列表项的任何内容。一个人应该怎样做呢?

lua abstract-syntax-tree pandoc

3
推荐指数
1
解决办法
1319
查看次数

如何在遍历过程中从 Babel 节点获取字符串形式的代码

在下面的代码中,是否可以获得 AST 节点的整个字符串表示形式,在这种情况下会返回window.alert('asdf')

const ast = parse("window.alert('asdf')")

let preloadCode = ""
traverse(ast, {
  CallExpression: function(path) {
    // path.node.toString() ??
  },
})
Run Code Online (Sandbox Code Playgroud)

javascript traversal abstract-syntax-tree babeljs

3
推荐指数
1
解决办法
3556
查看次数

使用groovy AST Transform修改java

是否可以使用groovy ast转换代码来操作java类?

如果是,请举个例子.

如果不是,请说明原因.

java groovy abstract-syntax-tree

2
推荐指数
1
解决办法
2899
查看次数

在ANTLR中生成简单AST

我正在玩ANTLR,并希望创建一个这样的函数:

MOVE x y z pitch roll
Run Code Online (Sandbox Code Playgroud)

这会产生以下AST:

 MOVE
   |---x
   |---y
   |---z
   |---pitch
   |---roll
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试过没有运气,并且我不断让AST将参数作为兄弟姐妹,而不是孩子.

代码到目前为止:

C#:

class Program
{
    const string CRLF = "\r\n";

    static void Main(string[] args)
    {
        string filename = "Script.txt";

        var reader = new StreamReader(filename);
        var input = new ANTLRReaderStream(reader);
        var lexer = new ScorBotScriptLexer(input);
        var tokens = new CommonTokenStream(lexer);
        var parser = new ScorBotScriptParser(tokens);

        var result = parser.program();
        var tree = result.Tree as CommonTree;
        Print(tree, "");

        Console.Read();
    }

    static void Print(CommonTree tree, string indent)
    { …
Run Code Online (Sandbox Code Playgroud)

antlr abstract-syntax-tree antlrworks antlr3

2
推荐指数
1
解决办法
3165
查看次数

clang-query和CXXMemberCallExpr匹配器

我试图找到如何使用CXXMemberCallExpr使用具有clang查询的匹配器

我已经尝试了各种情况排列,但无法让它发挥作用.看起来第一个char与转储相比较低,因此例如FunctionDecl在clang-query中变为functionDecl

如果-ast-dump匹配器名称与clang-query名称匹配会很好 - 但是猜测它们没有

例如.

clang-query> match CXXMemberCallExpr()
1:2: Matcher not found: CXXMemberCallExpr
clang-query> match cxxmemberCallExpr()
1:2: Matcher not found: cxxmemberCallExpr
clang-query> match CxxMemberCallExpr()
1:2: Matcher not found: CxxMemberCallExpr
clang-query> match CXXmemberCallExpr()
1:2: Matcher not found: CXXmemberCallExpr
clang-query> match cxxMemberCallExpr()
1:2: Matcher not found: cxxMemberCallExpr
Run Code Online (Sandbox Code Playgroud)

如果人们想要帮助更多我想创建一个匹配到Virtual :: foo(),所以所有调用基类的虚函数.

这是我试图使用的代码

class Virtual
{
   public:
      virtual void foo()
      {
      }
};

class Real : public Virtual
{
   public:
      virtual void foo()
      {
      }
};

void bar()
{
   Virtual *v=new Real();
   Real …
Run Code Online (Sandbox Code Playgroud)

c++ matcher clang abstract-syntax-tree

2
推荐指数
1
解决办法
1138
查看次数

使用Haskell的简单解释器

我还在学习Haskell,这个问题看起来非常基本,但它一直困扰着我.

鉴于以下内容

data Term =
    Number Integer
  | Abs Term
  | Plus Term Term
  | Mult Term Term
  deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

我想创建一个解释器,如果我打电话,例如,

evaluate (Plus (Number 10) (Number 10))
Run Code Online (Sandbox Code Playgroud)

它将返回20.以下是我到目前为止的情况

myabsolute :: Integer -> Integer
myabsolute n = if n >= 0 then n else -n

evaluate :: Term -> Integer
evaluate Plus = evaluate(t1) + evaluate(t2)
evaluate Mult = evaluate(t1) * evaluate(t2)
evaluate Abs = myabs(evaluate(t1))
evaluate _ = 0 
Run Code Online (Sandbox Code Playgroud)

我很困惑,如何让Number Integer一部分工作,因为我不知道如何提取号码,并将其映射到t1t2Plus, …

interpreter haskell abstract-syntax-tree

2
推荐指数
1
解决办法
95
查看次数

解析Python函数的类名

我试图找到调用函数名称的类名.

例如,假设我有:

class foo1(object):
    bar1()

class foo2(object):
    bar2()

class foo3(object):
    bar3()
Run Code Online (Sandbox Code Playgroud)

如果我正在搜索bar2()我想收到:

class foo2(object):
    bar2()
Run Code Online (Sandbox Code Playgroud)

我试过正则表达式class[\s\S]*bar2\(\)(?!class)的想法是,我会对另一个类的外观负面预测.不幸的是,[\ s\S]似乎已经匹配所有内容:https://regex101.com/r/kZ7eE5/1

有没有办法匹配,如果"class"只出现一次匹配所有其他字符(包括新行和制表符)?

也可以接受不需要正则表达式的替代方案.

python regex abstract-syntax-tree

2
推荐指数
1
解决办法
698
查看次数

使用JDT解析工作空间时出现"Workspace已关闭"错误

我想编写一个Java应用程序,它在我的工作区中显示项目的所有名称.但我的程序总是注意如下.

Exception in thread "main" java.lang.IllegalStateException: Workspace is closed.
at org.eclipse.core.resources.ResourcesPlugin.getWorkspace(ResourcesPlugin.java:411)
at myPackage.ProjectVisitor.<init>(ProjectVisitor.java:9)
at myPackage.ProjectVisitor.main(ProjectVisitor.java:16)
Run Code Online (Sandbox Code Playgroud)

以下是我创建自己的应用程序的步骤:

  1. 安装Java开发工具(JDT)

  2. 创建一个满足以下所有选项的空白eclipse插件:

    • Eclipse版本:3.5或更高版本
    • 执行环境:JavaSE-1.8
    • 富客户端应用程序?(选择NO)
  3. 添加名为org.eclipse.core.resources_3.10.1.v20150725-1910.jar的 .jar

  4. 按如下方式创建ProjectVisitor.java.

    import org.eclipse.core.resources.IProject;
    import org.eclipse.core.resources.ResourcesPlugin;
    public class ProjectVisitor {
        public ProjectVisitor() {
            IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
            for (IProject project : projects) {
                // do something to display its name
            }
        }
        public static void main(String[] args) {
            ProjectVisitor m = new ProjectVisitor();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 作为"Java应用程序"运行.

请帮我.提前致谢.

java eclipse-plugin abstract-syntax-tree eclipse-jdt

2
推荐指数
1
解决办法
593
查看次数

如何使用Babel.js将导入语句插入AST?

我试图使用Babel.js将ImportDeclaration插入JavaScript代码段中:

const babel = require('babel-core')
const t = babel.types
const traverse = babel.traverse
const template = babel.template
const generate = require('babel-generator').default

const babylon = require('babylon')

const code = [
  "import A from 'a'",
  "import B from 'b'",
  "export default {",
  "  components: {",
  "  },",
  "  methods: {",
  "    init () {",
  "    }",
  "  }",
  "}"
].join("\n")
console.log(code)
const ast = babylon.parse(code, {
  sourceType: 'module'
})
var n = []
traverse(ast, {
  ImportDeclaration: {
    exit(path) {
      n.push(path)
    }
  } …
Run Code Online (Sandbox Code Playgroud)

javascript abstract-syntax-tree babeljs

2
推荐指数
1
解决办法
1015
查看次数

Haskell中的解析函数,制作地图函数时遇到麻烦

我是Haskell的新手,正在从事一项工作,我试图为一种简单的计算器语言提供解析功能。

我已经获得了语法,并且不允许更改它。我试图通过遍历字符串并递归使用解析函数来解决它。

语法应该是

Expr -> Int | -Expr | + Expr Expr | * Expr Expr
Int -> Digit | Digit Int 
Digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Run Code Online (Sandbox Code Playgroud)

因此,我的函数将使用Expr语言的字符串作为参数,并以这种格式生成抽象语法树

data Ast = Tall Int | Sum Ast Ast | Mult Ast Ast| Min Ast| Var String deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

Ast应该是抽象的语法树

这就是到目前为止我的解析功能

parseEx :: [String] -> (Ast, [String])
parseEx [] = error "empty string"
parseEx (s:ss) …
Run Code Online (Sandbox Code Playgroud)

string parsing haskell abstract-syntax-tree

2
推荐指数
1
解决办法
92
查看次数