Path: blob/main/third_party/ply/example/ansic/cparse.py
7087 views
# -----------------------------------------------------------------------------1# cparse.py2#3# Simple parser for ANSI C. Based on the grammar in K&R, 2nd Ed.4# -----------------------------------------------------------------------------56import sys7import clex8import ply.yacc as yacc910# Get the token map11tokens = clex.tokens1213# translation-unit:1415def p_translation_unit_1(t):16'translation_unit : external_declaration'17pass1819def p_translation_unit_2(t):20'translation_unit : translation_unit external_declaration'21pass2223# external-declaration:2425def p_external_declaration_1(t):26'external_declaration : function_definition'27pass2829def p_external_declaration_2(t):30'external_declaration : declaration'31pass3233# function-definition:3435def p_function_definition_1(t):36'function_definition : declaration_specifiers declarator declaration_list compound_statement'37pass3839def p_function_definition_2(t):40'function_definition : declarator declaration_list compound_statement'41pass4243def p_function_definition_3(t):44'function_definition : declarator compound_statement'45pass4647def p_function_definition_4(t):48'function_definition : declaration_specifiers declarator compound_statement'49pass5051# declaration:5253def p_declaration_1(t):54'declaration : declaration_specifiers init_declarator_list SEMI'55pass5657def p_declaration_2(t):58'declaration : declaration_specifiers SEMI'59pass6061# declaration-list:6263def p_declaration_list_1(t):64'declaration_list : declaration'65pass6667def p_declaration_list_2(t):68'declaration_list : declaration_list declaration '69pass7071# declaration-specifiers72def p_declaration_specifiers_1(t):73'declaration_specifiers : storage_class_specifier declaration_specifiers'74pass7576def p_declaration_specifiers_2(t):77'declaration_specifiers : type_specifier declaration_specifiers'78pass7980def p_declaration_specifiers_3(t):81'declaration_specifiers : type_qualifier declaration_specifiers'82pass8384def p_declaration_specifiers_4(t):85'declaration_specifiers : storage_class_specifier'86pass8788def p_declaration_specifiers_5(t):89'declaration_specifiers : type_specifier'90pass9192def p_declaration_specifiers_6(t):93'declaration_specifiers : type_qualifier'94pass9596# storage-class-specifier97def p_storage_class_specifier(t):98'''storage_class_specifier : AUTO99| REGISTER100| STATIC101| EXTERN102| TYPEDEF103'''104pass105106# type-specifier:107def p_type_specifier(t):108'''type_specifier : VOID109| CHAR110| SHORT111| INT112| LONG113| FLOAT114| DOUBLE115| SIGNED116| UNSIGNED117| struct_or_union_specifier118| enum_specifier119| TYPEID120'''121pass122123# type-qualifier:124def p_type_qualifier(t):125'''type_qualifier : CONST126| VOLATILE'''127pass128129# struct-or-union-specifier130131def p_struct_or_union_specifier_1(t):132'struct_or_union_specifier : struct_or_union ID LBRACE struct_declaration_list RBRACE'133pass134135def p_struct_or_union_specifier_2(t):136'struct_or_union_specifier : struct_or_union LBRACE struct_declaration_list RBRACE'137pass138139def p_struct_or_union_specifier_3(t):140'struct_or_union_specifier : struct_or_union ID'141pass142143# struct-or-union:144def p_struct_or_union(t):145'''struct_or_union : STRUCT146| UNION147'''148pass149150# struct-declaration-list:151152def p_struct_declaration_list_1(t):153'struct_declaration_list : struct_declaration'154pass155156def p_struct_declaration_list_2(t):157'struct_declaration_list : struct_declaration_list struct_declaration'158pass159160# init-declarator-list:161162def p_init_declarator_list_1(t):163'init_declarator_list : init_declarator'164pass165166def p_init_declarator_list_2(t):167'init_declarator_list : init_declarator_list COMMA init_declarator'168pass169170# init-declarator171172def p_init_declarator_1(t):173'init_declarator : declarator'174pass175176def p_init_declarator_2(t):177'init_declarator : declarator EQUALS initializer'178pass179180# struct-declaration:181182def p_struct_declaration(t):183'struct_declaration : specifier_qualifier_list struct_declarator_list SEMI'184pass185186# specifier-qualifier-list:187188def p_specifier_qualifier_list_1(t):189'specifier_qualifier_list : type_specifier specifier_qualifier_list'190pass191192def p_specifier_qualifier_list_2(t):193'specifier_qualifier_list : type_specifier'194pass195196def p_specifier_qualifier_list_3(t):197'specifier_qualifier_list : type_qualifier specifier_qualifier_list'198pass199200def p_specifier_qualifier_list_4(t):201'specifier_qualifier_list : type_qualifier'202pass203204# struct-declarator-list:205206def p_struct_declarator_list_1(t):207'struct_declarator_list : struct_declarator'208pass209210def p_struct_declarator_list_2(t):211'struct_declarator_list : struct_declarator_list COMMA struct_declarator'212pass213214# struct-declarator:215216def p_struct_declarator_1(t):217'struct_declarator : declarator'218pass219220def p_struct_declarator_2(t):221'struct_declarator : declarator COLON constant_expression'222pass223224def p_struct_declarator_3(t):225'struct_declarator : COLON constant_expression'226pass227228# enum-specifier:229230def p_enum_specifier_1(t):231'enum_specifier : ENUM ID LBRACE enumerator_list RBRACE'232pass233234def p_enum_specifier_2(t):235'enum_specifier : ENUM LBRACE enumerator_list RBRACE'236pass237238def p_enum_specifier_3(t):239'enum_specifier : ENUM ID'240pass241242# enumerator_list:243def p_enumerator_list_1(t):244'enumerator_list : enumerator'245pass246247def p_enumerator_list_2(t):248'enumerator_list : enumerator_list COMMA enumerator'249pass250251# enumerator:252def p_enumerator_1(t):253'enumerator : ID'254pass255256def p_enumerator_2(t):257'enumerator : ID EQUALS constant_expression'258pass259260# declarator:261262def p_declarator_1(t):263'declarator : pointer direct_declarator'264pass265266def p_declarator_2(t):267'declarator : direct_declarator'268pass269270# direct-declarator:271272def p_direct_declarator_1(t):273'direct_declarator : ID'274pass275276def p_direct_declarator_2(t):277'direct_declarator : LPAREN declarator RPAREN'278pass279280def p_direct_declarator_3(t):281'direct_declarator : direct_declarator LBRACKET constant_expression_opt RBRACKET'282pass283284def p_direct_declarator_4(t):285'direct_declarator : direct_declarator LPAREN parameter_type_list RPAREN '286pass287288def p_direct_declarator_5(t):289'direct_declarator : direct_declarator LPAREN identifier_list RPAREN '290pass291292def p_direct_declarator_6(t):293'direct_declarator : direct_declarator LPAREN RPAREN '294pass295296# pointer:297def p_pointer_1(t):298'pointer : TIMES type_qualifier_list'299pass300301def p_pointer_2(t):302'pointer : TIMES'303pass304305def p_pointer_3(t):306'pointer : TIMES type_qualifier_list pointer'307pass308309def p_pointer_4(t):310'pointer : TIMES pointer'311pass312313# type-qualifier-list:314315def p_type_qualifier_list_1(t):316'type_qualifier_list : type_qualifier'317pass318319def p_type_qualifier_list_2(t):320'type_qualifier_list : type_qualifier_list type_qualifier'321pass322323# parameter-type-list:324325def p_parameter_type_list_1(t):326'parameter_type_list : parameter_list'327pass328329def p_parameter_type_list_2(t):330'parameter_type_list : parameter_list COMMA ELLIPSIS'331pass332333# parameter-list:334335def p_parameter_list_1(t):336'parameter_list : parameter_declaration'337pass338339def p_parameter_list_2(t):340'parameter_list : parameter_list COMMA parameter_declaration'341pass342343# parameter-declaration:344def p_parameter_declaration_1(t):345'parameter_declaration : declaration_specifiers declarator'346pass347348def p_parameter_declaration_2(t):349'parameter_declaration : declaration_specifiers abstract_declarator_opt'350pass351352# identifier-list:353def p_identifier_list_1(t):354'identifier_list : ID'355pass356357def p_identifier_list_2(t):358'identifier_list : identifier_list COMMA ID'359pass360361# initializer:362363def p_initializer_1(t):364'initializer : assignment_expression'365pass366367def p_initializer_2(t):368'''initializer : LBRACE initializer_list RBRACE369| LBRACE initializer_list COMMA RBRACE'''370pass371372# initializer-list:373374def p_initializer_list_1(t):375'initializer_list : initializer'376pass377378def p_initializer_list_2(t):379'initializer_list : initializer_list COMMA initializer'380pass381382# type-name:383384def p_type_name(t):385'type_name : specifier_qualifier_list abstract_declarator_opt'386pass387388def p_abstract_declarator_opt_1(t):389'abstract_declarator_opt : empty'390pass391392def p_abstract_declarator_opt_2(t):393'abstract_declarator_opt : abstract_declarator'394pass395396# abstract-declarator:397398def p_abstract_declarator_1(t):399'abstract_declarator : pointer '400pass401402def p_abstract_declarator_2(t):403'abstract_declarator : pointer direct_abstract_declarator'404pass405406def p_abstract_declarator_3(t):407'abstract_declarator : direct_abstract_declarator'408pass409410# direct-abstract-declarator:411412def p_direct_abstract_declarator_1(t):413'direct_abstract_declarator : LPAREN abstract_declarator RPAREN'414pass415416def p_direct_abstract_declarator_2(t):417'direct_abstract_declarator : direct_abstract_declarator LBRACKET constant_expression_opt RBRACKET'418pass419420def p_direct_abstract_declarator_3(t):421'direct_abstract_declarator : LBRACKET constant_expression_opt RBRACKET'422pass423424def p_direct_abstract_declarator_4(t):425'direct_abstract_declarator : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN'426pass427428def p_direct_abstract_declarator_5(t):429'direct_abstract_declarator : LPAREN parameter_type_list_opt RPAREN'430pass431432# Optional fields in abstract declarators433434def p_constant_expression_opt_1(t):435'constant_expression_opt : empty'436pass437438def p_constant_expression_opt_2(t):439'constant_expression_opt : constant_expression'440pass441442def p_parameter_type_list_opt_1(t):443'parameter_type_list_opt : empty'444pass445446def p_parameter_type_list_opt_2(t):447'parameter_type_list_opt : parameter_type_list'448pass449450# statement:451452def p_statement(t):453'''454statement : labeled_statement455| expression_statement456| compound_statement457| selection_statement458| iteration_statement459| jump_statement460'''461pass462463# labeled-statement:464465def p_labeled_statement_1(t):466'labeled_statement : ID COLON statement'467pass468469def p_labeled_statement_2(t):470'labeled_statement : CASE constant_expression COLON statement'471pass472473def p_labeled_statement_3(t):474'labeled_statement : DEFAULT COLON statement'475pass476477# expression-statement:478def p_expression_statement(t):479'expression_statement : expression_opt SEMI'480pass481482# compound-statement:483484def p_compound_statement_1(t):485'compound_statement : LBRACE declaration_list statement_list RBRACE'486pass487488def p_compound_statement_2(t):489'compound_statement : LBRACE statement_list RBRACE'490pass491492def p_compound_statement_3(t):493'compound_statement : LBRACE declaration_list RBRACE'494pass495496def p_compound_statement_4(t):497'compound_statement : LBRACE RBRACE'498pass499500# statement-list:501502def p_statement_list_1(t):503'statement_list : statement'504pass505506def p_statement_list_2(t):507'statement_list : statement_list statement'508pass509510# selection-statement511512def p_selection_statement_1(t):513'selection_statement : IF LPAREN expression RPAREN statement'514pass515516def p_selection_statement_2(t):517'selection_statement : IF LPAREN expression RPAREN statement ELSE statement '518pass519520def p_selection_statement_3(t):521'selection_statement : SWITCH LPAREN expression RPAREN statement '522pass523524# iteration_statement:525526def p_iteration_statement_1(t):527'iteration_statement : WHILE LPAREN expression RPAREN statement'528pass529530def p_iteration_statement_2(t):531'iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement '532pass533534def p_iteration_statement_3(t):535'iteration_statement : DO statement WHILE LPAREN expression RPAREN SEMI'536pass537538# jump_statement:539540def p_jump_statement_1(t):541'jump_statement : GOTO ID SEMI'542pass543544def p_jump_statement_2(t):545'jump_statement : CONTINUE SEMI'546pass547548def p_jump_statement_3(t):549'jump_statement : BREAK SEMI'550pass551552def p_jump_statement_4(t):553'jump_statement : RETURN expression_opt SEMI'554pass555556def p_expression_opt_1(t):557'expression_opt : empty'558pass559560def p_expression_opt_2(t):561'expression_opt : expression'562pass563564# expression:565def p_expression_1(t):566'expression : assignment_expression'567pass568569def p_expression_2(t):570'expression : expression COMMA assignment_expression'571pass572573# assigment_expression:574def p_assignment_expression_1(t):575'assignment_expression : conditional_expression'576pass577578def p_assignment_expression_2(t):579'assignment_expression : unary_expression assignment_operator assignment_expression'580pass581582# assignment_operator:583def p_assignment_operator(t):584'''585assignment_operator : EQUALS586| TIMESEQUAL587| DIVEQUAL588| MODEQUAL589| PLUSEQUAL590| MINUSEQUAL591| LSHIFTEQUAL592| RSHIFTEQUAL593| ANDEQUAL594| OREQUAL595| XOREQUAL596'''597pass598599# conditional-expression600def p_conditional_expression_1(t):601'conditional_expression : logical_or_expression'602pass603604def p_conditional_expression_2(t):605'conditional_expression : logical_or_expression CONDOP expression COLON conditional_expression '606pass607608# constant-expression609610def p_constant_expression(t):611'constant_expression : conditional_expression'612pass613614# logical-or-expression615616def p_logical_or_expression_1(t):617'logical_or_expression : logical_and_expression'618pass619620def p_logical_or_expression_2(t):621'logical_or_expression : logical_or_expression LOR logical_and_expression'622pass623624# logical-and-expression625626def p_logical_and_expression_1(t):627'logical_and_expression : inclusive_or_expression'628pass629630def p_logical_and_expression_2(t):631'logical_and_expression : logical_and_expression LAND inclusive_or_expression'632pass633634# inclusive-or-expression:635636def p_inclusive_or_expression_1(t):637'inclusive_or_expression : exclusive_or_expression'638pass639640def p_inclusive_or_expression_2(t):641'inclusive_or_expression : inclusive_or_expression OR exclusive_or_expression'642pass643644# exclusive-or-expression:645646def p_exclusive_or_expression_1(t):647'exclusive_or_expression : and_expression'648pass649650def p_exclusive_or_expression_2(t):651'exclusive_or_expression : exclusive_or_expression XOR and_expression'652pass653654# AND-expression655656def p_and_expression_1(t):657'and_expression : equality_expression'658pass659660def p_and_expression_2(t):661'and_expression : and_expression AND equality_expression'662pass663664665# equality-expression:666def p_equality_expression_1(t):667'equality_expression : relational_expression'668pass669670def p_equality_expression_2(t):671'equality_expression : equality_expression EQ relational_expression'672pass673674def p_equality_expression_3(t):675'equality_expression : equality_expression NE relational_expression'676pass677678679# relational-expression:680def p_relational_expression_1(t):681'relational_expression : shift_expression'682pass683684def p_relational_expression_2(t):685'relational_expression : relational_expression LT shift_expression'686pass687688def p_relational_expression_3(t):689'relational_expression : relational_expression GT shift_expression'690pass691692def p_relational_expression_4(t):693'relational_expression : relational_expression LE shift_expression'694pass695696def p_relational_expression_5(t):697'relational_expression : relational_expression GE shift_expression'698pass699700# shift-expression701702def p_shift_expression_1(t):703'shift_expression : additive_expression'704pass705706def p_shift_expression_2(t):707'shift_expression : shift_expression LSHIFT additive_expression'708pass709710def p_shift_expression_3(t):711'shift_expression : shift_expression RSHIFT additive_expression'712pass713714# additive-expression715716def p_additive_expression_1(t):717'additive_expression : multiplicative_expression'718pass719720def p_additive_expression_2(t):721'additive_expression : additive_expression PLUS multiplicative_expression'722pass723724def p_additive_expression_3(t):725'additive_expression : additive_expression MINUS multiplicative_expression'726pass727728# multiplicative-expression729730def p_multiplicative_expression_1(t):731'multiplicative_expression : cast_expression'732pass733734def p_multiplicative_expression_2(t):735'multiplicative_expression : multiplicative_expression TIMES cast_expression'736pass737738def p_multiplicative_expression_3(t):739'multiplicative_expression : multiplicative_expression DIVIDE cast_expression'740pass741742def p_multiplicative_expression_4(t):743'multiplicative_expression : multiplicative_expression MOD cast_expression'744pass745746# cast-expression:747748def p_cast_expression_1(t):749'cast_expression : unary_expression'750pass751752def p_cast_expression_2(t):753'cast_expression : LPAREN type_name RPAREN cast_expression'754pass755756# unary-expression:757def p_unary_expression_1(t):758'unary_expression : postfix_expression'759pass760761def p_unary_expression_2(t):762'unary_expression : PLUSPLUS unary_expression'763pass764765def p_unary_expression_3(t):766'unary_expression : MINUSMINUS unary_expression'767pass768769def p_unary_expression_4(t):770'unary_expression : unary_operator cast_expression'771pass772773def p_unary_expression_5(t):774'unary_expression : SIZEOF unary_expression'775pass776777def p_unary_expression_6(t):778'unary_expression : SIZEOF LPAREN type_name RPAREN'779pass780781#unary-operator782def p_unary_operator(t):783'''unary_operator : AND784| TIMES785| PLUS786| MINUS787| NOT788| LNOT '''789pass790791# postfix-expression:792def p_postfix_expression_1(t):793'postfix_expression : primary_expression'794pass795796def p_postfix_expression_2(t):797'postfix_expression : postfix_expression LBRACKET expression RBRACKET'798pass799800def p_postfix_expression_3(t):801'postfix_expression : postfix_expression LPAREN argument_expression_list RPAREN'802pass803804def p_postfix_expression_4(t):805'postfix_expression : postfix_expression LPAREN RPAREN'806pass807808def p_postfix_expression_5(t):809'postfix_expression : postfix_expression PERIOD ID'810pass811812def p_postfix_expression_6(t):813'postfix_expression : postfix_expression ARROW ID'814pass815816def p_postfix_expression_7(t):817'postfix_expression : postfix_expression PLUSPLUS'818pass819820def p_postfix_expression_8(t):821'postfix_expression : postfix_expression MINUSMINUS'822pass823824# primary-expression:825def p_primary_expression(t):826'''primary_expression : ID827| constant828| SCONST829| LPAREN expression RPAREN'''830pass831832# argument-expression-list:833def p_argument_expression_list(t):834'''argument_expression_list : assignment_expression835| argument_expression_list COMMA assignment_expression'''836pass837838# constant:839def p_constant(t):840'''constant : ICONST841| FCONST842| CCONST'''843pass844845846def p_empty(t):847'empty : '848pass849850def p_error(t):851print("Whoa. We're hosed")852853import profile854# Build the grammar855856yacc.yacc(method='LALR')857858#profile.run("yacc.yacc(method='LALR')")859860861862863864865