Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 理论,可逆解析器的例子?_Language Agnostic_Parsing_Code Generation_Theory - Fatal编程技术网

Language agnostic 理论,可逆解析器的例子?

Language agnostic 理论,可逆解析器的例子?,language-agnostic,parsing,code-generation,theory,Language Agnostic,Parsing,Code Generation,Theory,有人知道解析器背后的示例和理论吗?解析器将(可能)采用抽象语法树并生成代码,而不是相反。从数学上讲,至少从直觉上讲,我相信code->AST的函数是可逆的,但我正试图找到这方面的工作/示例。。。除了通常的资源,如龙书等。有什么想法吗?这种东西叫做访客。Is遍历树并执行任何必须执行的操作,例如优化或生成代码。我更喜欢lewap的响应: 找到一种数学方法来表达 访客和您有一个双重到 分析器 但是您要求提供一个示例,所以请尝试使用这个示例:VisualStudio包含一个对称性极好的UML编辑器。它和

有人知道解析器背后的示例和理论吗?解析器将(可能)采用抽象语法树并生成代码,而不是相反。从数学上讲,至少从直觉上讲,我相信code->AST的函数是可逆的,但我正试图找到这方面的工作/示例。。。除了通常的资源,如龙书等。有什么想法吗?

这种东西叫做访客。Is遍历树并执行任何必须执行的操作,例如优化或生成代码。

我更喜欢lewap的响应:

找到一种数学方法来表达 访客和您有一个双重到 分析器


但是您要求提供一个示例,所以请尝试使用这个示例:VisualStudio包含一个对称性极好的UML编辑器。它和编辑器的实现方式,都构成了模型的视图,编辑或者修改模型,导致所有内容保持同步。

我不知道从哪里可以找到更多关于该理论的信息,但是qi(解析器)和(生成器)都有相同的底层结构和语法,因此,这是一个实际的概念实施


生成器端的文档仍然很薄(spirit2在Boost 1.38中是新的,目前仍处于测试阶段),但是有一些karma示例代码,而且库处于工作状态,至少有一些可用。

除了“访问者”之外,“unparser”是web搜索的另一个好关键字。

这听起来很像非优化编译器的后端,其目标语言与源语言相同

一个问题是,您是否要求“未解析”代码与原始代码完全相同,还是仅要求功能等效

例如,输出是否可以使用与原始缩进样式不同的缩进样式?这些信息通常不会存储在AST中,因为它在语义上并不重要


需要注意的一点是自动代码重构工具。

我一直在做这些,并称它们为“DeParse”


如果您还想重新获取空白和注释,那么这只会变得很棘手。您必须将它们塞进解析树,以便在输出时重新生成它们。

实际上,从解析树生成代码比解析代码要简单得多,至少在数学意义上是这样。 有许多语法是不明确的,也就是说,没有唯一的方法来解析它们,但是解析树总是可以以一种独特的方式转换为字符串,以空格为模

对解析器理论进行了很好的描述。

我们坚持认为解析器和解析器反转(称为“prettyprinters”)是对任意语言的机械处理(分析/转换)的“赌注”。它们提供完整的往返:源文本到AST,包含捕获的位置信息(文件/行/列)和注释,AST到合法源文本,包括重新生成原始标记位置(“逼真打印”)或格式良好的(“预打印”)选项,包括重新生成注释

解析器通常由语法和标记的词汇定义组合指定;这些符号通常被编译成高效的解析引擎,DMS为“解析器”端完成了这项工作,正如您所期望的那样。这里的其他人建议,“访问者”是进行预打印的方法,并且,与汇编代码一样,它是在最低抽象级别实现预打印的正确方法。然而,DMS在语法术语(如Latex)上的预印字,使人们能够控制各种语言元素的水平、垂直、嵌入、间隔、连接、层压等位置。DMS将这些元素编译成高效的低级访问者(如其他答案所示),以实现框生成。但就像解析器生成器一样,您不必看到所有难看的细节

DMS有30个以上的集合,用于C++语言、C语言、java语言、C语言、COBOL语言等各种编程语言和形式化符号,如HTML、XML、某些机器的汇编语言、时间属性规范、可组合抽象代数规范等。

< P>“访问者模式”的思想是好的。但是,我应该把“访问者”模式看作一个线性列表模式,或者作为一种通用模式,并为列表、矩阵和树等更具体的情况添加模式。 在web上查找“分层访问者模式”或“树访问者模式”

您有一个树数据结构(“集合”),每次“访问”、“迭代”或“读取”树中的项目时,都希望对数据进行处理


在本例中,您有一个树数据结构,它表示扫描/解析某些源代码的结果。然后读取每个项目的数据,并将其转换为目标代码。

Haskell中有可逆解析的理论、工作实现和示例。图书馆由波瓦克(PawełNowak)负责。请参阅 作为你的出发点。您可以在以下URL中找到示例

有几种“lens语言”允许使用源代码


也可以在Prolog中实现可逆解析器。在SWI Prolog中,谓词将解析树转换为文本,反之亦然。在Prolog中提供了一些可逆解析的附加示例。

您是否考虑到任何实际利益?我是一名研究人员。。。“实用”和“利润”不是我们理解得特别好的词……好吧,让我们这样表达:找到一种数学方法来表达访问者,你就有了解析器的对偶。我想我没什么大不了的。你只要沿着解析树走,边走边把东西打印出来。我是工程师。“实用和利润”这个词我理解得很好,您可以构建解析器和预打印器来支持有商业价值的活动。人们对代码分析器、代码重构工具和代码生成/转换工具非常感兴趣