C#和Java语法是否为LALR(x)?

C#和Java语法是否为LALR(x)?,第1张

C#和Java语法是否为LALR(x)?

您必须先为语言指定一种特定的语法才能提出这个问题,有些语法可能是,有些语法可能没有。

也许您的意思是最近的Java规范中发布的Java语法。您是指Java 7吗?

我不确定您是否可以为C#指定一种特定的语法,至少不是Microsoft的一种,尤其是对于C#4.0;我认为他们没有发表语法。

我可以告诉你,我不认为C#可以是LALR(x),因为它具有一些看起来像标识符的元素,但在某些上下文中可以是关键字。这要求词法分析器知道解析器将要确定的是类似标识符的标记是关键字还是just和identifier。因此,必须有从解析器到词法分析器的反馈,否则词法分析器必须产生两个标记并将它们传递给解析器,以决定要使用哪个标记。LALR解析器是在没有任何反馈的令牌流上定义的,每个输入令牌只有一个解释。

我不认为Java是从Java 1.5或更高版本开始的,当时 enum 是使用其自己的关键字作为特殊类型引入的。这是因为,对于Java
1.5编译器来说,要处理使用 enum 作为变量名的现有Java 1.4程序,在某些情况下必须将 enum 视为关键字,而在其他情况下则必须将
enum 视为变量名。因此,Java 1.5解析器具有与C#相同的问题。

实际上,LALR(1)并没有真正的语言[第一版Java可能是例外],并且构建真正的解析器(尤其是LALR)的任何人都必须采取某种措施来解决此问题。(GCC长期以来一直使用带有可怕的符号表破解的LALR解析器来解析C
++,因此它可以区分标识符(作为变量)和标识符(作为typedef实例)之间的区别。它现在具有某种手动实现的特性递归下降解析器,但我认为可怕的漏洞仍然存在)。因此,我不确定回答您问题的价值。

我们的语言前端家族的C#4.0和Java
7成员都使用GLR解析器解析语言,不仅具有反馈功能,而且还具有处理同一标记的两种解释的能力。GLR提出了LALR(x)的问题,反馈和多种解释也使我们能够处理许多纯GLR无法提供的语言。

编辑:经过一番思考,可能会有一种真正丑陋的方式来使两个语法都处理其上下文关键字。让我们以Java的枚举为例。实际上必须有语法规则:

  type = 'enum' '{'  enum_members '}' ;

但是我们还需要允许“枚举”作为标识。我们可以通过将终端令牌 标识符 替换为非终端来做到这一点 :

  identifier = IDENTIFIER | 'enum' ;

并坚持认为标识符是词法分析器生成的终端。现在,至少词法分析器不必决定如何处理 枚举
。解析器可以。但是您指定的语法必须像这样成形,以便甚至有可能成为LALR(x)。

我们的解析器过去常常这样做,以允许某些关键字有时用作标识符。如前所述,我们更改了解析引擎,不再赘述。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5499671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存