Programming languages 确定两种语言中是否有一种不明确?

Programming languages 确定两种语言中是否有一种不明确?,programming-languages,Programming Languages,我正在读这本书:语言的形式语法和语义 编程语言。我不明白这个练习: 考虑以下两个语法,每个语法生成 正确平衡的括号和括号。确定其中一个或两个 这是模棱两可的。希腊字母ε表示一个空字符串 ::=|()|[]ε ::=()|[]ε 第一个是模棱两可的,第二个不是。这是一个关于如何将上下文无关语法(CFG)转换为解析树的问题。在第一个CFG中,第一个结果是歧义的来源。如果我写字符串“()”,则不清楚该字符串的哪个部分可以匹配左侧非端子,哪个部分可以匹配右侧非端子 该字符串的一个有效解析树是,前两个字符

我正在读这本书:语言的形式语法和语义 编程语言。我不明白这个练习:

考虑以下两个语法,每个语法生成 正确平衡的括号和括号。确定其中一个或两个 这是模棱两可的。希腊字母
ε
表示一个空字符串

  • ::=|()|[]ε

  • ::=()|[]ε


  • 第一个是模棱两可的,第二个不是。这是一个关于如何将上下文无关语法(CFG)转换为解析树的问题。在第一个CFG中,第一个结果是歧义的来源。如果我写字符串“()”,则不清楚该字符串的哪个部分可以匹配左侧非端子,哪个部分可以匹配右侧非端子

    该字符串的一个有效解析树是,前两个字符“()”与第一个非终端匹配,然后与第二个产品匹配,其余字符串“()()”与右侧非终端匹配,后者再次与第一个产品匹配

    另一个有效的解析树是,前四个字符“()()”与左侧非终结符匹配,其余的“()”与右侧非终结符匹配。两者都同样有效,因此存在歧义。像LR解析器这样的解析器工具称之为移位/减少冲突

    如果您只想查看字符串是否属于某种语言,那么这绝对没有问题。如果任何解析都有效,那么您就很好了。但是,如果您试图创建一个解析树来用作编程语言的抽象语法树,那么这确实会产生问题

    为了说明为什么解析语言时会出现问题,请看一下这个示例

     <expression> ::= <expression> <expression> | <expression> + <expression> | <expression> * <expression>
    
    ::=|+|*
    
    如何解析“1+2*3”?是“(1+2)*3”还是“1+(2*3)”?我给出的语法有移位/减少冲突,因此没有指定。大多数LR解析工具将自动为您解决此冲突。这是危险的,因为如果我正在编写一种编程语言,那么程序员应该对它有一个明确的理解。由于这是一个典型的算术表达式,我们可能应该遵循数学惯例,并让答案为“1+(2*3)”


    解决方案是重写语法,使其明确无误,或者许多解析器工具也只允许我们显式地指定词法符号的关联性和优先级,这对于保持语法清晰易读非常方便。

    第一个是不明确的,第二个不是。这是一个关于如何将上下文无关语法(CFG)转换为解析树的问题。在第一个CFG中,第一个结果是歧义的来源。如果我写字符串“()”,则不清楚该字符串的哪个部分可以匹配左侧非端子,哪个部分可以匹配右侧非端子

    该字符串的一个有效解析树是,前两个字符“()”与第一个非终端匹配,然后与第二个产品匹配,其余字符串“()()”与右侧非终端匹配,后者再次与第一个产品匹配

    另一个有效的解析树是,前四个字符“()()”与左侧非终结符匹配,其余的“()”与右侧非终结符匹配。两者都同样有效,因此存在歧义。像LR解析器这样的解析器工具称之为移位/减少冲突

    如果您只想查看字符串是否属于某种语言,那么这绝对没有问题。如果任何解析都有效,那么您就很好了。但是,如果您试图创建一个解析树来用作编程语言的抽象语法树,那么这确实会产生问题

    为了说明为什么解析语言时会出现问题,请看一下这个示例

     <expression> ::= <expression> <expression> | <expression> + <expression> | <expression> * <expression>
    
    ::=|+|*
    
    如何解析“1+2*3”?是“(1+2)*3”还是“1+(2*3)”?我给出的语法有移位/减少冲突,因此没有指定。大多数LR解析工具将自动为您解决此冲突。这是危险的,因为如果我正在编写一种编程语言,那么程序员应该对它有一个明确的理解。由于这是一个典型的算术表达式,我们可能应该遵循数学惯例,并让答案为“1+(2*3)”


    解决方案是重写语法,使其明确无误,或者许多解析器工具也只允许我们显式指定词法符号的关联性和优先级,这对于保持语法的可读性非常方便。

    属于on或@280Z28绝对不属于on,这只适用于研究层面的问题。它的主题是关于它的位置。属于或@280Z28绝对不属于,这只是研究级的问题。这是关于它在哪里的话题。