我需要在PHP中将正则表达式解析为它们的组件.我创建正则表达式或执行它们没有问题,但我想显示有关正则表达式的信息(例如列出捕获组,将重复字符附加到它们的目标,......).整个项目是WordPress的一个插件,它提供了有关重写规则的信息,这些规则是具有替换模式的正则表达式,并且可能很难理解.
我自己写了一个简单的实现,它似乎处理我抛出的简单正则表达式并将它们转换为语法树.在我扩展这个例子以支持更多op的正则表达式语法之前,我想知道是否还有其他好的实现我可以看一下.实现语言并不重要.我假设大多数解析器都是为了优化匹配速度而编写的,但这对我来说并不重要,甚至可能会妨碍清晰度.
我正在使用解析器 - 组合器库在Scala中编写一个简单的函数式编程语言.
语法在此处指定:https://github.com/hejfelix/Frase/blob/master/src/main/scala/it/vigtig/lambda/ParserLike.scala
有一件事我无法通过实现来解决:如何将语法定义与转换为AST节点分开?
直接在解析器源中使用接近人类可读的语法真的很酷,特别是考虑到我是项目ATM上唯一的程序员,它可以作为文档.
如何分离语法和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
我想学习计算器的工作原理.例如,假设我们有中缀符号的输入,如下所示:
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算法将其转换为后缀表示法吗?然后,我将如何用后缀表示法解析它?为什么要转换?
是否有教程显示如何构建这些相对简单的计算器?或者有人解释一下吗?
我正在开发一个非常复杂的DSL,我想将其编译成几种高级语言.整个过程一直是学习的经历.编译器是用java编写的.
我想知道是否有人知道代码生成器部分的设计的最佳实践.我目前已将所有内容解析为抽象语法树.
我正在考虑使用模板系统,但我还没有研究过这个方向,因为我希望首先从堆栈溢出中听到一些智慧.
谢谢!
为了更好地理解C++语言和语法的一些细节,我希望能够编写一个小的C++程序,并查看编译器从中生成的AST.
看起来clang过去有这个功能(-emit-asm),但它已经删除了.
今天有一个简单的方法吗?
是否有获取编译器语法树的过程.我们已经分配了一个需要访问typescript语法树的项目(这是开源的,所以我们可以看到整个编译器的代码).但我们不知道如何得到它.我一直在阅读互联网上的一些文章,但我找不到一篇用户友好的文章,或用雷曼的术语写的.我相信有人提到我们需要做的第一步是找到解析步骤.但在那之后我们不知道接下来该做什么.
抱歉,这个菜鸟问题.:)
这是我上一个问题的延续.我想解析一个方程式并按照我得到的方式工作.我想要做的基本上是随机加扰它,所以我得到一个新的等式,它必须也是一个有效的函数.这将用于遗传算法.
这是我开始的地方:
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) 我可以在没有评论的情况下使用AST
import ast
module = ast.parse(open('/path/to/module.py').read())
Run Code Online (Sandbox Code Playgroud)
你能举例说明AST是否保留了评论(以及空白)?
我正在为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