题:
什么是Zephyr ASDL以及它如何与词法分析器和解析器生成器等其他编译器技术相关?
(如果你相当完整,我会很感激,但是当它变得技术性时,指向其他在线参考,因为我对编译器的大部分知识来自于使用yacc和flex,在C中编写一个简单的最大munch lexer,并且看起来起来在网上阅读东西)
问题背景:
我一直在阅读http://docs.python.org/devguide/compiler.html,我遇到了以下几行:
使用Zephyr抽象语法定义语言(ASDL)指定AST节点的规范.
我按照底部的引文找到:http: //www.cs.princeton.edu/research/techreps/TR-554-97.
我在文章中的第一次阅读相当混乱,我希望在再次尝试之前,我可以首先更好地理解ASDL的目的(在编译过程的背景下).
我正在尝试使用该inspect模块,但似乎我不能在内置(本机?)类中使用它,否则我误解了.
我正在使用Python 2.7并尝试使用Python 3.2.
这是有效的:
>>> import inspect
>>> class C:
... def __init__(self,a,b=4):
... self.sum = a + b
...
>>> inspect.getargspec(C.__init__)
ArgSpec(args=['self','a', 'b'], varargs=None, keywords=None, defaults=(4,))
Run Code Online (Sandbox Code Playgroud)
这不起作用:
>>> import inspect
>>> import ast
>>> inspect.getargspec(ast.If.__init__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 813, in getargspec
raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <slot wrapper '__init__' of '_ast.AST' objects> is not a Python function
Run Code Online (Sandbox Code Playgroud)
我想知道是否有另一种技术可以自动获取这些参数?
(在我的例子中,我想到了一个解析Python语法的替代方案,ASDL文件解释了如何使用我在PyPy Project的源代码中看到的代码来初始化AST节点,但我想知道是否还有其他方法)
我正在阅读文档中的这个页面,并注意到它说
这是完整的Python语法,因为它由解析器生成器读取并用于解析Python源文件
但是,我很难找到CPython使用的解析器生成器.那么CPython使用什么解析器生成器呢?是否有其他解析器生成器可以在该页面上进行语法而不进行任何修改?
例如,如果我要创建一个名为“Something”的节点,我想在 Python AST 树中使用它,那么我必须在 Python 源代码中添加哪些更改以及哪些更改才能做到这一点?
我知道我应该从定义 AST 语法的 Python.asdl 开始。然后我应该转向 ast.c。
不幸的是,我不确定我到底需要在 ast.c 文件中进行哪些更改才能实现该节点。
另外,为了简单起见,假设我只想将节点作为占位符,这意味着它除了能够将自身插入到树中之外不应该执行任何操作。
我在ast文档中看到
-- ASDL's 7 builtin types are:
-- identifier, int, string, bytes, object, singleton, constant
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ASDL 代表什么?只是cpython语法吗?
asdl ×5
python ×5
acronym ×1
definition ×1
grammar ×1
inspection ×1
parsing ×1
reflection ×1
syntax ×1
terminology ×1