因此,正如标题所述,我的问题很简单。当Java在for循环内使用分号时,如何知道分号是否在for循环中以及何时在行尾?
您可以执行以下操作:读取每一行,将它们转换为单个char流,但是解析器如何知道哪个分号属于for循环,以及哪一行是行尾?
这就是我的意思
String line = bufferedReaderObject.readLine(/*params*/);
char[] stream = line.toCharArray();
但是解析器如何知道
中的分号for(int i = 0; i < j; i++)
不是行尾的分号吗?
编辑: 为了使我的问题更清楚,java在许多不同的地方使用分号(例如:在forloops和终止语句中),如何区分语句终止符和for循环内的分号
注意:在阅读了有关此问题的评论后,for循环条件(在方括号“()”内)内的内容是否也声明?
答案 0 :(得分:1)
解析器没有做任何简单的事情,只要在有分号的地方将程序切成小段即可。并非所有分号都是相同的。解析器通过考虑分号或其他符号之前的全部内容来确定任何特定的分号或任何其他符号意味着什么。换句话说,解析器可以理解上下文 。
因此,for
语句中用于分隔控制表达式的分号不会对语句提供者造成混淆,因为解析器非常清楚它正处于解析for
语句的过程中,在for
语句的中间,分号只是“控制表达式分隔符”,而不是“ statement-ender”。
关于解析器如何完成所有这些操作,这对于如此小的空间来说很复杂。您需要一年的大学课程和一本不错的胖教科书,才能很好地涵盖所有这一切。或者,如果您愿意的话,也可以直接在Wikipedia上使用bottom-up parsing或top-down parsing。
答案 1 :(得分:0)
Java是free-form language,这意味着空格(空格,制表符,换行)没有任何意义。我们使用空格来格式化代码,以便于人类阅读。例如,
$orderIds = Order::query()
->where('product_id', $product->id)
->get(['id'])
->pluck('id');
$orderCategories = OrderCategory::query()
->whereIn('order_id', $orderIds)
->get();
的含义与以下内容完全相同:
for (int i = 0; i < j; i++)
但是我想你会同意,前者对于人类来说更容易理解。但是,编译器将以完全相同的方式处理它们。因此,分号用于分隔行,但它们在Java中具有含义。
编译过程有很多步骤,但是这里有两个相关步骤:(a)lexical analysis,它将代码转换为令牌流(同时丢弃诸如注释和空格之类的元素); (b)parsing,它在寻找语法错误时试图使标记有意义。这些步骤基本上与代码对人类的显示方式无关。
在您的示例中,词法分析器将生成令牌流,例如:
for(int
i=0;i
<j;i
++)
,依此类推。然后解析器将其识别为keyword "for"
left parenthesis
keyword "int"
name "i"
operator equals
number "0"
semi-colon
语句。