Parsing 什么样的语法或语言特性使语言难以解析?

Parsing 什么样的语法或语言特性使语言难以解析?,parsing,syntax,language-features,language-design,syntactic-sugar,Parsing,Syntax,Language Features,Language Design,Syntactic Sugar,我做了一些搜索,没有找到一个“直接”回答这个问题的问题 无论如何,这个问题的基本要点是,我想知道是什么“语言特性”或“语法”使语言成为构建解析器、语法突出显示等的主要难题 这可能是主观的,但我想,比如说,像LISP这样的语言解析与它的(Func PARMS等)结构的区别,就像C++和所有模板一样,括号等等。支持通过宏或其他方式进行语法扩展的语言无法完全解析,除非您能够正确扩展宏。对于具有完整过程宏(如Lisp或Curl)的语言,如果不实现语言本身,就无法完全解析 通常,为了突出显示此类语言的语法

我做了一些搜索,没有找到一个“直接”回答这个问题的问题

无论如何,这个问题的基本要点是,我想知道是什么“语言特性”或“语法”使语言成为构建解析器、语法突出显示等的主要难题


这可能是主观的,但我想,比如说,像LISP这样的语言解析与它的(Func PARMS等)结构的区别,就像C++和所有模板一样,括号等等。

支持通过宏或其他方式进行语法扩展的语言无法完全解析,除非您能够正确扩展宏。对于具有完整过程宏(如Lisp或Curl)的语言,如果不实现语言本身,就无法完全解析


通常,为了突出显示此类语言的语法,您不会尝试扩展宏,并假设宏遵循常规语言习惯用法。

从形式语言和语法的角度来看,有两个主要方面。首先,您的语言的语法应该属于一些易于处理的类别。例如,具有上下文无关语法的语言,这意味着,例如,您的语言有太多的元素,这些元素的计数相互依赖,例如开括号和闭括号,可能需要无限的内存来解析。C++具有上下文敏感语法,更糟的是,语法可以是具有相互依赖的三个元素的语法。另一个方面是关于解析时的歧义。在歧义语法中,您可以用不同的方式解析相同的文本,这意味着您必须为您的解析算法找到正确的方式——大多数语法根本不允许歧义


我不完全确定,但我想说,解析方括号和空格(在合理定义时)同样复杂。对于这两种情况,您都需要一个计数器来检查块嵌套的级别,但是使用空格,您可以在本地识别级别(通过计算空格),并且您可以确保计数器不会低于零,这可能会发生在关闭方括号多于打开方括号的情况下。

Ah这是有意义的!我从未想过支持/解析能够自我扩展语法的语言的问题,这确实是一个棘手的问题。然而,我还想知道一些“更正常”的语法,比如Python的空白与C的括号样式?这将如何影响解析?