1
3
以下是一些可能的问题:
编辑 :这是Perl 6的 Synopsis 6: Subroutines ,不幸的是,在标记形式中,因为我找不到更新的格式化版本;在中搜索“宏”。不幸的是,事实并非如此 有趣的是,您可能会发现一些相关的东西,比如Perl6的一次传递解析规则,或者它的抽象语法树语法。Perl 6采用的方法是,宏是一个函数,在解析其参数后立即执行,并返回AST或字符串;Perl6继续解析,就好像源代码实际包含返回值一样。这里提到了错误消息的生成,但它们使宏返回AST时,您似乎可以做得很好。 |
2
2
这将是一个有趣的效果,但它是否有用或可取则是另一个问题。一般来说,即使您现在不调用代码,了解错误也是很好的。 在控件到达宏之前,不会对宏进行求值,解析器自然已经知道所有以前的定义。此外,宏定义甚至可能使用程序到目前为止已经计算过的变量和数据(比如为以前计算过的列表中的所有元素添加一些语法)。但是,对于那些通常也可以直接用这种语言完成的事情,开始编写自修改程序可能不是一个好主意。这可能会让人困惑。。。 在任何情况下,您都应该确保只解析代码一次,如果第二次执行,请使用已解析的表达式,这样就不会导致性能问题。 |
3
2
本文主要研究自然语言的鲁棒性分析。 文本(或者,在您的例子中,是python程序)。如果解析失败,您将有一个部分生成的解析树。使用树结构建议新的语法规则,以更好地覆盖已解析的文本。 我可以把我的论文寄给你,但除非你读希伯来文,否则这可能没用。 我用了一个 bottom-up chart parser . 这种类型的解析器根据语法为产品生成边。每条边都用已消耗的树部分进行标记。每个边根据其接近完全覆盖的程度获得分数,例如:
得分为一半(我们成功地覆盖了NP,但没有覆盖VP)。 一般来说,图表解析器的效率低于普通的LALR或LL解析器(通常用于编程语言的类型)-O(n^3)而不是O(n)复杂度,但是您再次尝试了比解析现有语言更复杂的事情。 我相信看一下自然语言解析器可能会给你一些其他的想法。 |
4
1
我考虑过的另一件事是将此作为默认行为,但允许语言(即一组宏来解析给定语言)在编译时抛出解析错误。例如,在我的系统中,Python2.5可以做到这一点。 代替存根思想,只需重新编译在执行时无法在编译时完全处理的函数。这也将使自修改代码变得更容易,因为您可以修改代码并在运行时重新编译它。 |
5
0
您可能会发现解析算法和lexer以及它们之间的接口都需要更新,这可能会排除大多数编译器创建工具。 (更常见的方法是为此目的使用字符串常量,可以在运行时将其解析为一个小型解释器)。 |
6
0
因此,有一个例子,如果您允许在运行时重新定义语法,您会遇到一个问题(因为按照您的方法,使用M1的代码将由定义D1编译)。请注意,验证是否发生语法重新定义是不可判定的。过近似可以通过某种类型的类型系统或某种其他类型的静态分析来计算,但Python并不为此而广为人知:D。 另一件让我困扰的事情是,你的解决方案“感觉”不对。我发现存储无法解析的源代码是一件坏事,因为您可以在运行时解析它。
从技术上讲,当您使用M1时,您无法解析它,因此您需要将程序的其余部分(包括fun2的函数定义)保留在源代码中。当您运行整个程序时,您将看到对fun2的调用,即使已定义,也无法调用该调用。 |
batman · 如何用特定模式grep特定行及其子网行? 2 年前 |
Jensen Holm · 在非常大的字符串中查找链接时遇到问题 2 年前 |
MBF · PHP导入/解析XML文件内容保存到数据库 2 年前 |
user10717742 · 用java编写的自定义文件解析器需要改进 2 年前 |
Muhsin Muhammed · 向文件中的行添加引号和逗号 2 年前 |
Felkru · 添加字符串会在Javascript中返回空字符串 2 年前 |
Mustard Tiger · 熊猫解析文本列 2 年前 |