parser/c_compiler/parser.y
changeset 37 0fbbe329c3a2
child 39 46d7ec9d63bd
new file mode 100644
--- /dev/null
+++ b/parser/c_compiler/parser.y
@@ -0,0 +1,435 @@
+%{
+	#include "prototypes.h"
+%}
+%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 ELIPSIS RANGE
+
+%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
+
+%start file
+%%
+
+primary_expr
+	: identifier
+	| CONSTANT
+	| STRING_LITERAL
+	| '(' expr ')'
+	;
+
+postfix_expr
+	: primary_expr
+	| postfix_expr '[' expr ']'
+	| postfix_expr '(' ')'
+	| postfix_expr '(' argument_expr_list ')'
+	| postfix_expr '.' identifier
+	| postfix_expr PTR_OP identifier
+	| postfix_expr INC_OP
+	| postfix_expr DEC_OP
+	;
+
+argument_expr_list
+	: assignment_expr
+	| argument_expr_list ',' assignment_expr
+	;
+
+unary_expr
+	: postfix_expr
+	| INC_OP unary_expr
+	| DEC_OP unary_expr
+	| unary_operator cast_expr
+	| SIZEOF unary_expr
+	| SIZEOF '(' type_name ')'
+	;
+
+unary_operator
+	: '&'
+	| '*'
+	| '+'
+	| '-'
+	| '~'
+	| '!'
+	;
+
+cast_expr
+	: unary_expr
+	| '(' type_name ')' cast_expr
+	;
+
+multiplicative_expr
+	: cast_expr
+	| multiplicative_expr '*' cast_expr
+	| multiplicative_expr '/' cast_expr
+	| multiplicative_expr '%' cast_expr
+	;
+
+additive_expr
+	: multiplicative_expr
+	| additive_expr '+' multiplicative_expr
+	| additive_expr '-' multiplicative_expr
+	;
+
+shift_expr
+	: additive_expr
+	| shift_expr LEFT_OP additive_expr
+	| shift_expr RIGHT_OP additive_expr
+	;
+
+relational_expr
+	: shift_expr
+	| relational_expr '<' shift_expr
+	| relational_expr '>' shift_expr
+	| relational_expr LE_OP shift_expr
+	| relational_expr GE_OP shift_expr
+	;
+
+equality_expr
+	: relational_expr
+	| equality_expr EQ_OP relational_expr
+	| equality_expr NE_OP relational_expr
+	;
+
+and_expr
+	: equality_expr
+	| and_expr '&' equality_expr
+	;
+
+exclusive_or_expr
+	: and_expr
+	| exclusive_or_expr '^' and_expr
+	;
+
+inclusive_or_expr
+	: exclusive_or_expr
+	| inclusive_or_expr '|' exclusive_or_expr
+	;
+
+logical_and_expr
+	: inclusive_or_expr
+	| logical_and_expr AND_OP inclusive_or_expr
+	;
+
+logical_or_expr
+	: logical_and_expr
+	| logical_or_expr OR_OP logical_and_expr
+	;
+
+conditional_expr
+	: logical_or_expr
+	| logical_or_expr '?' logical_or_expr ':' conditional_expr
+	;
+
+assignment_expr
+	: conditional_expr
+	| unary_expr assignment_operator assignment_expr
+	;
+
+assignment_operator
+	: '='
+	| MUL_ASSIGN
+	| DIV_ASSIGN
+	| MOD_ASSIGN
+	| ADD_ASSIGN
+	| SUB_ASSIGN
+	| LEFT_ASSIGN
+	| RIGHT_ASSIGN
+	| AND_ASSIGN
+	| XOR_ASSIGN
+	| OR_ASSIGN
+	;
+
+expr
+	: assignment_expr
+	| expr ',' assignment_expr
+	;
+
+constant_expr
+	: conditional_expr
+	;
+
+declaration
+	: declaration_specifiers ';'
+	| declaration_specifiers init_declarator_list ';'
+	;
+
+declaration_specifiers
+	: storage_class_specifier
+	| storage_class_specifier declaration_specifiers
+	| type_specifier
+	| type_specifier 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
+	: CHAR
+	| SHORT
+	| INT
+	| LONG
+	| SIGNED
+	| UNSIGNED
+	| FLOAT
+	| DOUBLE
+	| CONST
+	| VOLATILE
+	| VOID
+	| 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
+	: type_specifier_list struct_declarator_list ';'
+	;
+
+struct_declarator_list
+	: struct_declarator
+	| struct_declarator_list ',' struct_declarator
+	;
+
+struct_declarator
+	: declarator
+	| ':' constant_expr
+	| declarator ':' constant_expr
+	;
+
+enum_specifier
+	: ENUM '{' enumerator_list '}'
+	| ENUM identifier '{' enumerator_list '}'
+	| ENUM identifier
+	;
+
+enumerator_list
+	: enumerator
+	| enumerator_list ',' enumerator
+	;
+
+enumerator
+	: identifier
+	| identifier '=' constant_expr
+	;
+
+declarator
+	: declarator2
+	| pointer declarator2
+	;
+
+declarator2
+	: identifier
+	| '(' declarator ')'
+	| declarator2 '[' ']'
+	| declarator2 '[' constant_expr ']'
+	| declarator2 '(' ')'
+	| declarator2 '(' parameter_type_list ')'
+	| declarator2 '(' parameter_identifier_list ')'
+	;
+
+pointer
+	: '*'
+	| '*' type_specifier_list
+	| '*' pointer
+	| '*' type_specifier_list pointer
+	;
+
+type_specifier_list
+	: type_specifier
+	| type_specifier_list type_specifier
+	;
+
+parameter_identifier_list
+	: identifier_list
+	| identifier_list ',' ELIPSIS
+	;
+
+identifier_list
+	: identifier
+	| identifier_list ',' identifier
+	;
+
+parameter_type_list
+	: parameter_list
+	| parameter_list ',' ELIPSIS
+	;
+
+parameter_list
+	: parameter_declaration
+	| parameter_list ',' parameter_declaration
+	;
+
+parameter_declaration
+	: type_specifier_list declarator
+	| type_name
+	;
+
+type_name
+	: type_specifier_list
+	| type_specifier_list abstract_declarator
+	;
+
+abstract_declarator
+	: pointer
+	| abstract_declarator2
+	| pointer abstract_declarator2
+	;
+
+abstract_declarator2
+	: '(' abstract_declarator ')'
+	| '[' ']'
+	| '[' constant_expr ']'
+	| abstract_declarator2 '[' ']'
+	| abstract_declarator2 '[' constant_expr ']'
+	| '(' ')'
+	| '(' parameter_type_list ')'
+	| abstract_declarator2 '(' ')'
+	| abstract_declarator2 '(' parameter_type_list ')'
+	;
+
+initializer
+	: assignment_expr
+	| '{' 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_expr ':' 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
+	: ';'
+	| expr ';'
+	;
+
+selection_statement
+	: IF '(' expr ')' statement
+	| IF '(' expr ')' statement ELSE statement
+	| SWITCH '(' expr ')' statement
+	;
+
+iteration_statement
+	: WHILE '(' expr ')' statement
+	| DO statement WHILE '(' expr ')' ';'
+	| FOR '(' ';' ';' ')' statement
+	| FOR '(' ';' ';' expr ')' statement
+	| FOR '(' ';' expr ';' ')' statement
+	| FOR '(' ';' expr ';' expr ')' statement
+	| FOR '(' expr ';' ';' ')' statement
+	| FOR '(' expr ';' ';' expr ')' statement
+	| FOR '(' expr ';' expr ';' ')' statement
+	| FOR '(' expr ';' expr ';' expr ')' statement
+	;
+
+jump_statement
+	: GOTO identifier ';'
+	| CONTINUE ';'
+	| BREAK ';'
+	| RETURN ';'
+	| RETURN expr ';'
+	;
+
+file
+	: external_definition
+	| file external_definition
+	;
+
+external_definition
+	: function_definition
+	| declaration
+	;
+
+function_definition
+	: declarator function_body
+	| declaration_specifiers declarator function_body
+	;
+
+function_body
+	: compound_statement
+	| declaration_list compound_statement
+	;
+
+identifier
+	: IDENTIFIER
+	;
+%%
+
+#include <stdio.h>
+
+extern YYSTYPE yytext;
+extern int column;
+
+void yyerror(char *s)
+{
+	fflush(stdout);
+	printf("[%4d]: %s\n", column, yytext);
+	printf("\n%*s\n%*s\n", column, "^", column, s);
+}