前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lexical Structure

Lexical Structure

原创
作者头像
云台大树
修改2022-05-30 14:51:54
3120
修改2022-05-30 14:51:54
举报

Chapter3 Lexical Structure

3.1 Unicode

Java代码使用Unicode字符集编写。

Java SE各版本使用的Unicode标准是不同的,当前SE版本使用的具体是哪个版本的Unicode标准,可以在类Character里找到

Unicode标准创建时,每个字符使用固定的16位字符进行编码。随着对各种语言的扩展支持,Unicode字符的编码开始超过16位。

当下合法的Unicode编码从U+0000U+10FFFF

码元(code unit):一个16位的编码,如0x1234

码点(code point):一个Unicode字符的编码,如U+10FFFF

补充字符(supplementary characters)是指那些码点超过U+FFFF的字符

为了也能只用16位编码表示这些补充字符,Unicode标准定义了UTF-16编码格式

UTF-16编码:

  • 对于补充字符,使用一对16位的码元来表示

第一个16位码元来自U+D800U+DBFF,第二个16位码元来自U+DC00U+DFFF

  • 对于编码在U+0000U+FFFF的普通字符,它的码元和码点是一样的

:information_source: 因此在Java中,语义字符的确切名称叫做UTF-16码元(code unit),一个Unicode字符的确切名称叫做码点(code point)

==码元和码点示例==

代码语言:java
复制
public static void main(String[] args) {
    String wang = "hi王?";

    /* .length()返回码元的数量, .charAt()返回索引上的码元对应的字符 */
    for (int i = 0; i < wang.length(); i++) {
        /* 依次输出 h 68, i 69, 王 738b, ? d83d, ? dc0d */
        System.out.println(wang.charAt(i) + " " + Integer.toHexString((char) wang.charAt(i)));
    }
    /* .codePointCount()返回码点的数量, .codePointAt()返回索引上的码点对应的字符 */
    for (int i = 0; i < wang.codePointCount(0, wang.length()); i++) {
        /* 依次输出 h 67, i 69, 王 738b, ? 1f40d */
        int codePointAt = wang.codePointAt(i);
        String str = new String(Character.toChars(codePointAt));
        System.out.println(str + " " + Integer.toHexString(codePointAt));
    }
}

3.2 Lexical Translations

Java中的原始的Unicode字符流根据下面的三个步骤被翻译成一系列的token

  • 首先,将字符流中的转义字符转换成对应的Unicode字符,转义字符\uxxxx被转换成对应的UTF-16的码元xxxx
  • 其次,在剩余字符流中的Unicode字符转换成一系列的input characters^去除了转义字符的字符^和换行符
  • 最后,将input characters和换行符转换成一系列的input elements

3.3 Unicode Escapes

Java编译器首先将代码中的\uxxxx转换解释成对应的UTF-16编码格式的码元xxxx,其他的字符不做处理。

解释成的字符不会参与到字符转义里,如\u005au005c不会被解释成Z。虽然\u005a是Unicode字符\,它被解释一次后,与后续字符组成的新字符\u005c不会被解释成Z

3.4 Line Terminators

这三个字符会被当作换行符被解释: ASCII字符 LF(newline), ASCII字符 CR(return), ASCII字符 CRLF

3.5 Input Elements and Tokens

经过转义处理和换行处理后剩余的字符,就是input elements

input element = white space + comment + token token = identifier + keyword + literal + separator + operator

3.6 White Space

ASCII字符 SP(space), ASCII字符 HT(horizontal tab), ASCII字符 FF(form feed), 换行符

3.7 Comments

//, /* */, /** */

3.8 Identifiers

标识符是任意长度的Java字符和Java数字,首字母必须是Java字符

标识符不能是关键字、布尔类型值、null

Java字符是Character.isJavaIdentifierStart(int)返回真值的字符,基本上所有的Unicode字符都是Java字符

Java字符或数字是Character.isJavaIdentifierPart(int)返回真值的字符

Java数字是0-9的数值(\u0030 - \u0039)

3.9 Keywords

Java有51个关键字

代码语言:plain text
复制
abstract   continue   for          new         switch
assert     default    if           package     synchronized
boolean    do         goto         private     this
break      double     implements   protected   throw
byte       else       import       public      throws
case       enum       instanceof   return      transient
catch      extends    int          short       try
char       final      interface    static      void
class      finally    long         strictfp    volatile
const      float      native       super       while
_ (underscore)

3.10 Literals

字面量(literal)就是在代码里直接声明的初始类型值、String类型值、null

代码语言:java
复制
public void decimalLiteral(){
	/* 十进制整形字面量 */
    int intV1 = 324_330; long longV2 = 324_330L;
    /* 十六进制整形字面量 */
    int intV2 = 0x7FFF_FFFF; long longV2 = 0xFFFF_FFFF_FFFF;
    /* 八进制整形字面量 */
    int intV3 = 07777_7777; long longV3 = 07777_7777_7777;
    /* 二进制整形字面量 */
    int intV4 = 0b1111_1111; long longV4 = 0b1111_1010_1111;
}

public void floatLiteral() {
	/* 十进制浮点数字面量 */
    float floatV1 = 3.3e10F; double doubleV1 = 3.3e11;
    /* 十六进制浮点数字面量 */
    floatV1 = 0xffP+3F; doubleV1 = 0xffffp-3;
}

public void charLiteral() {
    /* \是转义符 */
	char c = 'a'; a = '\\'; a = '\''; 
    a = '\uFFFF'; a = '\177'
}
public void stringLiteral() {
    String str = "Hello";
    str = "\nhello"
}

3.11 Separators

Java中下面的12个字符是分隔符

代码语言:txt
复制
(   )   {   }   [   ]   ;   ,   .   ...   @   ::

3.12 Operators

Java中下面38个字符是操作符

代码语言:txt
复制
=   >   <   !   ~   ?   :   ->
==  >=  <=  !=  &&  ||  ++  --
+   -   *   /   &   |   ^   %   <<   >>   >>>
+=  -=  *=  /=  &=  |=  ^=  %=  <<=  >>=  >>>=

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Chapter3 Lexical Structure
    • 3.1 Unicode
      • 3.2 Lexical Translations
        • 3.3 Unicode Escapes
          • 3.4 Line Terminators
            • 3.5 Input Elements and Tokens
              • 3.6 White Space
                • 3.7 Comments
                  • 3.8 Identifiers
                    • 3.9 Keywords
                      • 3.10 Literals
                        • 3.11 Separators
                          • 3.12 Operators
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档