From 5764dba8ca294a5033484928ad5f59382f825b77 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 25 Feb 2009 23:47:02 -0500 Subject: [PATCH] Added Jeff Lee's ANSI C yacc grammar. This isn't actually a Lemon-compatible grammar, nor HLSL at all. Just a starting point. --- mojoshader_parser_hlsl.lemon | 432 +++++++++++++++++++++++++++++++++++ 1 file changed, 432 insertions(+) create mode 100644 mojoshader_parser_hlsl.lemon diff --git a/mojoshader_parser_hlsl.lemon b/mojoshader_parser_hlsl.lemon new file mode 100644 index 00000000..950b312e --- /dev/null +++ b/mojoshader_parser_hlsl.lemon @@ -0,0 +1,432 @@ +%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 + +extern char yytext[]; +extern int column; + +yyerror(s) +char *s; +{ + fflush(stdout); + printf("\n%*s\n%*s\n", column, "^", column, s); +}