如何检测到语句的结尾?

时间:2015-01-27 21:06:21

标签: go syntax lexer

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

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

我想知道它是如何完成的,我看了一下lex.go,但也许我不知道Go(实际上很少)但是我没有找到任何对“声明”或“分号”的引用

那么 - 你怎么能在lexer阶段结束时检测到有效语句甚至没有预见?

2 个答案:

答案 0 :(得分:5)

您可以查看语言规范:

  

正式语法使用分号";"作为许多人的终结者   制作。 Go程序可能会使用这些分号省略大多数这些分号   遵循两条规则:

     

当输入被分解为标记时,会自动添加分号   如果是,则在非空行的末尾插入令牌流   line的最终标记是

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

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

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

答案 1 :(得分:2)

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

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

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

  

<强> Semicolons

     

正式语法使用分号“;”作为许多人的终结者   制作。 Go程序可能会使用这些分号省略大多数这些分号   遵循两条规则:

     
      
  1. 当输入被分解为令牌时,如果是非空行的末尾,则分号会自动插入令牌流中   line的最终标记是

         
        
    • 标识符
    •   
    • 整数,浮点,虚数,符文或字符串文字
    •   
    • 其中一个关键字是break,continue,fallthrough或return
    •   
    • 其中一个运算符和分隔符++, - ,),]或}
    •   
  2.   
  3. 要允许复杂语句占用一行,可以在结束“)”或“}”之前省略分号。

  4.