标签: abstract-syntax-tree

PHP中正则表达式的解析器?

我需要在PHP中将正则表达式解析为它们的组件.我创建正则表达式或执行它们没有问题,但我想显示有关正则表达式的信息(例如列出捕获组,将重复字符附加到它们的目标,......).整个项目是WordPress的一个插件,它提供了有关重写规则的信息,这些规则是具有替换模式的正则表达式,并且可能很难理解.

我自己写了一个简单的实现,它似乎处理我抛出的简单正则表达式并将它们转换为语法树.在我扩展这个例子以支持更多op的正则表达式语法之前,我想知道是否还有其他好的实现我可以看一下.实现语言并不重要.我假设大多数解析器都是为了优化匹配速度而编写的,但这对我来说并不重要,甚至可能会妨碍清晰度.

php regex parsing abstract-syntax-tree

22
推荐指数
3
解决办法
2669
查看次数

解析器组合器,分离语法和AST结构

我正在使用解析器 - 组合器库在Scala中编写一个简单的函数式编程语言.

语法在此处指定:https://github.com/hejfelix/Frase/blob/master/src/main/scala/it/vigtig/lambda/ParserLike.scala

有一件事我无法通过实现来解决:如何将语法定义与转换为AST节点分开?

直接在解析器源中使用接近人类可读的语法真的很酷,特别是考虑到我是项目ATM上唯一的程序员,它可以作为文档.

如何分离语法和AST特定代码?

grammar scala abstract-syntax-tree parser-combinators

22
推荐指数
1
解决办法
1117
查看次数

面向对象编程语言的AST(抽象语法树)是什么样的?

我正在阅读有关AST(抽象语法树)的内容,但我看到的所有示例都使用了以下表达式:

a + b * c 
Run Code Online (Sandbox Code Playgroud)

哪个可以用类似lispy的语法表示为:

(+ a (* b c) )
Run Code Online (Sandbox Code Playgroud)

这相当于:

  +
 / \
a   * 
   / \
  b   c
Run Code Online (Sandbox Code Playgroud)

我的问题是OOPL中一个类的AST会是什么样子?

我天真的尝试是为了这个Java代码:

 class Person { 
     String name;
     int    age;
     public String toString() { 
        return "name";
     }
 }
Run Code Online (Sandbox Code Playgroud)

方法是:

;Hand written
(classDeclaration Person 
     (varDeclaration String name)
     (varDeclaration int    age )
     (funcDeclaration String toString 
           (return "name")
     )
 )
Run Code Online (Sandbox Code Playgroud)

但我不太确定我对真正的AST代表有多近或多远.

这取决于我选择的语言.需要多少细节?这些"xyzDeclaraction"是否需要或可能如下:

 (Person (String name) (int age))
Run Code Online (Sandbox Code Playgroud)

在哪里可以看到实际编程语言的"真实"表示以了解更多信息.

java compiler-construction programming-languages abstract-syntax-tree

21
推荐指数
2
解决办法
6831
查看次数

带括号的简单计算器如何工作?

我想学习计算器的工作原理.例如,假设我们有中缀符号的输入,如下所示:

1 + 2 x 10 - 2

解析器必须遵守数学中的通用规则.在上面的例子中,这意味着:

1 +(2 x 10) - 2 = 19(而不是3 x 10 - 2 = 28)

然后考虑一下:

1 + 2 x((2/9)+ 7) - 2

它是否涉及抽象语法树?二叉树?如何确保操作顺序在数学上是正确的?我必须使用shunting-yard算法将其转换为后缀表示法吗?然后,我将如何用后缀表示法解析它?为什么要转换?

是否有教程显示如何构建这些相对简单的计算器?或者有人解释一下吗?

syntax parsing calculator abstract-syntax-tree

21
推荐指数
1
解决办法
1万
查看次数

从AST生成代码的最佳设计?

我正在开发一个非常复杂的DSL,我想将其编译成几种高级语言.整个过程一直是学习的经历.编译器是用java编写的.

我想知道是否有人知道代码生成器部分的设计的最佳实践.我目前已将所有内容解析为抽象语法树.

我正在考虑使用模板系统,但我还没有研究过这个方向,因为我希望首先从堆栈溢出中听到一些智慧.

谢谢!

java dsl code-generation abstract-syntax-tree

20
推荐指数
2
解决办法
5715
查看次数

从c ++代码中获取人类可读的AST

为了更好地理解C++语言和语法的一些细节,我希望能够编写一个小的C++程序,并查看编译器从中生成的AST.

看起来clang过去有这个功能(-emit-asm),但它已经删除了.

今天有一个简单的方法吗?

c++ abstract-syntax-tree

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

我们如何获得TypeScript的语法树?

是否有获取编译器语法树的过程.我们已经分配了一个需要访问typescript语法树的项目(这是开源的,所以我们可以看到整个编译器的代码).但我们不知道如何得到它.我一直在阅读互联网上的一些文章,但我找不到一篇用户友好的文章,或用雷曼的术语写的.我相信有人提到我们需要做的第一步是找到解析步骤.但在那之后我们不知道接下来该做什么.

抱歉,这个菜鸟问题.:)

abstract-syntax-tree parser-generator lexer typescript

20
推荐指数
2
解决办法
3247
查看次数

改变方程的ast.NodeTransformer的示例

这是我上一个问题的延续.我想解析一个方程式并按照我得到的方式工作.我想要做的基本上是随机加扰它,所以我得到一个新的等式,它必须也是一个有效的函数.这将用于遗传算法.

这是我开始的地方:

class Py2do(ast.NodeTransformer):
def __init__(self):
  self.tree=[]
def generic_visit(self, node):
    print type(node).__name__
    self.tree.append(type(node).__name__)
    ast.NodeVisitor.generic_visit(self, node)
    depth=3
    s = node.__dict__.items()
    s = "    ".join("%s %r" % x for x in sorted(node.__dict__.items()))
    print( "%s%s\t%s" % (depth, str(type(node)), s) )
    for x in ast.iter_child_nodes(node):
      print (x, depth)

def visit_Name(self, node):
    # print 'Name :', node.id
    pass

def visit_Num(self, node):
    print 'Num :', node.__dict__['n']

def visit_Str(self, node):
    print "Str :", node.s

def visit_Print(self, node):
    print "Print :"
    ast.NodeVisitor.generic_visit(self, node)

def visit_Assign(self, node):
    print "Assign …
Run Code Online (Sandbox Code Playgroud)

python genetic-programming abstract-syntax-tree

19
推荐指数
1
解决办法
2176
查看次数

带有保留注释的Python AST

我可以在没有评论的情况下使用AST

import ast
module = ast.parse(open('/path/to/module.py').read())
Run Code Online (Sandbox Code Playgroud)

你能举例说明AST是否保留了评论(以及空白)?

python comments abstract-syntax-tree

18
推荐指数
6
解决办法
4365
查看次数

模拟java.lang.Thread的最佳方法是什么?

我正在为Java 6 *1开发变换器,它执行一种部分评估,但为了简单起见,我们考虑Java程序的抽象语法树解释.

如何Thread通过解释程序模拟行为?

目前,我想到了以下几点:

AstInterpreter应该实现java.lang.Runnable.它还应该重写java.lang.Thread(或其子类)的每个new-instance-expression,用新的AstInterpreter实例替换Thread's target(java.lang.Runnable):

编辑:提供更复杂的示例.

编辑2:备注1.

目标计划:

class PrintDemo {
   public void printCount(){
    try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Counter   ---   "  + i );
         }
     } catch (Exception e) {
         System.out.println("Thread  interrupted.");
     }
   }
}

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;
   PrintDemo  PD;

   ThreadDemo( String name,  PrintDemo …
Run Code Online (Sandbox Code Playgroud)

java multithreading interpreter bytecode abstract-syntax-tree

18
推荐指数
1
解决办法
1477
查看次数