如何检测到语句的结尾?

问题描述 投票:1回答:2

我不知道Go,我只是研究各种语言的语法。

来自Go常见问题解答:“从BCPL借用一个技巧:分隔语句的分号在正式语法中,但是在任何一行语句结尾处的词法分析器自动注入,而不是前瞻性。”

我想知道它是怎么做的,我看了一下lex.go,但也许我不知道Go(实际上很少),但我没有找到任何提及“声明”或“分号”。

那么 - 如何在lexer阶段结束时检测到有效语句甚至没有预测?

go syntax lexer
2个回答
5
投票

您可以查看语言规范:

形式语法使用分号“;”作为许多作品的终结者。 Go程序可以使用以下两个规则省略大多数这些分号:

当输入被分解为令牌时,如果该行的最终令牌是,则在非空行的末尾自动将分号插入到令牌流中

  • 标识符
  • 整数,浮点,虚数,符文或字符串文字
  • 其中一个关键字是break,continue,fallthrough或return
  • 其中一个运算符和分隔符++, - ,),]或}

为了允许复杂语句占用一行,在结束“)”或“}”之前可以省略分号。

http://golang.org/ref/spec#Semicolons


2
投票

Go解析器根据Go语法识别句子结构(例如,语句,表达式)。解析器使用由扫描仪(词法分析器)生成的令牌。

分号由扫描程序自动插入令牌流中,因此解析器不会有额外的工作量。分号插入代码可以在Go扫描器中找到here

Go语言规范定义了扫描程序如何插入分号,如下所示;

Semicolons

形式语法使用分号“;”作为许多作品的终结者。 Go程序可以使用以下两个规则省略大多数这些分号:

  1. 当输入被分解为令牌时,如果该行的最终令牌是,则在非空行的末尾自动将分号插入到令牌流中 标识符 整数,浮点,虚数,符文或字符串文字 其中一个关键字是break,continue,fallthrough或return 其中一个运算符和分隔符++, - ,),]或}
  2. 为了允许复杂语句占用一行,在结束“)”或“}”之前可以省略分号。
© www.soinside.com 2019 - 2024. All rights reserved.