C#-词法结构
程序
C# 程序 (program) 由一个或多个源文件 (source file) 组成,源文件的正式名称是编译单元 (compilation unit)。源文件是有序的 Unicode 字符序列。
源文件与文件系统中的文件通常具有一对一的对应关系,但这种对应关系不是必需的。为实现可移植性的最大化,建议这些文件在文件系统中应按 UTF-8 编码规范编码。
从概念上讲,程序的编译分三个步骤:
1> 转换 : 这一步将用特定字符指令系统和编码方案编写的文件转换为 Unicode 字符序列
2> 词法分析 : 这一步将 Unicode 输入字符流转换为标记流
3> 句法分析 : 这一步将标记流转换为可执行代码
文法
本规范采用两种文法 (grammar) 来表示 C# 编程语言的语法 (syntax)。
词法文法 (lexical grammar)规定怎样将 Unicode 字符组合成行结束符、空白、注释、标记和预处理指令等。
句法文法 (syntactic grammar)规定如何将那些由词法文法产生的标记组合成 C# 程序。
1> 文法表示法
词法文法和句法文法用文法产生式 (grammar production) 来表示。每个文法产生式定义一个非结束符号和它可能的扩展(由非结束符或结束符组成的序列)。在文法产生式中,non-terminal 符号显示为斜体,而 terminal 符号显示为等宽字体。
文法产生式的第一行是该产生式所定义的非结束符号的名称,后跟一个冒号。每个后续的缩进行列出一个可能的扩展,它是以非结束符或结束符组成的序列的形式给出的。
例如,产生式:
while-statement:while(boolean-expression) embedded-statement
定义了一个 while-statement,它是这样构成的:由标记 while 开始,后跟标记“(”、boolean-expression、标记“)”,最后是一个 embedded-statement。
当有不止一个可能的非结束符号扩展时,列出这些可能的扩展(每个扩展单独占一行)。
例如,产生式:
statement-list:statementstatement-list statement
定义一个 statement-list,它或仅含有一个 statement,或由一个 statement-list 和随后跟着的一个 statement 组成。换言之,定义是递归的,语句列表由一个或多个语句组成。
一个符号若以下标“[opt]”作其后缀,就表明该符号是可选的。
产生式:
block:{ statement-list[opt] }
是以下产生式的简短形式:
block:{ }{ statement-list }
它定义了一个 block,此块由一个用“{”和“}”标记括起来的可选 statement-list 组成。
可选项通常在单独的行上列出,但是当有许多可选项时,可以在单行上给定的扩展列表之后加上短语“之一”。这只是在单独一行上列出每个可选项的简短形式。
例如,产生式:
real-type-suffix: one ofF f D d M m
是以下产生式的简短形式:
real-type-suffix:FfDdMm
2> 词法文法
词法文法的结束符号为 Unicode 字符集的字符,并且词法文法指定如何组合字符以构成标记、空白、注释和预处理指令。
C# 程序中的每个源文件都必须符合词法文法的 input 产生式。
3> 句法文法
句法文法的结束符号是由词法文法定义的标记,句法文法指定如何组合这些标记以构成 C# 程序。
C# 程序中的每个源文件都必须符合句法文法的 compilation-unit 产生式。
语法分析
input 产生式定义 C# 源文件的词法结构。C# 程序中的每个源文件都必须符合此词法文法产生式。
input:input-section[opt]
input-section:input-section-partinput-section input-section-part
input-section-part:input-elements[opt] new-linepp-directive
input-elements:input-elementinput-elements input-element
input-element:whitespacecommenttoken
C# 源文件的词法结构由五个基本元素组成:行结束符、空白、注释、标记和预处理指令。在这些基本元素中,只有标记在 C# 程序的句法文法中具有重要意义。
对 C# 源文件的词法处理就是将文件缩减成标记序列,该序列然后即成为句法分析的输入。行结束符、空白和注释可用于分隔标记,预处理指令可导致跳过源文件中的某些节,除此之外这些词法元素对 C# 程序的句法结构没有任何影响。
当有若干词法文法产生式与源文件中的一个字符序列匹配时,词法处理总是构成尽可能最长的词法元素。例如,字符序列 // 按单行注释的开头处理,这是因为该词法元素比一个 / 标记要长。
1> 行结束符
行结束符将 C# 源文件的字符划分为行。
new-line:Carriage return character (U+000D)Line feed character (U+000A)Carriage return character (U+000D) followed by line feed character (U+000A)Next line character (U+0085)Line separator character (U+2028)Paragraph separator character (U+2029)
为了与添加文件尾标记的源代码编辑工具兼容,并能够以正确结束的行序列的形式查看源文件,下列转换按顺序应用到 C# 程序中的每个源文件:
<1> 如果源文件的最后一个字符为 Control-Z 字符 (U+001A),则删除此字符。
<2> 如果源文件非空并且源文件的最后一个字符不是回车符 (U+000D)、换行符 (U+000A)、行分隔符 (U+2028) 或段落分隔符 (U+2029),则将在源文件的结尾添加一个回车符 (U+000D)。
2> 注释
支持两种形式的注释:单行注释和带分隔符的注释。单行注释 (Single-line comment) 以字符 // 开头并延续到源行的结尾。带分隔符的注释 (Delimited comment) 以字符 /* 开头,以字符 */ 结束。带分隔符的注释可以跨多行。
comment:single-line-commentdelimited-comment
single-line-comment:// input-characters[opt]
input-characters:input-characterinput-characters input-character
input-character:Any Unicode character except a new-line-character
new-line-character:Carriage return character (U+000D)Line feed character (U+000A)Next line character (U+0085)Line separator character (U+2028)Paragraph separator character (U+2029)
delimited-comment:/* delimited-comment-text[opt] asterisks /
delimited-comment-text:delimited-comment-sectiondelimited-comment-text delimited-comment-section
delimited-comment-section:/asterisks[opt] not-slash-or-asterisk
asterisks:*asterisks *
not-slash-or-asterisk:Any Unicode character except / or *
注释不嵌套。字符序列 /* 和 / 在 // 注释中没有任何特殊含义,字符序列 // 和 / 在带分隔符的注释中没有任何特殊含义。
在字符和字符串内不处理注释。
下面的示例:
/* Hello, world programThis program writes “hello, world” to the console
*/
class Hello
{static void Main(){System.Console.WriteLine("hello, world");}
}
演示了若干单行注释。
3> 空白
空白被定义为任何含 Unicode 类 Zs 的字符(包括空白字符)以及水平制表符、垂直制表符和换页符。
whitespace:Any character with Unicode class ZsHorizontal tab character (U+0009)Vertical tab character (U+000B)Form feed character (U+000C)
标记
有几类标记:标识符、关键字、文本、运算符和标点符号。空白和注释不是标记,但它们可充当标记的分隔符。
token:identifierkeywordinteger-literalreal-literalcharacter-literalstring-literaloperator-or-punctuator
1> Unicode 字符转义序列
Unicode 字符转义序列表示一个 Unicode 字符。Unicode 字符转义序列在标识符、字符和规则字符串中处理。不在其他任何位置处理 Unicode 字符转义(例如,在构成运算符、标点符号或关键字时)。
unicode-escape-sequence:\u hex-digit hex-digit hex-digit hex-digit\U hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit
Unicode 转义序列表示由“\u”或“\U”字符后面的十六进制数字构成的单个 Unicode 字符。由于 C# 在字符和字符串值中使用 Unicode 代码点的 16 位编码,因此从 U+10000 到 U+10FFFF 的 Unicode 字符不能在字符中使用,在字符串中则用一个 Unicode 代理项对来表示。不支持代码数据点在 0x10FFFF 以上的 Unicode 字符。
不执行多次转换。例如,字符串文本“\u005Cu005C”等同于“\u005C”,而不是“\”。Unicode 值 \u005C 是字符“\”。
下面的示例:
class Class1
{static void Test(bool \u0066){char c = '\u0066';if (\u0066){System.Console.WriteLine(c.ToString());}}
}
演示了 \u0066(它是字母“f”的转义序列)的一些用法。该程序等效于:
class Class1
{static void Test(bool f){char c = 'f';if (f){System.Console.WriteLine(c.ToString());}}
}
2> 标识符
本节给出的标识符规则完全符合 Unicode 标准附件 31 推荐的规则,但以下情况除外:允许将下划线用作初始字符(这是 C 编程语言的传统),允许在标识符中使用 Unicode 转义序列,以及允许“@”字符作为前缀以使关键字能够用作标识符。
identifier:available-identifier@ identifier-or-keyword
available-identifier:An identifier-or-keyword that is not a keyword
identifier-or相关文章:
C#-词法结构
程序 C# 程序 (program) 由一个或多个源文件 (source file) 组成,源文件的正式名称是编译单元 (compilation unit)。源文件是有序的 Unicode 字符序列。 源文件与文件系统中的文件通常具有一对一的对应关系,但这种对应关系不是必需的。为实现可移植性的最大化,建议这些文件…...
GitHub pull request(傻瓜式入门版)
GitHub pull request Pull Request(拉取请求)是一种非常重要的协作机制,它是 Git 和 GitHub 等代码托管平台中常见的功能。在开源项目中,Pull Request 被广泛用于参与社区贡献,从而促进项目的发展。 一、fork代码 先…...
Studio 3T客户端连接Mongodb数据库服务
这里需要注意 一定要先开Studio 3T 到 创建连接时才开Mongodb服务 不然 Studio 3T 会找不到Mongodb服务 不知道这是不是 Studio 3T官方问题 期待解决吧 我们打开 Studio 3T 然后点击 Create a new connection 开始创建连接 新弹出的窗口中选择 Manually configure my connec…...
算法每日一题:赎金信 | 字符和整数
hello,大家好,我是星恒 今天给大家带来的题目是一道简单题目,主要帮大家复习一下字符串和字符的相关操作 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以&#…...
数字孪生在虚拟现实(VR)中的应用
数字孪生在虚拟现实(VR)中的应用为用户提供了更深入、沉浸式的体验,同时通过数字孪生技术模拟真实世界的物理实体。以下是数字孪生在VR中的一些应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发…...
iOS实时查看App运行日志
目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 📝 摘要: 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具,我们可以连接手机并方便地筛选我们自己App的日志。 Ǵ…...
论文阅读:通过时空生成卷积网络合成动态模式(重点论文)
原文链接 github code 介绍视频 视频序列包含丰富的动态模式,例如在时域中表现出平稳性的动态纹理模式,以及在空间或时域中表现出非平稳的动作模式。 我们证明了时空生成卷积网络可用于建模和合成动态模式。 该模型定义了视频序列上的概率分布࿰…...
html2canvas+jsPDF导出超长网页的PDF
项目需求:有一个网页大概60000px的高度,现在需要导出为PDF index.vue <template><div class"ctn"><div class"pdf-ctn"><div class"pdf-panel" ><div class"pdf-inside-panel" id"myList">&…...
云计算:OpenStack 分布式架构管理VXLAN网络(单控制节点与多计算节点)
目录 一、实验 1.环境 2.各节点新增网卡准备VXLAN网络 3.控制节点配置私有网络 4.计算节点1配置私有网络 5.计算节点2配置私有网络 6.重启服务 7.修改Dashboard 8.新建项目(租户)及用户 9.新建网络与子网 10.新建实例 11.新建路由 12.新增浮…...
MATLAB --- dlmread( )函数的用法
dlmread() 是 MATLAB 中用于读取以特定分隔符分隔的文本文件数据的函数 下面是 dlmread() 函数的用法: M dlmread(filename) M dlmread(filename, delimiter) M dlmread(filename, delimiter, R, C) M dlmread(filename, delimiter, range)参数说明࿱…...
STM32CubeMX RS485接口使用
一、基本知识 TTL(Transistor-Transistor Logic): 电平范围: 逻辑1对应于2.4V–5V,逻辑0对应于0V–0.5V。通信特点: 全双工。特点: 常见于单片机和微控制器的IO电平,USB转TTL模块通常…...
ClickHouse(20)ClickHouse集成PostgreSQL表引擎详细解析
文章目录 PostgreSQL创建一张表实施细节用法示例 资料分享参考文章 PostgreSQL PostgreSQL 引擎允许 ClickHouse 对存储在远程 PostgreSQL 服务器上的数据执行 SELECT 和 INSERT 查询. 创建一张表 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] (name…...
R304S 指纹识别模块功能实现示例
1 基本通信流程 1.1 UART 命令包的处理过程 1.2 UART 数据包的发送过程 UART 传输数据包前,首先要接收到传输数据包的指令包,做好传输准备后发送成功应答包,最后才开始传输数据包。数据包主要包括:包头、设备地址、包标识、包长…...
2、Excel:基础概念、表格结构与常见函数
数据来源:八月成交数据 数据初探 业务背景 数据来源行业:金融行业(根据应收利息和逾期金额字段来判断) 可以猜测: 业务主体:某互联网金融公司(类似支付宝)也业务模式:给…...
鱼类识别Python+深度学习人工智能+TensorFlow+卷积神经网络算法
一、介绍 鱼类识别系统。使用Python作为主要编程语言开发,通过收集常见的30种鱼类(‘墨鱼’, ‘多宝鱼’, ‘带鱼’, ‘石斑鱼’, ‘秋刀鱼’, ‘章鱼’, ‘红鱼’, ‘罗非鱼’, ‘胖头鱼’, ‘草鱼’, ‘银鱼’, ‘青鱼’, ‘马头鱼’, ‘鱿鱼’, ‘鲇…...
ThreadLocal线程重用导致用户信息错乱的 Bug
在生产上遇到一个诡异的问题,有时获取到的用户信息是别人的。查看代码后,我发现他使用了 ThreadLocal 来缓存获取到的用户信息。 我们知道,ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。如果用户信息的获取比较…...
洛谷——P1143 进制转换
文章目录 一、题目进制转换题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 二、题解基本思路: 一、题目 进制转换 题目描述 请你编一程序实现两种不同进制之间的数据转换。 输入格式 共三行,第一行是一个正整数,表示需要转换的…...
linux stop_machine 停机机制应用及一次触发 soft lockup 分析
文章目录 stop_mchine 引起的 soft lockup触发 soft lockup 原因分析(一):触发 soft lockup 原因分析(二)触发 soft lockup 原因分析(三) stop_mchine 引起的 soft lockup 某次在服务器上某节点…...
ARM 链接器优化功能介绍
消除公共部分组 链接器可以检测节组的多个副本,并丢弃其他副本。 Arm Compiler for Embedded 生成用于链接的完整对象。因此: 如果 C 和 C 源代码中存在内联函数,则每个对象都包含该对象所需的内联函数的外联副本。如果在 C 源代码中使用…...
动手学深度学习之卷积神经网络之池化层
池化层 卷积层对位置太敏感了,可能一点点变化就会导致输出的变化,这时候就需要池化层了,池化层的主要作用就是缓解卷积层对位置的敏感性 二维最大池化 这里有一个窗口,来滑动,每次我们将窗口中最大的值给拿出来 还是上…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
统计按位或能得到最大值的子集数目
我们先来看题目描述: 给你一个整数数组 nums ,请你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素(或不删除)得到,…...
