📄 grammar.txt
字号:
C--的语法: C--的语法是根据<<可变目标C编译器-设计与实现>>英文名<<A Retargetable CCompliler Design and Implementation>>)一书中C语言语法经过裁剪得到的,它是C语言的一个字集。为了与<<编译原理及实践>>中附录定义的一个C-Minus相区别,所以取名C--MinusMinus(不过并没有因为多了一个Minus符号,就意外着C--比C-简单。相反C--具有比C-更多的特性)。为了能使用最基本标准的C库函数,C--类型包括了char,以及指针类型。但由于不支持可变参数,因此对像printf函数的使用需要在不同的使用处进行不同的声明。C--的关键字: break char continue else if int return void while 所有的关键字都是保留字,并且必须是小写。C--中的专用符号: + - * / % < <= > >= == != = ! & C--Minus Minus 的EBNF语法: 1. translation-unit: external-declaration {external-declaration} 2. external-declaration: function-definition declaration 3. declaration: type-specifier init-declarator {,init-declarator}; type-specifier; 4. init-declarator: declarator declarator = initializer 5. initializer: assignment-expression '{' initializer {, initializer}[,]'}' 6. type-specifier: void | char | int 7. declarator: pointer direct-declarator {suffix-declarator} 8. direct-declarator: identifier '(' declarator ')' 9. suffix-declarator: '[' [constant-expression] ']' '(' [parameter-list]')' 10. pointer: {*} 11. parameter-list: parameter {,parameter-list} 12. parameter: type-specifier [declarator] 13. function-definition: type-specifier declarator compound-statement 14. compound-statement: '{' {declaration} {statement} '}' 15. statement: [expression]; if '(' expression ')' statement if '(' expression ')' statement else statement while '(' expression ')' statement break; continue; return [expression ]; compound-statement 16. expression: assignment-expression binary-expression 17. assignment-expression unary-expression assign-operator assignment-expression 18. assign-operator: one of = 19. binary-expression: unary-expression { binary-operator unary-expression } 20. binary-operator: one of == != < > <= >= + - * / % 21. unary-expression: postfix-expression unary-operator unary-expression '(' type-name ')' unary-expression sizeof unary-expression sizeof '(' type-name ')' 22. unary-operator: one of & * + - ! 23. postfix-expression: primary-expression {postfix-operator} 24. postfix-operator: '['expression']' '(' [assignment-expression {,assignment-expression}]')' 25. primary-expression: identifer constant string-literal '(' expression ')' 26. identifer: nondigit { nodigit | digit } 27. nondigit: one of _ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 28. constant: integer-constant character-constant 29. integer-constant: decimal-constant 30. decimal-constant: digit {digit} 31. digit: one of 0 1 2 3 4 5 6 7 8 9 32. character-constant: 'char' | escape-sequence 33. char: any character 34. escape-sequence: one of \' \" \? \\ \a \b \f \n \r \t \v 35. string-literal: "{char | escape-sequence}" 对以上每条文法规则,给出了相关语义的简短解释 1. translation-unit: external-declaration {external-declaration} 2. external-declaration: function-definition declaration 3. declaration: type-specifier init-declarator {,init-declarator}; type-specifier; 程序由声明的列表或函数定义组成。声明可以是函数或变量声明,顺序是任意的。声明由类型说明符(type-specifier)和初始化声明符列表(init-declarator)构成。为了简化C-- 编译器的实现,己将C语言声明说明符中类型限定符和存储说明符去掉。由于没有extern说明符,对于全局的标示符,是不能跨文件传递的。但是为了实现引用标准C库中一些函数实现基本输入输出,对未定义的函数,将把它做为引用外部符号处理 4. init-declarator: declarator declarator = initializer 5. initializer: assignment-expression '{' initializer {, initializer}[,]'}' 6. type-specifier: void | char | int在声明中对一般变量的初始化使用在'='后跟一个赋值表达式,由于在C-- 中没有结构和联合类型,只对数组的赋值才用花括号括起来的赋值列表。同样出于简化的目的类型说明符只保留C语言中最基本类型,其中空类型void只用于函数返回类型和函数参数类型,分别表示函数没有返回值和没有参数。char,int 的使用与C语言中相似,用于说明变量类型。 7. declarator: pointer direct-declarator {suffix-declarator} 8. direct-declarator: identifier '(' declarator ')' 9. suffix-declarator: '[' [constant-expression] ']' '(' [parameter-list]')' 10. pointer: {*}声明说明符(declarator)由前缀的指针说明符'*'、直接说明符、和可选的后缀说明符构成。C-- 保留了C语言中的指针,包括指向字符、整数、空类型、以及函数的指针。后缀说明符用于声明数组和函数,其中数组下标也是从0开始。 11. parameter-list: parameter {,parameter-list} 12. parameter: type-specifier [declarator] 13. function-definition: type-specifier declarator compound-statement 14. compound-statement: '{' {declaration} {statement} '}'函数的参数声明中可选的声明说明符(declarator)表示在用于函数声明时可以省略,函数的定义由返回类型指示符、标识符以及在圆括号内有用逗号分开的参数列表组成,后面跟了一个复合语句,是函数的代码。复合语句由声明与语句序列组成。 15. statement: [expression]; if '(' expression ')' statement if '(' expression ')' statement else statement while '(' expression ')' statement break; continue; return [expression ]; compound-statementC-- 中语句由表达式、选择、循环、返回、复合语句以及用于跳出循环的break 和跳过当前循环继续下一次循环的continue组成。每一条语句都由分号结束,可以包括空语句。 if语句有通常的语义:表达式进行计算;非 0值引起第一条语句的执行; 0值引起第二条语句的执行,如果它存在的话。这个规则导致了典型的悬挂 else二义性,可以用一种标准的方法解决:else部分通常作为当前if的一个子结构立即分析(“最近嵌套”非二义性规则)。 while语句是 C--中唯一的重复语句。它重复执行表达式,并且如果表达式的求值为非 0,则执行语句,当表达式的值为 0时结束。 返回语句可以返回一个值也可无值返回。函数没有说明为 void就必须返回一个值。函数声明为void就没有返回值。return引起控制返回调用者(如果它在main中,则程序结束)。 16. expression: assignment-expression binary-expression 17. assignment-expression unary-expression assign-operator assignment-expression 18. assign-operator: one of = 19. binary-expression: unary-expression { binary-operator unary-expression } 20. binary-operator: one of == != < > <= >= + - * / %C--的表达式由赋值表达式和二元表达式构成,赋值有通常的存储语义:它的左边必须为左值(l-value),左值是可以由许多操作获得的地址。 找到变量的地址,然后由赋值符右边的子表达式进行求值,子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。赋值表达式是右结合的,C--的二元表达式是左结合的,它不能做为左值出现。 21. unary-expression: postfix-expression unary-operator unary-expression '(' type-name ')' unary-expression sizeof unary-expression sizeof '(' type-name ')' 22. unary-operator: one of & * + - !C--的一元表达式由后缀表达式、前缀操作符、类型转换符、以及sizeof操作符组成。&为取变量地址操作,*为间接引用操作,取地址中的值。为按位取反,!用于对逻辑表达式取反。sizeof 对类型或左值求类型大小,对类型时必须加上圆括号,当对数组进行sizeof运算得到是数组元素的个数。 23. postfix-expression: primary-expression {postfix-operator} 24. postfix-operator: '['expression']' '(' [assignment-expression {,assignment-expression}]')' 25. primary-expression: identifer constant string-literal '(' expression ')'C--的基本表达式由标示符、常量表达式、字符串常量、以及有圆括号的表达式组成。 26. identifer: nondigit { nodigit | digit } 27. nondigit: one of _ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z标示符由下划线或字母开头、后面可接数字或字母。 28. constant: integer-constant character-constant 29. integer-constant: decimal-constant 30. decimal-constant: digit {digit} 31. digit: one of 0 1 2 3 4 5 6 7 8 9 32. character-constant: 'char' | 'escape-sequence' 33. char: any character 34. escape-sequence: one of \' \" \? \\ \a \b \f \n \r \t \v常量表达式由整形常量和字符常量构成。整形常量只含十进制常数,字符常量由二个单引号括起来的一般字符和由单引号括起来的转义字符构成。C--中的转义字符不包括C语言里的转义数字序列。 35. string-literal: "{char | escape-sequence}" 字符串常量由双引号括起来的字符和转义序列构成。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -