simple-c3.y

来自「使用yacc和lex编写的cmm语言的词法分析和语法分析程序.」· Y 代码 · 共 828 行 · 第 1/2 页

Y
828
字号
        : TYPESPEC
        | structsp_nonattr
typespec_reserved_attr
        : structsp_attr
typespec_nonreserved_nonattr
        : TYPENAME
        | typeof '(' expr ')'
        | typeof '(' typename ')'
initdecls
        : initdcl
        | initdecls ',' maybe_resetattrs initdcl
notype_initdecls
        : notype_initdcl
        | notype_initdecls ',' maybe_resetattrs notype_initdcl
initdcl
        : declarator maybeasm maybe_attribute '='
        init
        }
        | declarator maybeasm maybe_attribute
notype_initdcl
        : notype_declarator maybeasm maybe_attribute '='
        init
        }
        | notype_declarator maybeasm maybe_attribute
maybe_attribute
        : | attributes
attributes
        : attribute
        | attributes attribute
attribute
        : ATTRIBUTE stop_string_translation
        '(' '(' attribute_list ')' ')' start_string_translation
        | ATTRIBUTE error start_string_translation
attribute_list
        : attrib
        | attribute_list ',' attrib
attrib
        : | any_word
        | any_word '(' IDENTIFIER ')'
        | any_word '(' IDENTIFIER ',' nonnull_exprlist ')'
        | any_word '(' exprlist ')'
any_word
        : identifier
        | scspec
        | TYPESPEC
        | TYPE_QUAL
scspec
        : STATIC
        | SCSPEC
init
        : expr_no_commas
        | '	  initlist_maybe_comma '}'
        | error
initlist_maybe_comma
        : | initlist1 maybecomma
initlist1
        : initelt
        | initlist1 ',' initelt
initelt
        : designator_list '=' initval
        | array_designator initval
        | identifier ':'
        initval
        | initval
initval
        : '{' initlist_maybe_comma '}'
        | expr_no_commas
        | error
designator_list
        : designator
        | designator_list designator
designator
        : '.' identifier
        | array_designator
array_designator
        : '[' expr_no_commas ELLIPSIS expr_no_commas ']'
        | '[' expr_no_commas ']'
nested_function
        : declarator old_style_parm_decls save_location compstmt
notype_nested_function
        : notype_declarator  old_style_parm_decls save_location compstmt
declarator
        : after_type_declarator
        | notype_declarator
after_type_declarator
        : '(' maybe_attribute after_type_declarator ')'
        | after_type_declarator '(' parmlist_or_identifiers  %prec '.'
        | after_type_declarator array_declarator  %prec '.'
        | '*' maybe_type_quals_attrs after_type_declarator  %prec UNARY
        | TYPENAME
parm_declarator
        : parm_declarator_starttypename
        | parm_declarator_nostarttypename
parm_declarator_starttypename
        : parm_declarator_starttypename '(' parmlist_or_identifiers  %prec '.'
        | parm_declarator_starttypename array_declarator  %prec '.'
        | TYPENAME
parm_declarator_nostarttypename
        : parm_declarator_nostarttypename '(' parmlist_or_identifiers  %prec '.'
        | parm_declarator_nostarttypename array_declarator  %prec '.'
        | '*' maybe_type_quals_attrs parm_declarator_starttypename  %prec UNARY
        | '*' maybe_type_quals_attrs parm_declarator_nostarttypename  %prec UNARY
        | '(' maybe_attribute parm_declarator_nostarttypename ')'
notype_declarator
        : notype_declarator '(' parmlist_or_identifiers  %prec '.'
        | '(' maybe_attribute notype_declarator ')'
        | '*' maybe_type_quals_attrs notype_declarator  %prec UNARY
        | notype_declarator array_declarator  %prec '.'
        | IDENTIFIER
struct_head
        : STRUCT
        | STRUCT attributes
union_head
        : UNION
        | UNION attributes
enum_head
        : ENUM
        | ENUM attributes
structsp_attr
        : struct_head identifier '{'
          component_decl_list '}' maybe_attribute
        | struct_head '{' component_decl_list '}' maybe_attribute
        | union_head identifier '{'
          component_decl_list '}' maybe_attribute
        | union_head '{' component_decl_list '}' maybe_attribute
        | enum_head identifier '{'
          enumlist maybecomma_warn '}' maybe_attribute
        | enum_head '{'
          enumlist maybecomma_warn '}' maybe_attribute
structsp_nonattr
        : struct_head identifier
        | union_head identifier
        | enum_head identifier
maybecomma
        : | ','
maybecomma_warn
        : | ','
component_decl_list
        : component_decl_list2
        | component_decl_list2 component_decl
component_decl_list2
        : | component_decl_list2 ';'
component_decl
        : declspecs_nosc_ts setspecs components
        | declspecs_nosc_ts setspecs
        | declspecs_nosc_nots setspecs components_notype
        | declspecs_nosc_nots
        | error
        | extension component_decl
components
        : component_declarator
        | components ',' maybe_resetattrs component_declarator
components_notype
        : component_notype_declarator
        | components_notype ',' maybe_resetattrs component_notype_declarator
component_declarator
        : declarator maybe_attribute
        | declarator ':' expr_no_commas maybe_attribute
        | ':' expr_no_commas maybe_attribute
component_notype_declarator
        : notype_declarator maybe_attribute
        | notype_declarator ':' expr_no_commas maybe_attribute
        | ':' expr_no_commas maybe_attribute
enumlist
        : enumerator
        | enumlist ',' enumerator
        | error
enumerator
        : identifier
        | identifier '=' expr_no_commas
typename
        : declspecs_nosc
        absdcl
absdcl
        : ;
absdcl_maybe_attribute
        : | absdcl1_noea attributes
absdcl1
        : | absdcl1_noea
absdcl1_noea
        : direct_absdcl1
        | '*' maybe_type_quals_attrs absdcl1_noea
absdcl1_ea
        : '*' maybe_type_quals_attrs
        | '*' maybe_type_quals_attrs absdcl1_ea
direct_absdcl1
        : '(' maybe_attribute absdcl1 ')'
        | direct_absdcl1 '(' parmlist
        | direct_absdcl1 array_declarator
        | '(' parmlist
        | array_declarator
array_declarator
        : '[' maybe_type_quals_attrs expr_no_commas ']'
        | '[' maybe_type_quals_attrs ']'
        | '[' maybe_type_quals_attrs '*' ']'
        | '[' STATIC maybe_type_quals_attrs expr_no_commas ']'
        | '[' declspecs_nosc_nots STATIC expr_no_commas ']'
stmts_and_decls
        : lineno_stmt_decl_or_labels_ending_stmt
        | lineno_stmt_decl_or_labels_ending_decl
        | lineno_stmt_decl_or_labels_ending_label
        | lineno_stmt_decl_or_labels_ending_error
lineno_stmt_decl_or_labels_ending_stmt
        : lineno_stmt
        | lineno_stmt_decl_or_labels_ending_stmt lineno_stmt
        | lineno_stmt_decl_or_labels_ending_decl lineno_stmt
        | lineno_stmt_decl_or_labels_ending_label lineno_stmt
        | lineno_stmt_decl_or_labels_ending_error lineno_stmt
lineno_stmt_decl_or_labels_ending_decl
        : lineno_decl
        | lineno_stmt_decl_or_labels_ending_stmt lineno_decl
        | lineno_stmt_decl_or_labels_ending_decl lineno_decl
        | lineno_stmt_decl_or_labels_ending_error lineno_decl
lineno_stmt_decl_or_labels_ending_label
        : lineno_label
        | lineno_stmt_decl_or_labels_ending_stmt lineno_label
        | lineno_stmt_decl_or_labels_ending_decl lineno_label
        | lineno_stmt_decl_or_labels_ending_label lineno_label
        | lineno_stmt_decl_or_labels_ending_error lineno_label
lineno_stmt_decl_or_labels_ending_error
        : errstmt
        | lineno_stmt_decl_or_labels errstmt
lineno_stmt_decl_or_labels
        : lineno_stmt_decl_or_labels_ending_stmt
        | lineno_stmt_decl_or_labels_ending_decl
        | lineno_stmt_decl_or_labels_ending_label
        | lineno_stmt_decl_or_labels_ending_error
errstmt
        : ;
c99_block_start
        : 
        maybe_label_decls:
        | label_decls
label_decls
        : label_decl
        | label_decls label_decl
label_decl
        : LABEL identifiers_or_typenames ';'
}
compstmt_or_error
        : compstmt
        | error compstmt
compstmt_start
        : 
        compstmt_nostart: '}'
        | maybe_label_decls compstmt_contents_nonempty '}'
compstmt_contents_nonempty
        : stmts_and_decls
        | error
compstmt_primary_start:
                      '(' '{'
compstmt
        : ;
save_location
        : ;
lineno_labels
        : | lineno_labels lineno_label
c99_block_lineno_labeled_stmt
        : c99_block_start lineno_labels lineno_stmt
lineno_stmt
        : save_location stmt
lineno_label
        : save_location label
condition
        : ;
if_statement_1
        : c99_block_start lineno_labels if_statement
if_statement_2
        : c99_block_start lineno_labels ';'
        | c99_block_lineno_labeled_stmt
if_statement
        : IF c99_block_start save_location '(' condition ')'
        if_statement_1 ELSE if_statement_2
        | IF c99_block_start save_location '(' condition ')'
        if_statement_2 ELSE if_statement_2
        | IF c99_block_start save_location '(' condition ')'
        if_statement_1				%prec IF
        | IF c99_block_start save_location '(' condition ')'
        if_statement_2				%prec IF
start_break
        : 
        start_continue: 			;
while_statement
        : WHILE c99_block_start save_location '(' condition ')'
        start_break start_continue c99_block_lineno_labeled_stmt
do_statement
        : DO c99_block_start save_location start_break start_continue
        c99_block_lineno_labeled_stmt WHILE
        '(' condition ')' ';'
xexpr
        : | expr
for_init_stmt
        : xexpr ';'
        | decl
for_cond_expr
        : save_location xexpr
for_incr_expr
        : xexpr
for_statement
        :
        FOR c99_block_start '(' for_init_stmt
        save_location for_cond_expr ';' for_incr_expr ')'
        start_break start_continue c99_block_lineno_labeled_stmt
switch_statement
        : SWITCH c99_block_start '(' expr ')'
        start_break c99_block_lineno_labeled_stmt
stmt_nocomp
        : expr ';'
        | if_statement
        | while_statement
        | do_statement
        | for_statement
        | switch_statement
        | BREAK ';'
        | CONTINUE ';'
        | RETURN ';'
        | RETURN expr ';'
        | asm_stmt
        | GOTO identifier ';'
        | GOTO '*' expr ';'
        | ';'
stmt
        : compstmt
        | stmt_nocomp
label
        : CASE expr_no_commas ':'
        | CASE expr_no_commas ELLIPSIS expr_no_commas ':'
        | DEFAULT ':'
        | identifier save_location ':' maybe_attribute
simple_asm_expr
        : ASM_KEYWORD stop_string_translation
        '(' asm_string ')' start_string_translation
maybeasm
        : | simple_asm_expr
asmdef
        : simple_asm_expr ';'
        | ASM_KEYWORD error start_string_translation ';'
asm_stmt
        : ASM_KEYWORD maybe_volatile stop_string_translation
        '(' asm_argument ')' start_string_translation ';'
asm_argument
        : asm_string
        | asm_string ':' asm_operands
        | asm_string ':' asm_operands ':' asm_operands
        | asm_string ':' asm_operands ':' asm_operands ':' asm_clobbers
maybe_volatile:
              /* empty */
        | TYPE_QUAL
asm_operands
        : ;
nonnull_asm_operands
        : asm_operand
        | nonnull_asm_operands ',' asm_operand
asm_operand
        : asm_string start_string_translation '(' expr ')'
        stop_string_translation
        | '[' identifier ']' asm_string start_string_translation
        '(' expr ')' stop_string_translation
asm_clobbers
        : asm_string
        | asm_clobbers ',' asm_string
asm_string
        : STRING
        else
        $$ = $1; }
stop_string_translation
        : ;
start_string_translation
        : ;
parmlist
        : maybe_attribute
        parmlist_1
parmlist_1
        : parmlist_2 ')'
        | parms ';'
          maybe_attribute
          parmlist_1
        | error ')'
parmlist_2
        : | parms
        | parms ',' ELLIPSIS
parms
        : firstparm
        | parms ',' parm
parm
        : declspecs_ts setspecs parm_declarator maybe_attribute
        | declspecs_ts setspecs notype_declarator maybe_attribute
        | declspecs_ts setspecs absdcl_maybe_attribute
        | declspecs_nots setspecs notype_declarator maybe_attribute
        | declspecs_nots setspecs absdcl_maybe_attribute
firstparm
        : declspecs_ts_nosa setspecs_fp parm_declarator maybe_attribute
        | declspecs_ts_nosa setspecs_fp notype_declarator maybe_attribute
        | declspecs_ts_nosa setspecs_fp absdcl_maybe_attribute
        | declspecs_nots_nosa setspecs_fp notype_declarator maybe_attribute
        | declspecs_nots_nosa setspecs_fp absdcl_maybe_attribute
setspecs_fp
        : setspecs
parmlist_or_identifiers
        : maybe_attribute
        parmlist_or_identifiers_1
parmlist_or_identifiers_1
        : parmlist_1
        | identifiers ')'
identifiers
        : IDENTIFIER
        | identifiers ',' IDENTIFIER
identifiers_or_typenames
        : identifier
        | identifiers_or_typenames ',' identifier
extension
        : EXTENSION
%%

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?