【问题标题】:BNF for Java Input StatementsJava 输入语句的 BNF
【发布时间】:2015-08-29 16:45:15
【问题描述】:

我正在使用 JDK 7 编写 Java 源代码(.java)到 Java 中的伪代码生成器。我想将输入语句的伪代码格式显示为:

read n

就像我们在 Pascal 中看到的那样。

然而,在 Java 中获取控制台输入的方式有很多种。我的伪代码生成器不过是 Java 语法的解析器。但是我无法设计语法来解析输入语句。

那么谁能告诉我如何为 Java 输入语句编写 BNF 表达式。 如果我的方法是错误的,请提及正确的方法。

【问题讨论】:

  • 看看antlr.org
  • @hege_hegedus 我正在使用 javacc,它是一个类似于 ANTLR 的解析器生成器,但我的问题是开发语法,我使用的几乎所有语法都可以在 [Java 语言规范] 中找到(download.oracle.com /otn-pub/jcp/jls-7-mr3.../JLS-JavaSE7-Full.pdf) 但是没有这样的输入语法。
  • 我不太确定您在寻找什么。 “解析输入语句的语法”到底是什么意思?您是说您找到的语法无法解析读取输入的 Java 程序吗?因为我觉得这很可疑。 Java 中的“输入语句”只是方法调用,当然可用的 Java 语法能够解析方法调用。
  • @sepp2k 绝对我的语法可以解析语句和方法,但我正在寻找一种专门检测输入语句的语法。正如我所说,它将用于生成伪代码。
  • @SwagatoChatterjee 你的意思是语法应该拒绝任何不读取输入的语句吗?你怎么能用这种方式表达任何有用的东西。无论哪种方式,这听起来都不像是应该在语法级别处理的事情。

标签: java compiler-construction bnf javacc


【解决方案1】:

如果我明白你想要什么,你希望有类似的 Java 输入

int k = new Scanner(System.in).nextInt() ;
int m = k * 2 ;
k = k + 1 ;

像这样变成伪代码输出

var k
read k
var m := k * 2
k := k + 1

您至少可以在三个阶段识别“输入语句”。一是在解析期间。另一个是在解析和生成之间(即转换或标记树的分析阶段)。第三个是在生成期间。

在这三个中,我建议第二个或第三个可能是最好的。解析已经足够复杂了。但是如果你真的想在解析的时候做,你可以结合语义和句法的lookahead来做。

void DeclOrInput() :
{}
{
     LOOKAHEAD( Input() ) Input()
|
     LocalDeclStatement()
}

void Input() :
{  }
{  <NEW>
   LOOKAHEAD({ token(1).image.equals("Scanner") } )
   <ID> 
   "("
   LOOKAHEAD( { token(1).image.equals("System") } ) 
   <ID> 
   "."
   LOOKAHEAD( { token(1).image.equals("in") } )
   <ID> 
   ")" "."
   LOOKAHEAD( { token(1).image.equals( "nextInt" ) } )
   <ID> 
   "(" ")" ";"
}

【讨论】:

  • 但是如果有人使用 BufferedReader 会怎样,例如 ' int k=Integer.parseInt(new BufferedReader(new InputStreamReader (System.in)).readLine()); '
  • 您的代码似乎有问题,生成的解析器有错误。Eclipse 告诉我'tk notsolved'。为什么JavaCC 无法生成未声明Token tk 的解析器
  • 我已经编辑了答案以修复@SwagatoChatterjee 提到的编译问题
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多