【发布时间】:2021-12-27 04:08:26
【问题描述】:
词法输入的识别有几种情况 元素对句法语法上下文敏感,即 消耗输入元素。 这需要多个目标符号 词汇语法。
两个这样的符号是InputElementDiv 和InputElementRegExp。
在 ECMAScript 中,/ 的含义取决于它出现的上下文。根据上下文,/ 可以是除法运算符、正则表达式文字的开头或注释分隔符。词法分析器无法单独区分除法运算符和正则表达式文字,因此它必须依赖来自解析器的上下文信息。
我想了解为什么这需要在词汇语法中使用多个目标符号。我对语言设计了解不多,所以我不知道这是由于语法的某种形式要求还是只是约定。
问题
- 为什么不像这样只使用一个目标符号:
InputElement ::
[...]
DivPunctuator
RegularExpressionLiteral
[...]
让解析器告诉词法分析器使用哪个产生式(DivPunctuator vs RegExLiteral),而不是使用哪个目标符号(InputElementDiv vs InputElementRegExp)?
-
还有哪些其他语言在其词汇语法中使用多个目标符号?
-
我们如何对 ECMAScript 词法文法进行分类?就 CSG 的正式定义而言,它不是上下文敏感的(即其产生式的 LHS 没有被终端和非终端符号的上下文包围)。
【问题讨论】:
-
语法的“目标”和“开始”符号是等价的术语。词法分析器应该独立于解析器工作以提高性能。但是,实际上,大多数主要语言的解析器都可以!词法分析器是一个识别器,它有自己的包含字母、规则和开始符号的语法。在 Antlr4 中,这使用“词法分析器语法”语法是显式的,除了开始符号不是显式的,因为它是一个可以派生任何标记的规则。在 Antlr4 中,您可以使用“模式”切换开始符号。 [grammars-v4](github.com/antlr/grammars-v4) 中“模式”的 grep。
标签: parsing programming-languages grammar context-free-grammar context-sensitive-grammar