当前位置: 首页 > 面试题库 >

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

夏宪
2023-03-14
问题内容

我想知道C#和Java语法是否为LALR(x)?如果是,x的值是多少?

编辑:

接受了正确的答案后,我认为最好以这种方式更改Q:

是否有任何LALR(x)解析器可以解析Java(版本7)或C#(版本4)的当前版本?如果是,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)。

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



 类似资料:
  • 问题内容: Java是否具有在hibernate状态下打开会话时可以使用的using语句? 在C#中,它类似于: 因此,对象超出范围并自动关闭。 问题答案: Java 7引入了自动资源块管理,该功能将该功能引入了Java平台。Java的早期版本没有任何相似之处。 例如,您可以使用以以下方式实现的任何变量: 由流实现的Java 接口自动扩展,因此您可以像在C#块中使用流一样使用块中的流。这等效于C#

  • 本文向大家介绍C#检测DataSet是否为空的方法,包括了C#检测DataSet是否为空的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#检测DataSet是否为空的方法。分享给大家供大家参考。具体如下: 下面的代码片段通过判断DataSet的Table数量来判断DataSet是否为空 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: http://golang.org/ref/spec#Import_declarations “ import”语法是专门用于导入软件包的吗?看起来像一个使用“;”的函数调用 而不是“,”进行参数化。似乎它甚至可能是红宝石风格的方法调用(即:sans“()”) PS 以为我想请他们对此有所了解。我真的很喜欢Go的工作,但是它的某些语法似乎有些不一致,有时有些冗长。我不知道要为它创建一个

  • c中有没有既是一元又是二元的运算符?这个问题在一次采访中被问到。

  • 这行代码是有效的C代码(至少可以编译),但无效的C代码(不能编译)。我知道两种语言之间有差异,但这次是出乎意料的。 我一直认为语法是 但这将使其在两种情况下都有效。 我的问题是: 为什么这个不能用C编译 为什么会存在这种差异

  • 问题内容: 我正在将代码从Java手动转换为C#,并在原始类型(我称之为)方面苦苦挣扎(请参见例如,自动装箱和拆箱在Java和C#中的行为是否不同)。从答案中我了解到(C#)和(C#)是等效的,并且(C#)也可以在容器中使用,例如,作为Dictionary中的键。但是,(Java)不能在HashMap这样的容器中使用,这就是为什么将其自动装箱到(Java)。 是(C#)一个原始或对象? 如果它是原