![]() |
1
4
句法分析不遵循“最大MunCH”规则(选择最长匹配前缀)。事实上,据我所知,ECMA-262并没有指定解析算法,但提供了一个明确的上下文无关语法,可以对其进行解析,例如使用自底向上(LR(k))解析器,除了一些自动分号插入的问题和对跨换行(不是语法标记)的生成的一些限制之外。 但是,如中所述 §5.1.4 ,语法实际上识别语言的超集;附加限制以补充语法的形式提供。 一个澄清:与多个上下文相关的词汇目标符号相关的复杂性使得第一次将输入划分为词条很困难,并且仅将词素组合成解析树。在每一点上都不可能知道正确的词汇目标符号,而不需要至少部分解析,因此很方便地插入句法和词汇分析。实际的解析算法从左到右进行操作,基本上按输入顺序处理词条,因此有可能对需求进行词法分析,只有当解析器需要更多的输入才能继续时才找到一个词位。 但除此之外,你概述的整体结构是正确的。在词法解析中,终端(字符)的最长前缀被聚合成非终端来创建一个LIVEE(根据需要复杂的词汇目标规则);在句法分析中,终端(lexem)聚合为非终端,生成对应于两个语法目标符号之一的单个解析树。 就像现实世界中的语言一样,现实并没有那么干净。除了解析器需要指示哪些词汇目标是必需的之外,还有新行规则和自动分号插入,它们都跨越了词汇和句法分析之间的界限。 “终端”和“非终端”这两个词的用法可能会有点混乱,但我(和ECMA标准)在上下文无关语法中使用它们的标准意义。 上下文无关语法由产品组成,每个产品的形式如下:
标准句法分析模型将句法分析分为词汇和句法两个层次。原始输入是一个字符序列;词法分析将其转换成一个序列的词条,这是句法分析的输入。 标准的上下文无关语法有一个目标符号,它是由语法定义的非终结符之一。如果整个输入可以减少到这个非终端,那么解析就成功了。
使用语义属性扩充符号也很有用;这些属性不会影响解析,但在解析完成后它们会很有用。特别是,解析树是通过将树节点作为属性附加到解析期间从生产创建的每个非终端来构建的,因此,解析的最终结果不是这样的非终端符号(在解析开始之前是已知的),而是附加到非终端的特定实例的语义属性,而每个点的词法扫描的结果是非终结符号及其相关的语义属性;语义属性将是关联的输入序列,或这些字符的某些函数。 在任何情况下,两级解析都包括将词汇级的输出非终结点作为句法级的终端。 |
![]() |
batman · 如何用特定模式grep特定行及其子网行? 2 年前 |
![]() |
Jensen Holm · 在非常大的字符串中查找链接时遇到问题 3 年前 |
![]() |
MBF · PHP导入/解析XML文件内容保存到数据库 3 年前 |
![]() |
user10717742 · 用java编写的自定义文件解析器需要改进 3 年前 |
![]() |
Muhsin Muhammed · 向文件中的行添加引号和逗号 3 年前 |
![]() |
Felkru · 添加字符串会在Javascript中返回空字符串 3 年前 |
![]() |
Mustard Tiger · 熊猫解析文本列 3 年前 |