go string 换行_从词法分析角度聊 Go 代码组成

dc0fdb600ecfc20ae6788eaad4297ee8.png

之前的 Go 笔记系列,已经完成到了开发环境搭建,原本接下来的计划就是到语法部分了,但后来一直没有前进。主要是因为当时的工作比较忙,分散了精力,于是就暂时放下了。

最近,准备重新把之前计划捡起来。

第一步,肯定是了解 Go 基础语法部分。原本计划是写 Go 编码的一些基础知识,但纯粹聊什么是关键字、标识符、字面量、操作符实在有点无聊。

突然想到,词法分析这块知识还没仔细研究过,那就从这个角度出发吧。通过逐步地拆解,将各个 token 进行归类。

概述

我们知道,编译型语言(比如 Go)的源码要经过编译和链接才能转化为计算机可以执行的程序,这个过程的第一步就是词法分析。

什么是词法分析呢?

它就是将源代码转化为一个个预先定义的 token。为了便于理解,我们将词法分析分为两个阶段。

第一阶段,对源码串进行扫描,按预先定义的 token 规则进行匹配并切分为一个个有语法含义、最小单元的字符串,即词素(lexme),并在此基础上将其划归为某一类 token。这个阶段,一些字符可能会被过滤掉,比如,空白符、注释等。

第二阶段,通过评估器 Evaluator 评估扫描出来的词素,并确定它字面值,生成最终的 Token。

是不是有点不好理解呢?

如果之前从未接触过这块内容,可能没有直观感受。其实,看着很复杂,但的确非常简单。

一个简单的示例

先看一段代码,经典的 hello world,如下:

package main

import "fmt"

func main() {
fmt.Println("Hello World")
}

我们可以通过这个例子的源码逐步拆解词法分析的整个流程。

什么是词素

理论性的概念就不说了,直接看效果吧。

首先,将这段示例代码通过词法分析的第一阶段,我们将会得到如下内容:

package
main
\n
import
"fmt"
\n
func
main
(
)
{
\n
fmt
.
Println
(
"Hello World"
)
\n
}

输出的这一个个独立的字符序列就是词素。

词素的切分规划和语言的语法规则有关。此处的输出中除了一些可见的字符,换行符同样也具有语法含义,因为 Go 不像 C/C++ 必须是分号分隔语句,也可以通过换行符分隔。

源码分割为一个个词素的过程是有一定的规则的,这和具体的语言有关。但虽有差异,其实规则都差不多,无非两种,一是通过无语法含义的字符(空格符、制表符等)切分,还有是每个词素可以用作为分隔符。

什么是 token

token,也称为词法单元、记号等,它由名称和字面值两部分组成。从词素到 token 有固定的对应关系,而且并非所有的 token 都有字面值。

将 hello world 的源码转化为 token,我们将会得到如下的一张对应表格。

lexmenamevalue
packagePACKAGE"package"
mainIDENT"main"
\nSEMICOLON"\n"
importIMPORT"import"
"fmt"STRING"\"fmt\""
\nSEMICOLON"\n"
funcFUNC"func"
mainIDENT"main"
(LPAREN""
)RPAREN""
{LBRACE""
fmtIDENT"fmt"
.PERIOD""
PrintlnIDENT"Println"
(LPAREN""
"Hello World"STRING""Hello World""
)RPAREN""
\nSEMICOLON"\n"
}LBRACE""
\nSEMICOLON"\n"

稍微有点长,因为这里没有省略。表格中的第一列是原始内容,第二列对应的 token 的名称,最后一列是 token 的字面值。

从表格中可以观察出,其中有一些 token 并没有值,比如,括号、点,名称本身已经表示了它们的内容。

token 的分类

token 一般可以分为关键字、标识符、字面量、操作符这四个大类。这个分类其实在 Go 的源码中有非常明显的体现。

查看源码文件 src/go/token/token.go[1],将会找到 Token 类型如下的几个方法。

// 是否是字面常量
func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end }
// 是否是操作符
func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end }
// 是否是关键字
func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end }

代码非常简单,通过比较确定 Token 是否位于指定范围确定它的类型。上面的这三个方法分别对应于判断 Token 是字面常量、操作符还是关键字。

额?怎么没有标识符呢?

当然也有啦,只不过它不是 Token 的方法,而是单独的一个函数。如下:

func IsIdentifier(name string) bool {
for i, c := range name {
if !unicode.IsLetter(c) && c != '_' && (i == 0 || !unicode.IsDigit(c)) {
return false
}
}
return name != "" && !IsKeyword(name)
}

我们常说的变量、常量、函数、方法的名称不能为关键字,且必须是由字母、下划线或数字组成,且名称的开头不能为数字的规则,看到这个函数是不是一些就明白了。

到这里,其实已经写的差不多了。但想想还是拿其中一个类型再简单说说吧。

关键字

就以关键字为例吧,Go 中的关键字有哪些呢?

继续看源码。将之前那段如何判断一个 token 是关键字的代码再看一遍。如下:

func (tok Token) IsKeyword() bool {
return keyword_beg < tok && tok < keyword_end
}

只要 Token 大于 keyword_beg 且小于 keyword_end 即为关键字,看起来还挺好理解的。那在 keyword_beg 和 keyword_end 之间有哪些关键字呢?代码如下:

const (
...
keyword_beg
// Keywords
BREAK
CASE
CHAN
CONST
CONTINUE

...

SELECT
STRUCT
SWITCH
TYPE
VAR
keyword_end
...
)

总共梳理出了 25 个关键字。如下:

break       case        chan    const       continue
default defer else fallthrough for
func go goto if importinterface map package range returnselect struct switch type var

关键字的确挺少的。可见。。。

嗯?!

是不是猜到我要说,Go 语言就是简洁,关键字的都这么少。你看 Java,足足有 53 个关键字,其中有两个是保留字,而 Go 并没有保留字,自信!

既然你猜到了,那我还是先不说了吧。

其他

操作符和字面常量就不追了,思路都是一样的。

Go 中的操作符有 47 个,比如赋值运算符、位运算符、算术运算符,比较运算符,还有其他的操作符。相信我吧,都是从源码中数出来的,没有看任何资料。[此处应该放个捂脸笑]。

字面常量呢?有 5 种类型,分别是 INT(整型)、FLOAT(浮点型)、IMG(复数类型)、CHAR(字符型)、STRING(字符串型),

总结

文章写完了,前面扯了那么一堆废话,其实就只是为了介绍 Go 语法中用到的关键字、标识符、运算符、字面量从哪里找。并且,最终它们如何使用也没有怎么说明。

纯粹为了好玩吗?当然不是(是)。因为。。。,先不剧透了,避免后面尴尬。

阅读资料

Go 程序是怎么跑起来的[2]

go-lexer 词法分析[3]

Lexical analysis[4]

词法分析[5]


喜欢本文的朋友,欢迎关注“Go语言中文网”:

eb4f47625cc6399c8cdd388882ae9f6e.png

参考资料

[1]

src/go/token/token.go: https://github.com/golang/go/blob/master/src/go/token/token.go

[2]

Go 程序是怎么跑起来的: https://zhuanlan.zhihu.com/p/71993748

[3]

go-lexer 词法分析: https://studygolang.com/articles/6708

[4]

Lexical analysis: https://en.wikipedia.org/wiki/Lexical_analysis#Evaluator

[5]

词法分析: https://cs.nju.edu.cn/changxu/2_compiler/slides/Chapter_3.pdf

电影评价情感分析 前言本模块将使用IMDB情绪分析数据集,数据集包含100,000条正面和负面的多段电影评论。利用NLP技术来预测电影评论是正向情绪还是负面情绪。什么是NLP?NLP(自然语言处理)是一种... 阅读详情

相关推荐

《自然语言处理入门》12.依存句法分析--提取用户评论

文章目录12. 依存句法分析12.1 短语结构树12.2 依存句法树12.3 依存句法分析12.4 基于转移的依存句法分析12.5 依存句法分析 API12.6 案例: 基于依存句法分析的意见抽取12.7 GitHub 笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 12. 依存句法分析 语法分析(syntactic parsi...

mantch 3623

ROST情感分析的语法规则_从词法分析角度聊 Go 代码组成

之前的 Go 笔记系列,已经完成到了开发环境搭建,原本接下来的计划就是到语法部分了,但后来一直没有前进。主要是因为当时的工作比较忙,分散了精力,于是就暂时放下了。最近,准备重新把之前计划捡起来。第一步,肯定是了解 Go 基础语法部分。原本计划是写 Go 编码的一些基础知识,但纯粹聊什么是关键字、标识符、字面量、操作符实在有点无聊。突然想到,词法分析这块知识还没仔细研究过,那就从这个角度出...

weixin_40002692的博客 1039

ROSTEA软件下载及情感分析详细操作教程(附网盘链接)

原ROST虚拟团队出品的ROST系列文本内容挖掘分析平台,是辅助人文社会科学研究的免费计算平台。该软件可以实现文本预处理、分字、分词、词性识别、特殊名词抽取、词频统计、英文词频统计、情感计算、分类算法、聚类算法等一系列文本挖掘,是人文社科研究和论文写作的一把利器。该软件用户量超过一万人,遍布海内外100多所大学,包括剑桥大学、日本北海道大学、北京大学、清华大学、香港城市大学、澳门大学等众多高校。关于ROSTCM6的安装介绍可以参考之前的文章ROSTCM6软件下载及语义网络分析详细操作教程ROST EA。

m0_64336780的博客 1万+

go string 换行_Go 笔记之从词法分析角度聊 Go 代码组成

之前的 Go 笔记系列,已经完成到了开发环境搭建,原本接下来的计划就是到语法部分了,但后来一直没有前进。主要是因为当时的工作比较忙,分散了精力,于是就暂时放下了。最近,准备重新把之前计划捡起来。第一步,肯定是了解 Go 基础语法部分。原本计划是写 Go 编码的一些基础知识,但纯粹聊什么是关键字、标识符、字面量、操作符实在有点无聊。突然想到,词法分析这块知识还没仔细研究过,那就从这个角度出发吧。通过...

weixin_33134753的博客 177

rostea文本感情分析工具

rostea文本感情分析工具,文本情感计算工具

c++程序好玩的源代码

一些很有意思的c++程序源代码,供初学者使用。可为学习增添很多乐趣。

go smtp 返回eof_深入挖掘分析Go代码

文章目录写在前面AST如何生成AST词法分析揭开解析API的面纱Scanner.Scan()分析写在后面微信公众号:[double12gzh]关注容器技术、关注Kubernetes。问题或建议,请公众号留言。写在前面本文基于GoLang 1.14在语法层面对源代码进行分析,可以通过多种方式帮助你进行编码。为此,几乎总是先将文本转换成AST,以便在大多数语言中更容易处理。可能有些人知道,...

weixin_30155853的博客 972

无人驾驶汽车系统入门(三十二)——FEC算法:点云快速欧几里得聚类实战解析

本文深入解析了FEC算法在无人驾驶点云聚类中的高效应用,通过逐点处理策略和体素栅格预分割技术,实现了比传统欧几里得聚类快百倍的速度。文章详细介绍了算法原理、Python实现及参数调优指南,并对比了FEC与传统算法的性能差异,为无人驾驶系统开发提供了实用解决方案。

weixin_29065015的博客 484

ROST情感分析的语法规则_solc编译器分析

一、solc介绍以太坊的智能合约经过编译后运行在虚拟机上,完成整个工作流程,这个过程,需要solc编译器来完成。虽然说solc是一个编译器,但是它又有它与主流编译器不同之处。主要表现在如下几点:1、功能简单支持的基本数据类型只有有限的几种,不支持浮点(或者说想支持,但是目前还没实现)。编译指令也较其它编译器少很多,功能单一。在完成编译时需要借助一些其它辅助的工具。 换一句话说,以太坊的具体需求,也...

weixin_39747615的博客 809

搭建Dzzoffice 教程

通过以上步骤,您已经成功配置了WEB环境,安装了DzzOffice,并完成了系统设置和应用安装。1.安装包的设置默认是系统盘之外的第二个盘,没有其他盘符的时候则安装在C盘,当主机盘符只有C盘可用的时候,安装时不要使用U盘,否则可能误装到U盘当中。4.如果之前已经安装,再次安装时请确保上次安装已经卸载或者所有文件可读,否则请备份文件,卸载之后再安装。在其他安装环境中,我没有相关的使用经验。3. 保证安装路径是纯净的,安装路径下不能有已安装的V8版本,若重新安装,请选择其它路径。

小胡的博客 4949

MOOS-ivp 实验一 MOOS软件的安装与执行

MOOS-ivp实验一 实验一步骤总结 文章目录MOOS-ivp实验一前言一、实验一1.下载软件2.安装必要的插件3.安装后检查4.路径添加5.执行示例文件总结 前言 在moos学习过程中,我觉得最好把学习的每一步骤都总结一下,方便日后进行回顾。moos官网设置了十八个实验,涉及到了moos的各个方面,完成这些实验也是moos入门的好办法。 一、实验一 实验一主要内容仅仅是软件的安装,仅仅这一步就花费了我接近两天的时间。主要问题发生在linux系统的配置问题上。 1.下载软件 svn co https:

weixin_44151170的博客 6668

关于Rost ContentMining 6.0情感分析出现空白的解决方案

我在做这情感分析时差点吐血,另一份数据一次搞定,这一份数据死活搞不出来,始终只有两个空白文件。在网上查了相关资料讲是空行和空格的问题,但我把空行和空格删了后还是不行。在发现软件只会分析空行前的文本数据后,我就一半一半的测,直到最后测出是哪些句子有问题让我只能输出两个空白文件。最后测出来的那个句子出问题的原因是其空格是Tab的那种,所以单纯替换空格替换不掉这个,导致最后情感分析做不出来。综上所述,对于Rost CM6.0情感分析的数据预处理,去掉换行,去掉两种空格,这样应该就可以了。

m0_52359951的博客 4773

CS224W图神经网络实战:如何用Motifs和Graphlets分析社交网络结构?

本文基于斯坦福CS224W课程,深入探讨了如何利用网络模体(Motifs)和图元(Graphlets)分析社交网络的微观结构。通过实战代码演示,文章介绍了如何识别具有统计显著性的关键连接模式,计算节点的图元度向量以刻画局部拓扑特征,并将这些结构洞见应用于社区发现、影响力分析及图神经网络的节点特征工程,从而提升模型在虚假账号检测等任务中的性能。

2w3e4r5t6y的博客 909

go语言字符串换行_Go语言中的字符串处理方法示例详解

1 概述字符串,string,一串固定长度的字符连接起来的字符集合。Go语言的字符串是使用UTF-8编码的。UTF-8是Unicode的实现方式之一。Go语言原生支持字符串。使用双引号("")或反引号(``)定义。双引号:"", 用于单行字符串。反引号:``,用于定义多行字符串,内部会原样解析。示例:// 单行"心有猛虎,细嗅蔷薇"// 多行`大风歌大风起兮云飞扬。威加海内兮归故乡。安得猛士兮守四...

weixin_29113833的博客 5946

《网络安全自学教程》- OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

OSI分哪七层,每层的作用是什么,解释数据在七层模型中是怎样传输的,封包和解封过程,数据包在每一层是怎么封装和解封的。

wangyuxiang946的博客 1万+

宇树 Qmini 双足机器人完全开源:3D打印+5小时组装,新手也能玩转!

教育教学,成为学校里的竞赛竞技,实验课程,论文设计的本体;开发者可以根据开源资料轻松集齐所有零部件,结构件可全部通过3D打印完成(几乎完全不需要任何机加工零部件),搭配宇树的高可靠性电机和标准电池,客户打印完零部件后,大概仅需要3~5小时的手工组装即可得到一只可爱的Qmini小双足机器人本体。一起推动机器人的未来发展,创新没有边界,创造力是无限的,Qmini就是你的第一步,如果你也想做一个能动、能学、还能萌的小双足机器人,现在就可以动手了,全开源、真低门槛、只差你的3D打印机和一点点耐心。

雕爷学编程 1888

20个有趣的C++实例

return 0;

2302_77692709的博客 4955

17、Nimble 包开发与并行编程指南

本文介绍了Nimble包的开发与版本管理流程,涵盖语义化版本控制规范及发布步骤;深入探讨了Nim中的并行编程基础,包括并发与并行的区别、threads模块与threadpool模块的使用方法及其差异;分析了线程执行的不确定性、线程池的优势,并提供了线程同步和资源管理的实践示例,帮助开发者高效构建稳定、高性能的Nim应用程序。

wine的专栏 54

【不懂就问】ROST EA情感分析软件怎么操作

自定义词表是自带的吗,为什么它默认选择的那个txt文件是空的呢,如果要我自己编辑自定义词表那应该是什么格式,我自己试了几次都是error。求大佬解答,急! ...

YCDinq的博客 6654

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 646

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

求助大神!ROST EA情感分析软件情感词典如何更新

我需要对ROST EA软件中的情感词典进行更新,所以需要了解ROST EA中情感计算规则和词汇记忆权重,但是我打开ROST EA情感分析软件中的词库文件是乱码的。请问这该如何处理呢??文件夹中有两个软件,manage是用于新增情感词的吧?但是如果无法查看系统中自带的词库以及权重等规则的话怎么新增词库呢?点开calculateor中的dict,里面有正面词库、负面词库、权重等等文件,但是打开后是乱码...

weixin_37217590的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

output怎么用_用BERT做情感分析

诸如情感分析一类的任务比如商品评价正负面分析,敏感内容分析,用户感兴趣内容分析、甚至安全领域的异常访问日志分析等等实际上都可以用文本分类的方式去做,本质上来讲就是一个文本输出一个多个对应的标签。这一类任务BERT原文中用的是斯坦福的treebank,在这里我们还是用双向的LSTM网络来实现,因为前面的实体标注的内容中使用的是双向LSTM加CRF,稍加改造就可以很轻松的解决文本分类任务。一、计算过程...

weixin_39579726的博客 457

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

rostcm6情感分析案例分析_卷积情感分析

这是一个面向小白(比如,本人)的关于情感分析的系列教程 [1]。老鸽子整理了“4 - Convolutional Sentiment Analysis.ipynb”中的内容。本文任务:使用卷积神经网络(CNN)来实现句子分类。简介CNN用于分析图像,包含一个或多个卷积层,紧跟一个或多个线性层。在卷积层中,使用滤波器扫描图像。扫描后的图像送入另一个卷积层或线性层。每个滤波器都有大小,如:每...

weixin_39999586的博客 2051

情感分析和倾向分析

来自:http://hi.baidu.com/whusoft/item/aa6f8835d9664a0dcfb9fe2f 1微博客心情挖掘研究(英文已于2009年8月发表,中文草稿只贴,定稿版以英文为准,最新版的工具做了若干微调) 包含情感分析工具的软件下载入口介绍地址,点击此处 沈阳1 李舒晨2 郑玲3 任晓东 程小龙 (1武汉大学信息管理学院 430072 2武汉大学国际软件学院430

码农 9342
上一篇: chromedp网络监听_动态爬虫三:监听网络事件 + 监听js事件
下一篇: docker删除所有容器_如何在Linux上创建,列出和删除Docker容器
Air君陈怡帆
博客等级 码龄9年 43粉丝 1852原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值