首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

編譯原理入門(一):C 語言文法產生式完整定義

     編輯:關於C語言

前言

編譯器前端的核心任務是根據程式語言的**文法**將原始碼轉換為抽象語法樹(AST)。文法通常以**巴科斯-諾爾範式(BNF)** 或其擴展形式(EBNF)定義。本文整理了簡化版 C 語言的完整文法產生式,涵蓋從程式結構到運算式優先序的各層級規則,適合編譯原理學習者參考。

文法符號約定

  • → 或 ::=:產生式定義。
  • |:選擇(或)。
  • 終結符(Token)以大寫或引號標示:IDENTIFIER, CONSTANT, ';', '{' 等。
  • 非終結符以小寫或底線命名:program, expression 等。

完整產生式列表

1. 程式結構


program → external_declaration
        | program external_declaration

external_declaration → function_definition
                     | declaration

function_definition → type_specifier declarator compound_statement

2. 型別指定子


type_specifier → VOID | CHAR | INT | FLOAT
               | struct_or_union_specifier
               | enum_specifier
               | TYPEDEF_NAME

3. 宣告子


declarator → pointer direct_declarator
           | direct_declarator

pointer → '*'
        | '*' pointer

direct_declarator → IDENTIFIER
                  | direct_declarator '[' ']'
                  | direct_declarator '[' constant_expression ']'
                  | IDENTIFIER '(' parameter_list ')'
                  | IDENTIFIER '(' ')'
                  | direct_declarator ',' identifier_list

4. 參數與標識符列表


identifier_list → IDENTIFIER
                | identifier_list ',' IDENTIFIER

parameter_list → parameter_declaration
               | parameter_list ',' parameter_declaration

parameter_declaration → declaration_specifiers IDENTIFIER

5. 陳述句與區塊


compound_statement → '{' '}'
                   | '{' statement_list '}'
                   | '{' declaration_list statement_list '}'

declaration_list → declaration
                 | declaration_list declaration

statement_list → statement
               | statement_list statement

statement → compound_statement
          | expression_statement
          | selection_statement
          | iteration_statement
          | jump_statement
          | labeled_statement

expression_statement → ';'
                     | expression ';'

selection_statement → IF '(' expression ')' statement
                    | IF '(' expression ')' statement ELSE statement

iteration_statement → WHILE '(' expression ')' statement
                    | FOR '(' expression_statement expression_statement ')' statement
                    | FOR '(' expression_statement expression_statement expression ')' statement

jump_statement → CONTINUE ';'
               | BREAK ';'
               | RETURN ';'
               | RETURN expression ';'

labeled_statement → IDENTIFIER ':' statement
                  | CASE constant_expression ':' statement
                  | DEFAULT ':' statement

6. 宣告與初始化


declaration → init_declarator
            | init_declarator_list ',' init_declarator

init_declarator → declarator
                | declarator '=' initializer

initializer → assignment_expression
            | '{' initializer_list '}'
            | '{' initializer_list ',' '}'

initializer_list → initializer
                 | initializer_list ',' initializer

7. 運算式層級(依優先序由低到高)


expression → assignment_expression
           | expression ',' assignment_expression

assignment_expression → conditional_expression
                      | unary_expression assignment_operator assignment_expression

conditional_expression → logical_or_expression
                       | logical_or_expression '?' expression ':' conditional_expression

logical_or_expression → logical_and_expression
                      | logical_or_expression OR_OP logical_and_expression

logical_and_expression → inclusive_or_expression
                       | logical_and_expression AND_OP inclusive_or_expression

inclusive_or_expression → exclusive_or_expression
                        | inclusive_or_expression '|' exclusive_or_expression

exclusive_or_expression → and_expression
                        | exclusive_or_expression '^' and_expression

and_expression → equality_expression
               | and_expression '&' equality_expression

equality_expression → relational_expression
                    | equality_expression EQ_OP relational_expression
                    | equality_expression NE_OP relational_expression

relational_expression → shift_expression
                      | relational_expression '<' shift_expression
                      | relational_expression '>' shift_expression
                      | relational_expression LE_OP shift_expression
                      | relational_expression GE_OP shift_expression

shift_expression → additive_expression
                 | shift_expression LEFT_OP additive_expression
                 | shift_expression RIGHT_OP additive_expression

additive_expression → multiplicative_expression
                    | additive_expression '+' multiplicative_expression
                    | additive_expression '-' multiplicative_expression

multiplicative_expression → cast_expression
                          | multiplicative_expression '*' cast_expression
                          | multiplicative_expression '/' cast_expression
                          | multiplicative_expression '%' cast_expression

cast_expression → unary_expression
                | '(' type_name ')' cast_expression

unary_expression → postfix_expression
                 | INC_OP unary_expression
                 | DEC_OP unary_expression
                 | unary_operator cast_expression
                 | SIZEOF unary_expression
                 | SIZEOF '(' type_name ')'

postfix_expression → primary_expression
                   | postfix_expression '[' expression ']'
                   | postfix_expression '(' ')'
                   | postfix_expression '(' argument_expression_list ')'
                   | postfix_expression '.' IDENTIFIER
                   | postfix_expression PTR_OP IDENTIFIER
                   | postfix_expression INC_OP
                   | postfix_expression DEC_OP

primary_expression → IDENTIFIER
                   | CONSTANT
                   | STRING_LITERAL
                   | '(' expression ')'

argument_expression_list → assignment_expression
                         | argument_expression_list ',' assignment_expression

unary_operator → '&' | '*' | '+' | '-' | '~' | '!'

assignment_operator → '='
                    | MUL_ASSIGN | DIV_ASSIGN | MOD_ASSIGN
                    | ADD_ASSIGN | SUB_ASSIGN
                    | LEFT_ASSIGN | RIGHT_ASSIGN
                    | AND_ASSIGN | XOR_ASSIGN | OR_ASSIGN

8. 結構、聯盟、列舉


struct_or_union_specifier → struct_or_union IDENTIFIER '{' struct_declaration_list '}'
                          | struct_or_union '{' 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_specifier specifier_qualifier_list
                         | type_specifier
                         | type_qualifier specifier_qualifier_list
                         | type_qualifier

struct_declarator_list → struct_declarator
                       | struct_declarator_list ',' struct_declarator

struct_declarator → declarator
                  | ':' constant_expression
                  | declarator ':' constant_expression

enum_specifier → ENUM '{' enumerator_list '}'
               | ENUM IDENTIFIER '{' enumerator_list '}'
               | ENUM IDENTIFIER

enumerator_list → enumerator
                | enumerator_list ',' enumerator

enumerator → IDENTIFIER
           | IDENTIFIER '=' constant_expression

9. 型別限定詞與抽象宣告子


type_qualifier → CONST | VOLATILE

type_name → specifier_qualifier_list
          | specifier_qualifier_list abstract_declarator

abstract_declarator → pointer
                    | direct_abstract_declarator
                    | pointer direct_abstract_declarator

direct_abstract_declarator → '(' abstract_declarator ')'
                           | '[' ']'
                           | '[' constant_expression ']'
                           | direct_abstract_declarator '[' ']'
                           | direct_abstract_declarator '[' constant_expression ']'
                           | '(' ')'
                           | '(' parameter_type_list ')'
                           | direct_abstract_declarator '(' ')'
                           | direct_abstract_declarator '(' parameter_type_list ')'

10. 儲存類別指定子


storage_class_specifier → TYPEDEF | EXTERN | STATIC | AUTO | REGISTER

學習建議

  1. 由上而下閱讀: 從 program 入口追蹤到 primary_expression,理解層級遞歸結構。
  2. 關注運算式優先序: 文法層級直接對應運算子優先序與結合性(如 additive_expression 左結合)。
  3. 實作練習: 嘗試用遞歸下降或工具(Yacc/Bison、ANTLR)根據此文法構建解析器。
  4. 對照標準: 此為教學簡化版,完整 ANSI C (C89/C99/C11) 文法更龐大,含類型限定詞、內聯組合、泛型選擇等。

總結

掌握文法產生式是編譯器前端開發的基石。本文提供的簡化 C 文法涵蓋核心結構,可作為手寫遞歸下降解析器、學習 LR(k) 分析、理解語言設計的優質參考資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved