最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【編譯原理】C語言完整文法(包括預處理器文法)

2020-05-19 15:14 作者:GC_CH  | 我要投稿

說明:

????以下內容基于ISO C89標準。其中,一行開頭的 | 表示或者的意思,[]里面的內容是可選的。不是行頭的 | 都是 字符 '|' 的意思,如果文法中用到字符 [ ],則使用 '[' 和 ']'表示。

????該文法適合用來理解C語言的文法,但不適合用來寫編譯器。因為該文法中有大量左遞歸和左公因子,且是二義性的,總共有 500 行左右最重要的一點是它不是上下文無關的,所以編譯原理中的LL分析法和LR分析法都派不上用場 T_T。

????也就是說,對該文法做一些特殊處理才能夠用于C編譯器的開發(fā)。

????該文法的開始符號是: 翻譯單元?translation_unit。

????純手打。

C89文法

一、詞法

1. 單詞, 預處理單詞

token :?

? ? keyword?

? ? identifier

? ? constant

? ? string_literal

? ? operator

? ? punctuator


preprocessing_token :?

? ? header_name?

? ? identifier

? ? pp_number

? ? character_constant

? ? string_literal

? ? operator

? ? punctuator

? ? 不在上述范圍內的任一非空白符


2. 關鍵字

keyword:

auto ? ? double ? ? int ? ? ? ? struct

break ? ? else? ? ? ? long ? ? switch

case? ? ? ? enum? ? ? ? register typedef

char ? ? extern ? ? return? union

const ? ? float ? ? short ? ? unsigned

for ? ? signed ? ? void default

goto ? ? sizeof ? ? volatile do

if ? ? ? ? static ? ? while? ? ? ?continue


3. 標識符

identifier :

? ? nodigit

? ? identifier nodigit

? ? identifier digit


nodigit :?

? ? _ 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


digit :

? ? 0 1 2 3 4 5 6 7 8 9


4. 常量

constant :

? ? floating_constant

? ? | integer_constant

? ? | enumeration_constant

? ? | character_constant


floating_constant :

? ? fractional_constant [exponent_part] [floating_suffix]

| digit_sequence exponent_part [floating_suffix]


fractional_constant :?

[digit_sequence] . digit_sequence

? ? | digit_sequence


exponent_part:

? ? e [sign] digit_sequence

? ? | E [sign] digit_sequence


sign:

? ? + | -


digit_sequence:

? ? digit

? ? | digit_sequence digit


floating_suffix:

? ? f | l | F | L


integer_constant:

? ? decimal_constant [integer_suffix]

? ? | octal_contant [integer_suffix]

? ? | hexadecimal_constant [integer_suffix]


decimal_constant:

? ? nonzero_digit

? ? | decimal_constant digit


octal_contant:

? ? 0

? ? | octal_contant octal_digit


hexadecimal_constant:

? ? 0x hexadecimal_digit

? ? | 0X hexadecimal_digit

? ? | hexadecimal_constant hexadecimal_digit


nonzero_digit:

? ? 1 2 3 4 5 6 7 8 9


octal_digit:

? ? 0 1 2 3 4 5 6 7


hexadecimal_digit:

? ? ?0 1 2 3 4? 5 6 7 8 9

? ? ?a b c d e f g

? ? ?A B C D E F G


integer_suffix:

? ? unsigned_suffix [long_suffix]

? ? | long_suffix [unsigned_suffix]


unsigned_suffix :

? ? u | U


long_suffix :

? ? l | L


enumeration_constant :

? ? identifier


character_constant:

? ? ' c_char_sequence '

? ? | L' c_char_sequence '


c_char_sequence:

? ? c_char

? ? | c_char_sequence c_char


c_char:

? ? 源字符集中除 單引號 ',右反斜線 \,換行符 \n 外的所有字符

? ? | escape_sequence


escape_sequence:

? ? simple_escape_sequence

? ? | octal_escape_sequence

? ? | hexadecimal_escape_sequence


simple_escape_sequence: \' | \" | \? | \\ | \a | \b | \f | \n | \r | \t | \v


octal_escape_sequence:

? ? \ octal_digit

? ? | \ octal_digit octal_digit

? ? | \ octal_digit octal_digit octal_digit


hexadecimal_escape_sequence:

? ? \x hexadecimal_digit

? ? | hexadecimal_escape_sequence hexadecimal_digit


5. 字符串字面量


string_literal:

? ? " [s_char_sequence] "

? ? | L" [s_char_sequence] "


s_char_sequence:

? ? s_char

? ? | s_char_sequence s_char


s_char:

? ? 源字符集中除 雙引號 ",右反斜線 \,換行符 \n 外的所有字符

? ? | escape_sequence


6. 運算符


operator:

? ? [ ] ( ) . -> ++ -- & * + - ! sizeof / % << >> < > <= >= != ^ | && ||

? ? = *= /= %= += -= <<= >>= &= ^= |= , # ##


7. 標點符號


punctuator:

? ? [ ] ( ) { } * , : = ; ... #


8. 標頭名


header_name:

? ? < h_char_sequence >

? ? " q_char_sequence "


h_char_sequence:

? ? h_char

? ? | h_char_sequence h_char


h_char:

? ? 源字符集中除 換行符 \n , 大于號 > 外的所有字符


q_char_sequence:

? ? q_char

? ? | q_char_sequence q_char


q_char:

? ? 源字符集中除 換行符 \n , 雙引號" 外的所有字符


9. 預處理數(shù)字


pp_number:

? ? digit

? ? | .digit

? ? | pp_number digit

? ? | pp_number nonzero_digit

? ? | pp_number e sign

? ? | pp_number E sign

? ? | pp_number .


二、語法


1. 表達式


primary_expression:

? ? identifier

? ? | constant

? ? | string_literal

? ? | (expression)


postfix_expression:

? ? primary_expression

? ? | postfix_expression '[' expression ']'

? ? | postfix_expression ([argument_expression_list])

? ? | postfix_expression . identifier

? ? | postfix_expression -> identifier

? ? | postfix_expression ++

? ? | postfix_expression --


argument_expression_list:

? ? assignment_expression

? ? | assignmant_expression_list , assignment_expression


unary_expression:

? ? postfix_expression

? ? | ++ unary_expression

? ? | -- unary_expression

? ? | unary_operator cast_expression

? ? | sizeof unary_expression

? ? | sizeof (type_name)


unary_operator:

? ? & * + - ~ !


cast_expression:

? ? unary_expression

? ? | (type_name) cast_expression


multiplicative_expression:

? ? cast_expression

? ? | multiplicative_expression * cast_expression

? ? | multiplicative_expression / cast_expression

? ? | multiplicative_expression % cast_expression

|?

addtive_expression:

? ? multiplicative_expression

? ? | addtive_expression + multiplicative_expression

? ? | addtive_expression - multiplicative_expression


shift_expression:

? ? addtive_expression

? ? | shift_expression << addtive_expression

? ? | shift_expression >> addtive_expression



relational_expression:

? ? shift_expression

? ? | relational_expression < shift_expression

? ? | relational_expression <= shift_expression

? ? | relational_expression > shift_expression

? ? | relational_expression >= shift_expression


equality_expression:

? ? relational_expression

? ? | equality_expression == relational_expression

? ? | equality_expression != relational_expression


and_expression:

? ? equality_expression

? ? | and_expression & relational_expression


exclusive_or_expression:

? ? and_expression

? ? | exclusive_or_expression ^ and_expression


inclusive_or_expression:

? ? exclusive_or_expression

? ? | inclusive_or_expression | exclusive_or_expression


logical_and_expression:

? ? inclusive_or_expression

? ? | logical_and_expression && inclusive_or_expression


logical_or_expression:

? ? logical_and_expression

? ? | logical_or_expression || logical_and_expression


conditional_expression:

? ? logical_or_expression?

? ? | logical_or_expression ? expression : conditional_expression


assignment_expression:

? ? conditional_expression

? ? | unary_expression assignment_operator assignment_expression


assignment_operator:

? ? = *= /= %= += -= <<= >>= &= ^= |=


expression:

? ? assignment_expression

? ? | expression assignment_expression


constant_expression:

? ? conditional_expression


2. 聲明


declaration:

? ? declaration_specifier [init_declaratior_list] ;


declaration_specifier:

? ? storage_class_specifier [declaration_specifier]

? ? | type_specifer [declaration_specifier]

? ? | type_qualifier [declaration_specifier]


init_declaratior_list:

? ? init_declarator

? ? | init_declaratior_list , init_declarator


init_declarator:

? ? declarator

? ? | declarator = initializer


storage_class_specifier:

? ? typedef

? ? | extern

? ? | static

? ? | auto

? ? | register


type_specifer:

? ? void

? ? | char

? ? | short

? ? | int

? ? | long

? ? | float

? ? | double

? ? | signed

? ? | unsigned

? ? | struct_or_union_specifer

? ? | enum_specifier

? ? | typedef_name


struct_or_union_specifer:

? ? struct_or_union [identifier] { struct_declaration_list}

? ? | struct_or_union identifier


struct_or_union:

? ? struct

? ? | union


struct_declaration_list:

? ? struct_declaration

? ? | struct_declaration_list struct_declaration


struct_declaration:

? ? specifier_qualifier_list struct_declarator_list;


specifier_qualifier_list:

? ? type_specifer [specifier_qualifier_list]

? ? | type_qualifier [specifier_qualifier_list]


struct_declarator_list:

? ? struct_declarator

? ? | struct_declarator_list, struct_declarator


struct_declarator:

? ? declarator

? ? | [declarator] : constant_expression


enum_specifier:

? ? enum [identifier] {enumerator_list}

? ? | enum identifier


enumerator_list:

? ? enumerator

? ? | enumerator_list, enumerator


enumerator:

? ? enumeration_constant

? ? | enumeration_constant = constant_expression


enumeration_constant:

? ? identifier


type_qualifier:

? ? const

? ? | volatile

parameter_declaration:

? ? declaration_specifier declarator

? ? | declaration_specifier [abstract_declarator]


declarator:

? ? [pointer] direct_declarator


abstract_declarator:

? ? pointer

? ? | [pointer] direct_abstract_delarator


direct_declarator:

? ? identifier

? ? | (declarator)

? ? | direct_declarator '[' [ constant_expression ] ']'

? ? | direct_declarator (parameter_type_list)

? ? | direct_declarator ( [identifier_list] )


direct_abstract_delarator:

? ?(abstract_declarator)

? ?| [direct_abstract_delarator] '[' [constant_expression] ']'

? ?| [direct_abstract_delarator] ( [parameter_type_list] )


pointer:

? ? * [type_qualifier_list]

? ? | * [type_qualifier_list] pointer


type_qualifier_list:

? ? type_qualifier

? ? | type_qualifier_list type_qualifier


parameter_type_list:

? ? parameter_list

? ? | parameter_list, ...


parameter_list:

? ? parameter_declaration

? ? | parameter_list, parameter_declaration


identifier_list:

? ? identifier

? ? | identifier_list, identifier



type_name:

? ? specifier_qualifier_list [abstract_declarator]


specifier_qualifier_list:

? ? type_specifer [specifier_qualifier_list]

? ? | type_qualifier [specifier_qualifier_list]



typedef_name:

? ? identifier


initializer:

? ? assignment_expression

? ? | {initializer_list}

? ? | {initializer_list,}


initializer_list:

? ? initializer

? ? | initializer_list, initializer


3. 語句

statement:

? ? labeled_statement

? ? | compound_statement

? ? | expression_statement

? ? | selection_statement

? ? | iteration_statement

? ? | jump_statement


labeled_statement:

? ? identifier : statement

? ? | case constant_expression : statement

? ? | default : statement


compound_statement:

? ? {[declaration_list] [statement_list]}


declaration_list:

? ? declaration

? ? | declaration_list declaration


statement_list:

? ? statement

? ? | statement_list statement


expression_statement:

? ? [expression] ;


selection_statement:

? ? if(expression) statement

? ? | if(expression) statement else statement

? ? | switch(expression) statement


iteration_statement:

? ? while(expression) statement

? ? | do statement while(expression) ;

? ? | for([expression] ; [expression] ; [expression]) statement


jump_statement:

? ? goto identifier ;

? ? | continue ;

? ? | break ;

? ? | return [expression] ;


4. 外部定義


translation_unit:

? ? external_declaration

? ? | translation_unit external_declaration


external_declaration:

? ? functionn_definition

? ? | declaration


functionn_definition:

? ? | [declaration_specifier] declarator [declaration_list] compound_statement


6. 預處理命令


preprocessing_file:

? ? [group]


group:

? ? gruop_part

? ? | group gruop_part


gruop_part:

? ? [pp_tokens] new_line

? ? | if_section

? ? | control_line


if_section:

? ? if_group [elif_groups] [else_group] endif_line


if_group:

? ? # if constant_expression new_line [group]

? ? | # ifdef identifier new_line [group]

? ? | #ifndef identifier new_line [group]


elif_groups:

? ? elif_group

? ? | elif_groups elif_group


elif_group:

? ? # elif constant_expression new_line [group]


else_group:

? ? # else new_line [group]


endif_line:

? ? # endif new_line


control_line:

? ? # include pp_tokens new_line

? ? | # define identifier replacement_list new_line

? ? | # define identifier lparen [identifier_list] ) replacement_list new_line

? ? | # undef identifier new_line

? ? | # line pp_tokens new_line

? ? | # error [pp_tokens] new_line

? ? | # pragma [pp_tokens] new_line

? ? | # new_line


lparen:

? ? 前面沒有空白符的左括號(


replacement_list:

? ? [pp_tokens]


pp_tokens:

? ? preprocessing_token

? ? | pp_tokens preprocessing_token


new_line:

? ? 換行符\n


【編譯原理】C語言完整文法(包括預處理器文法)的評論 (共 條)

分享到微博請遵守國家法律
永丰县| 安陆市| 桐城市| 阿瓦提县| 聂拉木县| 虎林市| 镇赉县| 大石桥市| 花莲县| 尉犁县| 台南县| 清丰县| 安乡县| 闽侯县| 梨树县| 玛曲县| 宁陵县| 尚志市| 台中县| 潞西市| 社旗县| 赤水市| 长岛县| 怀柔区| 吴川市| 盘锦市| 榕江县| 静安区| 印江| 郧西县| 宁蒗| 军事| 微山县| 军事| 合川市| 余姚市| 武定县| 炉霍县| 武邑县| 明光市| 雅安市|