mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			419 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			419 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF
 | 
						|
%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
 | 
						|
%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
 | 
						|
%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
 | 
						|
%token XOR_ASSIGN OR_ASSIGN TYPE_NAME
 | 
						|
 | 
						|
%token TYPEDEF EXTERN STATIC AUTO REGISTER
 | 
						|
%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID
 | 
						|
%token STRUCT UNION ENUM ELLIPSIS
 | 
						|
 | 
						|
%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
 | 
						|
 | 
						|
%nonassoc IF_WITHOUT_ELSE
 | 
						|
%nonassoc ELSE
 | 
						|
 | 
						|
%start translation_unit
 | 
						|
%%
 | 
						|
 | 
						|
primary_expression
 | 
						|
    : IDENTIFIER
 | 
						|
    | CONSTANT
 | 
						|
    | STRING_LITERAL
 | 
						|
    | '(' expression ')'
 | 
						|
    ;
 | 
						|
 | 
						|
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
 | 
						|
    ;
 | 
						|
 | 
						|
argument_expression_list
 | 
						|
    : assignment_expression
 | 
						|
    | argument_expression_list ',' assignment_expression
 | 
						|
    ;
 | 
						|
 | 
						|
unary_expression
 | 
						|
    : postfix_expression
 | 
						|
    | INC_OP unary_expression
 | 
						|
    | DEC_OP 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
 | 
						|
    ;
 | 
						|
 | 
						|
additive_expression
 | 
						|
    : multiplicative_expression
 | 
						|
    | additive_expression '+' multiplicative_expression
 | 
						|
    | additive_expression '-' multiplicative_expression
 | 
						|
    ;
 | 
						|
 | 
						|
shift_expression
 | 
						|
    : additive_expression
 | 
						|
    | shift_expression LEFT_OP additive_expression
 | 
						|
    | shift_expression RIGHT_OP additive_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
 | 
						|
    ;
 | 
						|
 | 
						|
equality_expression
 | 
						|
    : relational_expression
 | 
						|
    | equality_expression EQ_OP relational_expression
 | 
						|
    | equality_expression NE_OP relational_expression
 | 
						|
    ;
 | 
						|
 | 
						|
and_expression
 | 
						|
    : equality_expression
 | 
						|
    | and_expression '&' equality_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 AND_OP inclusive_or_expression
 | 
						|
    ;
 | 
						|
 | 
						|
logical_or_expression
 | 
						|
    : logical_and_expression
 | 
						|
    | logical_or_expression OR_OP 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
 | 
						|
    : '='
 | 
						|
    | MUL_ASSIGN
 | 
						|
    | DIV_ASSIGN
 | 
						|
    | MOD_ASSIGN
 | 
						|
    | ADD_ASSIGN
 | 
						|
    | SUB_ASSIGN
 | 
						|
    | LEFT_ASSIGN
 | 
						|
    | RIGHT_ASSIGN
 | 
						|
    | AND_ASSIGN
 | 
						|
    | XOR_ASSIGN
 | 
						|
    | OR_ASSIGN
 | 
						|
    ;
 | 
						|
 | 
						|
expression
 | 
						|
    : assignment_expression
 | 
						|
    | expression ',' assignment_expression
 | 
						|
    ;
 | 
						|
 | 
						|
constant_expression
 | 
						|
    : conditional_expression
 | 
						|
    ;
 | 
						|
 | 
						|
declaration
 | 
						|
    : declaration_specifiers ';'
 | 
						|
    | declaration_specifiers init_declarator_list ';'
 | 
						|
    ;
 | 
						|
 | 
						|
declaration_specifiers
 | 
						|
    : storage_class_specifier
 | 
						|
    | storage_class_specifier declaration_specifiers
 | 
						|
    | type_specifier
 | 
						|
    | type_specifier declaration_specifiers
 | 
						|
    | type_qualifier
 | 
						|
    | type_qualifier declaration_specifiers
 | 
						|
    ;
 | 
						|
 | 
						|
init_declarator_list
 | 
						|
    : init_declarator
 | 
						|
    | init_declarator_list ',' init_declarator
 | 
						|
    ;
 | 
						|
 | 
						|
init_declarator
 | 
						|
    : declarator
 | 
						|
    | declarator '=' initializer
 | 
						|
    ;
 | 
						|
 | 
						|
storage_class_specifier
 | 
						|
    : TYPEDEF
 | 
						|
    | EXTERN
 | 
						|
    | STATIC
 | 
						|
    | AUTO
 | 
						|
    | REGISTER
 | 
						|
    ;
 | 
						|
 | 
						|
type_specifier
 | 
						|
    : VOID
 | 
						|
    | CHAR
 | 
						|
    | SHORT
 | 
						|
    | INT
 | 
						|
    | LONG
 | 
						|
    | FLOAT
 | 
						|
    | DOUBLE
 | 
						|
    | SIGNED
 | 
						|
    | UNSIGNED
 | 
						|
    | struct_or_union_specifier
 | 
						|
    | enum_specifier
 | 
						|
    | TYPE_NAME
 | 
						|
    ;
 | 
						|
 | 
						|
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
 | 
						|
    ;
 | 
						|
 | 
						|
type_qualifier
 | 
						|
    : CONST
 | 
						|
    | VOLATILE
 | 
						|
    ;
 | 
						|
 | 
						|
declarator
 | 
						|
    : pointer direct_declarator
 | 
						|
    | direct_declarator
 | 
						|
    ;
 | 
						|
 | 
						|
direct_declarator
 | 
						|
    : IDENTIFIER
 | 
						|
    | '(' declarator ')'
 | 
						|
    | direct_declarator '[' constant_expression ']'
 | 
						|
    | direct_declarator '[' ']'
 | 
						|
    | direct_declarator '(' parameter_type_list ')'
 | 
						|
    | direct_declarator '(' identifier_list ')'
 | 
						|
    | direct_declarator '(' ')'
 | 
						|
    ;
 | 
						|
 | 
						|
pointer
 | 
						|
    : '*'
 | 
						|
    | '*' type_qualifier_list
 | 
						|
    | '*' pointer
 | 
						|
    | '*' type_qualifier_list pointer
 | 
						|
    ;
 | 
						|
 | 
						|
type_qualifier_list
 | 
						|
    : type_qualifier
 | 
						|
    | type_qualifier_list type_qualifier
 | 
						|
    ;
 | 
						|
 | 
						|
 | 
						|
parameter_type_list
 | 
						|
    : parameter_list
 | 
						|
    | parameter_list ',' ELLIPSIS
 | 
						|
    ;
 | 
						|
 | 
						|
parameter_list
 | 
						|
    : parameter_declaration
 | 
						|
    | parameter_list ',' parameter_declaration
 | 
						|
    ;
 | 
						|
 | 
						|
parameter_declaration
 | 
						|
    : declaration_specifiers declarator
 | 
						|
    | declaration_specifiers abstract_declarator
 | 
						|
    | declaration_specifiers
 | 
						|
    ;
 | 
						|
 | 
						|
identifier_list
 | 
						|
    : IDENTIFIER
 | 
						|
    | identifier_list ',' IDENTIFIER
 | 
						|
    ;
 | 
						|
 | 
						|
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 ')'
 | 
						|
    ;
 | 
						|
 | 
						|
initializer
 | 
						|
    : assignment_expression
 | 
						|
    | '{' initializer_list '}'
 | 
						|
    | '{' initializer_list ',' '}'
 | 
						|
    ;
 | 
						|
 | 
						|
initializer_list
 | 
						|
    : initializer
 | 
						|
    | initializer_list ',' initializer
 | 
						|
    ;
 | 
						|
 | 
						|
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
 | 
						|
    : '{' '}'
 | 
						|
    | '{' statement_list '}'
 | 
						|
    | '{' declaration_list '}'
 | 
						|
    | '{' declaration_list statement_list '}'
 | 
						|
    ;
 | 
						|
 | 
						|
declaration_list
 | 
						|
    : declaration
 | 
						|
    | declaration_list declaration
 | 
						|
    ;
 | 
						|
 | 
						|
statement_list
 | 
						|
    : statement
 | 
						|
    | statement_list statement
 | 
						|
    ;
 | 
						|
 | 
						|
expression_statement
 | 
						|
    : ';'
 | 
						|
    | expression ';'
 | 
						|
    ;
 | 
						|
 | 
						|
selection_statement
 | 
						|
    : IF '(' expression ')' statement %prec IF_WITHOUT_ELSE
 | 
						|
    | IF '(' expression ')' statement ELSE statement
 | 
						|
    | SWITCH '(' expression ')' statement
 | 
						|
    ;
 | 
						|
 | 
						|
iteration_statement
 | 
						|
    : WHILE '(' expression ')' statement
 | 
						|
    | DO statement WHILE '(' expression ')' ';'
 | 
						|
    | FOR '(' expression_statement expression_statement ')' statement
 | 
						|
    | FOR '(' expression_statement expression_statement expression ')' statement
 | 
						|
    ;
 | 
						|
 | 
						|
jump_statement
 | 
						|
    : GOTO IDENTIFIER ';'
 | 
						|
    | CONTINUE ';'
 | 
						|
    | BREAK ';'
 | 
						|
    | RETURN ';'
 | 
						|
    | RETURN expression ';'
 | 
						|
    ;
 | 
						|
 | 
						|
translation_unit
 | 
						|
    : external_declaration
 | 
						|
    | translation_unit external_declaration
 | 
						|
    ;
 | 
						|
 | 
						|
external_declaration
 | 
						|
    : function_definition
 | 
						|
    | declaration
 | 
						|
    ;
 | 
						|
 | 
						|
function_definition
 | 
						|
    : declaration_specifiers declarator declaration_list compound_statement
 | 
						|
    | declaration_specifiers declarator compound_statement
 | 
						|
    | declarator declaration_list compound_statement
 | 
						|
    | declarator compound_statement
 | 
						|
    ;
 |