编译原理作业2

3.3.1

(1)C:
.输入字母表:基本源字符集包括大小写字母(A-Za-z)、数字(0-9)、空格和一些符号,具体包括:! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~ 以及控制字符如换行符。
.数字常量:包括整数常量和浮点常量。整数可以是十进制(1-9开头)、八进制(0开头)、十六进制(0x或0X开头)。浮点数包括小数点形式(如123.45)、指数形式(如1e3),可选的符号。可能带有后缀如u、U、l、L、ll、LL等。
· 标识符:以字母或下划线开头,后跟字母、数字或下划线,区分大小写,不能是关键字。
(2)C++:
· 输入字母表:基本与C类似,但可能支持更多的Unicode字符作为标识符的一部分。C++标准支持通用字符名(\uXXXX或\UXXXXXXXX)在标识符中使用。源字符集包括基本源字符和通用字符。输入字母表包括所有用于语法结构的字符,如运算符、括号、逗号等,以及字母、数字、下划线,加上支持的Unicode字符。
· 数字常量:类似C,但有二进制字面量(0b或0B开头),如0b1010。允许单引号作为数字分隔符,如1'000'000(C++14及以后)。浮点数可以有后缀如f、l。
· 标识符:以字母、下划线或通用字符名开头,后跟字母、数字、下划线或通用字符名,区分大小写,不能是关键字。
(5)Java:
・输入字母表:
Unicode字符,包含字母、数字、$、_及运算符(如@用于注解)。
• 数字常量:
•二进制(0b1010, Java 7+)、十六进制(0×1A3),允许分隔符(1_600)。
•浮点数后缀(f、d)。
•标识符:
以字母、$、或Unicode字符开头,后续可含数字,区分大小写,不可为关键字
(7)SQL:
•输入字母表:
字母、数字、运算符(=<>)、括号()、逗号,、单引号'等。
• 数字常量:
整数(123)、小数(123.45)、科学计数法(1e3),部分实现支持货币符号(如
$123.45)。
•标识符:
标准SQL要求字母开头,可含字母、数字、下划线。需引号包裹时允许特殊字符(如"order")。

3.3.2

(1)由 'a' 和 'b' 组成的字符串,以 'a' 开头并且以 'a' 结尾。
(2)由 'a' 和 'b' 组成的字符串。
(3)由 'a' 和 'b' 组成的字符串,倒数第三个字符是 'a'。
(4)由 'a' 和 'b' 组成的字符串,只包含三个 'b'。
(5)由 'a' 和 'b' 组成的字符串,其中 'a' 和 'b' 的数量都是偶数。

3.3.3

(1)n + 1
(2)n + 1
(3)n - 1
(4)C(n+1,2) + 1
(5)Σ(i=0,n) C(n, i)

3.3.4

select -> [Ss][Ee][Ll][Ee][Cc][Tt]
这其实很简单,你可以用(s|S)来表示s的大小写不敏感。也可以用[Ss]来,不过前者的可读性差一点,还是推荐后者的表示方法。

大模型使用:

deepseek:
具体生成了3.3.1的内容,并进行删减:
先想每个部分应该怎么查。输入字母表,这可能指的是语言中允许的基本字符,比如字母、数字、符号等,但排除了仅在字符串或注释中出现的字符。比如,在C语言中,注释是/* /或者//,里面的字符可能不算在输入字母表中,同样字符串中的字符也不计。但像关键字、运算符等使用的字符应包含在内。例如,C的关键字如if、for,运算符如+、-、、/等,这些字符都属于输入字母表的一部分。
接下来是数字常量的形式。不同语言的数字表示可能不同,比如整数、浮点数、十六进制、二进制等,可能还有指数形式。比如Java允许用0x开头表示十六进制,而C#可能还有更多格式。需要查每种语言的标准文档或权威手册。
标识符和词法形式通常涉及允许的起始字符和后续字符,比如是否允许Unicode,是否允许数字开头,是否允许特殊符号如下划线等。例如,C的标识符通常以字母或下划线开头,后续可以是字母、数字或下划线,而Java可能类似,但支持Unicode字符。
现在需要逐个语言处理。先从C开始。查C的规格,比如C11标准。输入字母表的字符集可能包括大小写字母、数字、各种符号如+、-、*、/、=、{}[]等,以及下划线。不包括那些仅出现在字符串或注释中的字符,比如字符串中的双引号内的内容可能不算,但作为字符串字面量的双引号本身可能属于输入字母表,因为需要定义字符串的语法结构。这点可能需要更仔细的确认。不过问题说“不包括那些只能出现在字符串或注释中的字符”,所以比如双引号在字符串外可能用于其他用途吗?在C中,双引号用于字符串字面量,所以可能双引号本身属于输入字母表的字符,但字符串内的字符不算。可能需要明确:输入字母表指的是构成语言语法的字符,而不是出现在字符串或注释中的内容。例如,像关键字、运算符、括号等所使用的字符都属于输入字母表,而字符串中的字符如普通字母如果出现在字符串中则不算。
这可能比较复杂,因为有些字符可能既出现在语法结构中,也可能出现在字符串或注释中。比如,分号在C中是语句结束符,属于输入字母表,而如果分号出现在字符串中,如"abc;",那么字符串中的分号不算。所以输入字母表应包括所有在语法中使用的字符,比如字母、数字、符号如{}();,=+等。
对于C的数字常量,整数可能有十进制、八进制(0开头)、十六进制(0x或0X开头),浮点数包括小数点、指数部分(e或E),可能还有后缀如u、l等。比如123,123.45,.56,6.7e8,0x1a3等。
标识符方面,C的标识符以字母或下划线开头,后续字符可以是字母、数字或下划线,不能是关键字,并且区分大小写。
接下来是C++。C++的输入字母表可能和C类似,但可能支持更多的Unicode字符?不过传统上,C++的标识符允许使用更多的Unicode字符,特别是在新标准中。例如,C++11开始允许Unicode字符在标识符中。输入字母表的字符可能包括基本的ASCII符号,加上某些Unicode字符作为标识符的部分。
数字常量的形式和C类似,可能还有新的特性,比如用户自定义字面量,但基本格式应该相同。C++也支持二进制字面量,比如0b1010,这是C++14引入的。
标识符在C++中同样以字母或下划线开头,后续可以是字母、数字、下划线,并且允许某些Unicode字符,具体取决于标准版本。例如,可以使用UCN(通用字符名)如\uXXXX。

posted @ 2025-03-08 13:28  哎哎呦呦喂喂0211  阅读(62)  评论(0)    收藏  举报