Java 8 CFG中无法访问的规则?

时间:2014-06-07 15:43:57

标签: java parsing java-8 context-free-grammar formal-languages

也许是一个相当深入的问题,但有人知道为什么在

  

Java LanguageSpecification - Java SE 8 Edition(2014-03-03)

根据生产规则和终端定义了Java 8的正式无上下文语法,并非所有已定义的规则都可以访问?

规范描述了许多规则,例如

  

IfThenStatement:
  if(Expression)Statement

  

AssertStatement:
  断言表达;
  断言表达式:表达式;

这一切都很有道理。

但奇怪的是,某些已定义的规则无法被其他人访问,例如重要规则

  

类型:
  PrimitiveType
  引用类型

总的来说,我计算了以下两条规则:其他人无法访问的规则:

  1. PACKAGENAME
  2. 类型
  3. 如何定义具有无法访问规则的完整Java 8 CFG?

1 个答案:

答案 0 :(得分:6)

规范作者通常会发现根据非终端制定规范规则很方便;然而,有时候,由于技术原因,一些有用的非终端不会用在主语法中。在这种情况下,规范有时会定义相关的非终端,以解决语法形式主义中规范的一些规则。

例如,在这里,Type的规则发送一个非常明确的信号,即所有类型都是基本类型或引用类型。但是语法有许多地方只能引用基本类型,而其他地方需要引用类型。如果Type不可访问,则不一定意味着语法语法不完整;它可能只意味着实际上语法语法中没有地方作者认为引用Type是有用的。如果规范作者认为非终端类型是一种有用的说明工具,那么可以定义非终端类型。

在出现在多个版本中的规范中,有时会出现另一个原因:非终端不再在主语法中使用,但给出了适当的定义以避免破坏任何其他指向非终端的规范,并允许其他规范优雅地升级到包含语法的规范的新版本。

我不知道这些原因中哪些适用于Java 8中的这些非终端,或者是否有其他原因。