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

JLS语法如何匹配简单字段访问(obj.f)?

冯福
2023-03-14
问题内容

我正在查看JLS第19章的语法,试图找出如何解析简单的字段访问:

obj.field

在我看来,可能涉及 FieldAccess 生产的第一个变体

FieldAccess

. 标识符
super . 标识符
类型名称 . super . 标识符

然后该 Primary 应该参与解析该obj部分。 Primary 似乎不参与解析像 ExpressionName
这样的简单引用。这似乎可以通过 PostfixExpression实现

PostfixExpression

主要
ExpressionName
PostIncrementExpression
PostDecrementExpression

并且,AFAICT, PostfixExpression 不能与 Primary 一起进行左递归。

我想念什么吗?

有一些其他的方式,一个 上降至最低点 ExpressionNameAmbiguousName

编辑:

我制作了语法中非终结点之间关系的DOT→SVG图。如果边缘为蓝色,则非终结符在箭头的后面的非终结符的开始处有一个左递归用法。


问题答案:

好了,正如您已经指出的,obj它不是 主要对象 ,因此,生产 主要. 标识符
不适用于obj.field。由于不super涉及任何密钥,因此其他替代方法也不适用,因此整个 FieldAccess 也不适用。

不必担心,因为这只是一个命名的语法规则,而不是让Java源代码访问字段的必要要求。

您还注意到, PostfixExpression 包括 Primary ,但不仅如此,它还包括 ExpressionName

ExpressionName:
    Identifier 
    AmbiguousName . Identifier

AmbiguousName:
    Identifier 
    AmbiguousName . Identifier

因此obj.field匹配 ExpressionName ,因此匹配 PostfixExpression 。现在,从 Expression
PostfixExpression 都有很长的生产链,其中包含了整个运算符优先级规则,但是简单地说,在允许 Expression的
任何地方都允许 PostfixExpression 。 __

有一个明显的差异,即 分配

Assignment:
    LeftHandSide AssignmentOperator Expression

LeftHandSide:
    ExpressionName 
    FieldAccess 
    ArrayAccess

分配是表达式,因此它们也可能出现在分配的右侧,但是左侧是特殊的。在那里,我们看到 FieldAccess
,到obj.field(unintuitively)不属于,以及 ExpressionName ,其obj.field匹配。

记住这一点也许会有所帮助,当obj.field解析时,解析器不知道这是字段访问。也可能obj是一个包,field是一个类名,或者obj是一个类名,并且field是一个内部类名。周围的上下文将要求将其解析为字段(并且仍然可能是static类中的字段obj)。

FieldAccess 生产列出了这些案例,明确地是现场访问,在解析时识别,而不看其周围的环境。



 类似资料:
  • 问题内容: 我想测试对象的特定字段是否与我指定的值匹配。在这种情况下,它是S3Bucket对象内的存储桶名称。据我所知,我需要为此编写一个自定义匹配器: 如果有一个更简单的方法可以做到这一点,那就好了: 谁能指出我类似的东西?我想在这种情况下我已经解决了我的问题,但这不是我第一次希望采用一种更简单的方法。 问题答案: 另外,对于更类型安全的版本,还有FeatureMatcher。在这种情况下,类似

  • 我想要找到一个文件的名称包含'Bob',并有一个位置在'paducah'或'smyrna'。 以下是我现在所拥有的: 我知道问题出在location数组上,因为如果我将它改为一个没有数组的元素,那么查询就可以正常工作。 这是我能找到的最接近的答案。 它没有工作,我收到以下错误: [term]查询格式错误,应为[END_OBJECT],但找到[FIELD_NAME]

  • 就Spring security而言,它对我来说是全新的。我在网上找到了许多描述如何设置基本安全性的资源,并且能够让HTTPS REST调用在服务器端使用以下配置: 在我看来,这段代码允许访问路径及其下的任何内容,但似乎恰恰相反。我错过了什么? 注意:我要提到的另一件事是,目前没有“用户”身份验证。“客户端”不是基于web的,而是一个单独的Spring Boot服务,它有自己的客户端安全配置。 更

  • 可以通过访问键和结构对象来访问结构的各个字段。 语法 (Syntax) 以下是语法。 :key structure-name Parameters - 'key'是结构中的keyvalue。 'structure-name'是各自键的结构。 Return Value - 将返回与键关联的值。 以下程序显示了如何使用它的示例。 例子 (Example) (ns clojure.examples.e

  • 我们现在把注意力转向使用栈解决真正的计算机问题。你会这么写算术表达式 (5+6)*(7+8)/(4+3) 其中括号用于命令操作的执行。你可能也有一些语言的经验,如 Lisp 的构造 (defun square(n) (* n n)) 这段代码定义了一个名为 square 的函数,它将返回参数的 n 的平方。 Lisp 使用大量的圆括号是臭名昭著的。 在这两个例子中,括号必须以匹配的方式

  • 本文向大家介绍Python做简单的字符串匹配详解,包括了Python做简单的字符串匹配详解的使用技巧和注意事项,需要的朋友参考一下 Python做简单的字符串匹配详解  由于需要在半结构化的文本数据中提取一些特定格式的字段、数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理、结构化数据的计算,Python具有与matlab共同的特点:语法简洁、库丰