📄 cparse.py
字号:
# -----------------------------------------------------------------------------# cparse.py## Simple parser for ANSI C. Based on the grammar in K&R, 2nd Ed.# -----------------------------------------------------------------------------import yaccimport clex# Get the token maptokens = clex.tokens# translation-unit:def p_translation_unit_1(t): 'translation_unit : external_declaration' passdef p_translation_unit_2(t): 'translation_unit : translation_unit external_declaration' pass# external-declaration:def p_external_declaration_1(t): 'external_declaration : function_definition' passdef p_external_declaration_2(t): 'external_declaration : declaration' pass# function-definition:def p_function_definition_1(t): 'function_definition : declaration_specifiers declarator declaration_list compound_statement' passdef p_function_definition_2(t): 'function_definition : declarator declaration_list compound_statement' passdef p_function_definition_3(t): 'function_definition : declarator compound_statement' passdef p_function_definition_4(t): 'function_definition : declaration_specifiers declarator compound_statement' pass# declaration:def p_declaration_1(t): 'declaration : declaration_specifiers init_declarator_list SEMI' passdef p_declaration_2(t): 'declaration : declaration_specifiers SEMI' pass# declaration-list:def p_declaration_list_1(t): 'declaration_list : declaration' passdef p_declaration_list_2(t): 'declaration_list : declaration_list declaration ' pass# declaration-specifiersdef p_declaration_specifiers_1(t): 'declaration_specifiers : storage_class_specifier declaration_specifiers' passdef p_declaration_specifiers_2(t): 'declaration_specifiers : type_specifier declaration_specifiers' passdef p_declaration_specifiers_3(t): 'declaration_specifiers : type_qualifier declaration_specifiers' passdef p_declaration_specifiers_4(t): 'declaration_specifiers : storage_class_specifier' passdef p_declaration_specifiers_5(t): 'declaration_specifiers : type_specifier' passdef p_declaration_specifiers_6(t): 'declaration_specifiers : type_qualifier' pass# storage-class-specifierdef p_storage_class_specifier(t): '''storage_class_specifier : AUTO | REGISTER | STATIC | EXTERN | TYPEDEF ''' pass# type-specifier:def p_type_specifier(t): '''type_specifier : VOID | CHAR | SHORT | INT | LONG | FLOAT | DOUBLE | SIGNED | UNSIGNED | struct_or_union_specifier | enum_specifier | TYPEID ''' pass# type-qualifier:def p_type_qualifier(t): '''type_qualifier : CONST | VOLATILE''' pass# struct-or-union-specifierdef p_struct_or_union_specifier_1(t): 'struct_or_union_specifier : struct_or_union ID LBRACE struct_declaration_list RBRACE' passdef p_struct_or_union_specifier_2(t): 'struct_or_union_specifier : struct_or_union LBRACE struct_declaration_list RBRACE' passdef p_struct_or_union_specifier_3(t): 'struct_or_union_specifier : struct_or_union ID' pass# struct-or-union:def p_struct_or_union(t): '''struct_or_union : STRUCT | UNION ''' pass# struct-declaration-list:def p_struct_declaration_list_1(t): 'struct_declaration_list : struct_declaration' passdef p_struct_declaration_list_2(t): 'struct_declaration_list : struct_declarator_list struct_declaration' pass# init-declarator-list:def p_init_declarator_list_1(t): 'init_declarator_list : init_declarator' passdef p_init_declarator_list_2(t): 'init_declarator_list : init_declarator_list COMMA init_declarator' pass# init-declaratordef p_init_declarator_1(t): 'init_declarator : declarator' passdef p_init_declarator_2(t): 'init_declarator : declarator EQUALS initializer' pass# struct-declaration:def p_struct_declaration(t): 'struct_declaration : specifier_qualifier_list struct_declarator_list SEMI' pass# specifier-qualifier-list:def p_specifier_qualifier_list_1(t): 'specifier_qualifier_list : type_specifier specifier_qualifier_list' passdef p_specifier_qualifier_list_2(t): 'specifier_qualifier_list : type_specifier' passdef p_specifier_qualifier_list_3(t): 'specifier_qualifier_list : type_qualifier specifier_qualifier_list' passdef p_specifier_qualifier_list_4(t): 'specifier_qualifier_list : type_qualifier' pass# struct-declarator-list:def p_struct_declarator_list_1(t): 'struct_declarator_list : struct_declarator' passdef p_struct_declarator_list_2(t): 'struct_declarator_list : struct_declarator_list COMMA struct_declarator' pass# struct-declarator:def p_struct_declarator_1(t): 'struct_declarator : declarator' passdef p_struct_declarator_2(t): 'struct_declarator : declarator COLON constant_expression' passdef p_struct_declarator_3(t): 'struct_declarator : COLON constant_expression' pass# enum-specifier:def p_enum_specifier_1(t): 'enum_specifier : ENUM ID LBRACE enumerator_list RBRACE' passdef p_enum_specifier_2(t): 'enum_specifier : ENUM LBRACE enumerator_list RBRACE' passdef p_enum_specifier_3(t): 'enum_specifier : ENUM ID' pass# enumerator_list:def p_enumerator_list_1(t): 'enumerator_list : enumerator' passdef p_enumerator_list_2(t): 'enumerator_list : enumerator_list COMMA enumerator' pass# enumerator:def p_enumerator_1(t): 'enumerator : ID' passdef p_enumerator_2(t): 'enumerator : ID EQUALS constant_expression' pass# declarator:def p_declarator_1(t): 'declarator : pointer direct_declarator' passdef p_declarator_2(t): 'declarator : direct_declarator' pass# direct-declarator:def p_direct_declarator_1(t): 'direct_declarator : ID' passdef p_direct_declarator_2(t): 'direct_declarator : LPAREN declarator RPAREN' passdef p_direct_declarator_3(t): 'direct_declarator : direct_declarator LBRACKET constant_expression_opt RBRACKET' passdef p_direct_declarator_4(t): 'direct_declarator : direct_declarator LPAREN parameter_type_list RPAREN ' passdef p_direct_declarator_5(t): 'direct_declarator : direct_declarator LPAREN identifier_list RPAREN ' passdef p_direct_declarator_6(t): 'direct_declarator : direct_declarator LPAREN RPAREN ' pass# pointer:def p_pointer_1(t): 'pointer : TIMES type_qualifier_list' passdef p_pointer_2(t): 'pointer : TIMES' passdef p_pointer_3(t): 'pointer : TIMES type_qualifier_list pointer' passdef p_pointer_4(t): 'pointer : TIMES pointer' pass# type-qualifier-list:def p_type_qualifier_list_1(t): 'type_qualifier_list : type_qualifier' passdef p_type_qualifier_list_2(t): 'type_qualifier_list : type_qualifier_list type_qualifier' pass# parameter-type-list:def p_parameter_type_list_1(t): 'parameter_type_list : parameter_list' passdef p_parameter_type_list_2(t): 'parameter_type_list : parameter_list COMMA ELLIPSIS' pass# parameter-list:def p_parameter_list_1(t): 'parameter_list : parameter_declaration' passdef p_parameter_list_2(t): 'parameter_list : parameter_list COMMA parameter_declaration' pass# parameter-declaration:def p_parameter_declaration_1(t): 'parameter_declaration : declaration_specifiers declarator' passdef p_parameter_declaration_2(t): 'parameter_declaration : declaration_specifiers abstract_declarator_opt' pass# identifier-list:def p_identifier_list_1(t): 'identifier_list : ID' passdef p_identifier_list_2(t): 'identifier_list : identifier_list COMMA ID' pass# initializer:def p_initializer_1(t): 'initializer : assignment_expression' passdef p_initializer_2(t): '''initializer : LBRACE initializer_list RBRACE | LBRACE initializer_list COMMA RBRACE''' pass# initializer-list:def p_initializer_list_1(t): 'initializer_list : initializer' passdef p_initializer_list_2(t): 'initializer_list : initializer_list COMMA initializer' pass# type-name:def p_type_name(t): 'type_name : specifier_qualifier_list abstract_declarator_opt' passdef p_abstract_declarator_opt_1(t): 'abstract_declarator_opt : empty' passdef p_abstract_declarator_opt_2(t): 'abstract_declarator_opt : abstract_declarator' pass# abstract-declarator:def p_abstract_declarator_1(t): 'abstract_declarator : pointer ' passdef p_abstract_declarator_2(t): 'abstract_declarator : pointer direct_abstract_declarator' passdef p_abstract_declarator_3(t): 'abstract_declarator : direct_abstract_declarator' pass# direct-abstract-declarator:def p_direct_abstract_declarator_1(t): 'direct_abstract_declarator : LPAREN abstract_declarator RPAREN' passdef p_direct_abstract_declarator_2(t): 'direct_abstract_declarator : direct_abstract_declarator LBRACKET constant_expression_opt RBRACKET' passdef p_direct_abstract_declarator_3(t): 'direct_abstract_declarator : LBRACKET constant_expression_opt RBRACKET' passdef p_direct_abstract_declarator_4(t): 'direct_abstract_declarator : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN' passdef p_direct_abstract_declarator_5(t): 'direct_abstract_declarator : LPAREN parameter_type_list_opt RPAREN' pass
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -