【问题标题】:How end of the statement is detected?如何检测语句结束?
【发布时间】:2015-01-27 21:06:20
【问题描述】:

我不会 Go,我只是在研究各种语言的语法。

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

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

那么——你如何在没有前瞻的情况下在词法分析阶段检测到有效语句的末尾?

【问题讨论】:

    标签: go syntax lexer


    【解决方案1】:

    您可以查看语言规范:

    形式语法使用分号“;”作为许多终结者 制作。 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. 为了让复杂语句占据一行,可以在结束“)”或“}”之前省略分号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多