我不知道Go,我只是研究各种语言的语法.
来自Go常见问题解答:"从BCPL借用一个技巧:分隔语句的分号在正式语法中,但是在任何一行语句结尾处的词法分析器自动注入,而不是前瞻性."
我想知道它是如何完成的,我看了看lex.go但也许我不知道Go足够(实际上很少)但是我没有找到任何对"声明"或"分号"的引用.
那么 - 如何在lexer阶段结束时检测到有效语句甚至没有预测?
您可以查看语言规范:
形式语法使用分号";" 作为许多作品的终结者.Go程序可以使用以下两个规则省略大多数这些分号:
当输入被分解为令牌时,如果该行的最终令牌是,则在非空行的末尾自动将分号插入到令牌流中
- 标识符
 - 整数,浮点,虚数,符文或字符串文字
 - 其中一个关键字是break,continue,fallthrough或return
 - 其中一个运算符和分隔符++, - ,),]或}
 为了允许复杂语句占用一行,在结束")"或"}"之前可以省略分号.
http://golang.org/ref/spec#Semicolons