Created
April 10, 2019 06:30
-
-
Save onehr/5ba6f651e1eb23e514961273e8a38c89 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/src/parser.rs b/src/parser.rs | |
| index 0900ea9..e31dc55 100644 | |
| --- a/src/parser.rs | |
| +++ b/src/parser.rs | |
| @@ -1,5 +1,542 @@ | |
| use crate::lexer; | |
| +// TODO: | |
| +// Trying to implement a better parser to support c11 full standard | |
| +// assmue the the lexer can contains all keywords in the c11 standard, | |
| +// and assumes it can manipulate the constants (integer, float) correctly. | |
| +// Keywords: | |
| + | |
| +// Identifiers | |
| + | |
| +// Constants | |
| + | |
| +// Punctuators | |
| + | |
| +// Operators | |
| + | |
| +// TOKEN TYPE SHOULD CONTAINS: | |
| +//1. IDENTIFIER | |
| +//2. CONSTANT_TYPE: | |
| +//3. I_CONSTANT F_CONSTANT STRING_LITERAL FUNC_NAME SIZEOF | |
| +// PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP | |
| +// AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN | |
| +// SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN | |
| +// XOR_ASSIGN OR_ASSIGN | |
| +// TYPEDEF_NAME ENUMERATION_CONSTANT | |
| +// TYPEDEF EXTERN STATIC AUTO REGISTER INLINE | |
| +// CONST RESTRICT VOLATILE | |
| +// BOOL CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE VOID | |
| +// COMPLEX IMAGINARY | |
| +// STRUCT UNION ENUM ELLIPSIS | |
| +// CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN | |
| +// ALIGNAS ALIGNOF ATOMIC GENERIC NORETURN STATIC_ASSERT THREAD_LOCAL | |
| + | |
| + | |
| +// primary_expression | |
| +// : IDENTIFIER | |
| +// | constant | |
| +// | string | |
| +// | '(' expression ')' | |
| +// | generic_selection | |
| +// ; | |
| + | |
| +// constant | |
| +// : I_CONSTANT /* includes character_constant */ | |
| +// | F_CONSTANT | |
| +// | ENUMERATION_CONSTANT /* after it has been defined as such */ | |
| +// ; | |
| + | |
| +// enumeration_constant /* before it has been defined as such */ | |
| +// : IDENTIFIER | |
| +// ; | |
| + | |
| +// string | |
| +// : STRING_LITERAL | |
| +// | FUNC_NAME | |
| +// ; | |
| + | |
| +// generic_selection | |
| +// : GENERIC '(' assignment_expression ',' generic_assoc_list ')' | |
| +// ; | |
| + | |
| +// generic_assoc_list | |
| +// : generic_association | |
| +// | generic_assoc_list ',' generic_association | |
| +// ; | |
| + | |
| +// generic_association | |
| +// : type_name ':' assignment_expression | |
| +// | DEFAULT ':' assignment_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 | |
| +// | '(' type_name ')' '{' initializer_list '}' | |
| +// | '(' type_name ')' '{' initializer_list ',' '}' | |
| +// ; | |
| + | |
| +// 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 ')' | |
| +// | ALIGNOF '(' 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 /* with constraints */ | |
| +// ; | |
| + | |
| +// declaration | |
| +// : declaration_specifiers ';' | |
| +// | declaration_specifiers init_declarator_list ';' | |
| +// | static_assert_declaration | |
| +// ; | |
| + | |
| +// declaration_specifiers | |
| +// : storage_class_specifier declaration_specifiers | |
| +// | storage_class_specifier | |
| +// | type_specifier declaration_specifiers | |
| +// | type_specifier | |
| +// | type_qualifier declaration_specifiers | |
| +// | type_qualifier | |
| +// | function_specifier declaration_specifiers | |
| +// | function_specifier | |
| +// | alignment_specifier declaration_specifiers | |
| +// | alignment_specifier | |
| +// ; | |
| + | |
| +// init_declarator_list | |
| +// : init_declarator | |
| +// | init_declarator_list ',' init_declarator | |
| +// ; | |
| + | |
| +// init_declarator | |
| +// : declarator '=' initializer | |
| +// | declarator | |
| +// ; | |
| + | |
| +// storage_class_specifier | |
| +// : TYPEDEF /* identifiers must be flagged as TYPEDEF_NAME */ | |
| +// | EXTERN | |
| +// | STATIC | |
| +// | THREAD_LOCAL | |
| +// | AUTO | |
| +// | REGISTER | |
| +// ; | |
| + | |
| +// type_specifier | |
| +// : VOID | |
| +// | CHAR | |
| +// | SHORT | |
| +// | INT | |
| +// | LONG | |
| +// | FLOAT | |
| +// | DOUBLE | |
| +// | SIGNED | |
| +// | UNSIGNED | |
| +// | BOOL | |
| +// | COMPLEX | |
| +// | IMAGINARY /* non-mandated extension */ | |
| +// | atomic_type_specifier | |
| +// | struct_or_union_specifier | |
| +// | enum_specifier | |
| +// | TYPEDEF_NAME /* after it has been defined as such */ | |
| +// ; | |
| + | |
| +// struct_or_union_specifier | |
| +// : struct_or_union '{' struct_declaration_list '}' | |
| +// | struct_or_union IDENTIFIER '{' 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 ';' /* for anonymous struct/union */ | |
| +// | specifier_qualifier_list struct_declarator_list ';' | |
| +// | static_assert_declaration | |
| +// ; | |
| + | |
| +// 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 | |
| +// : ':' constant_expression | |
| +// | declarator ':' constant_expression | |
| +// | declarator | |
| +// ; | |
| + | |
| +// enum_specifier | |
| +// : ENUM '{' enumerator_list '}' | |
| +// | ENUM '{' enumerator_list ',' '}' | |
| +// | ENUM IDENTIFIER '{' enumerator_list '}' | |
| +// | ENUM IDENTIFIER '{' enumerator_list ',' '}' | |
| +// | ENUM IDENTIFIER | |
| +// ; | |
| + | |
| +// enumerator_list | |
| +// : enumerator | |
| +// | enumerator_list ',' enumerator | |
| +// ; | |
| + | |
| +// enumerator /* identifiers must be flagged as ENUMERATION_CONSTANT */ | |
| +// : enumeration_constant '=' constant_expression | |
| +// | enumeration_constant | |
| +// ; | |
| + | |
| +// atomic_type_specifier | |
| +// : ATOMIC '(' type_name ')' | |
| +// ; | |
| + | |
| +// type_qualifier | |
| +// : CONST | |
| +// | RESTRICT | |
| +// | VOLATILE | |
| +// | ATOMIC | |
| +// ; | |
| + | |
| +// function_specifier | |
| +// : INLINE | |
| +// | NORETURN | |
| +// ; | |
| + | |
| +// alignment_specifier | |
| +// : ALIGNAS '(' type_name ')' | |
| +// | ALIGNAS '(' constant_expression ')' | |
| +// ; | |
| + | |
| +// declarator | |
| +// : pointer direct_declarator | |
| +// | direct_declarator | |
| +// ; | |
| + | |
| +// direct_declarator | |
| +// : IDENTIFIER | |
| +// | '(' declarator ')' | |
| +// | direct_declarator '[' ']' | |
| +// | direct_declarator '[' '*' ']' | |
| +// | direct_declarator '[' STATIC type_qualifier_list assignment_expression ']' | |
| +// | direct_declarator '[' STATIC assignment_expression ']' | |
| +// | direct_declarator '[' type_qualifier_list '*' ']' | |
| +// | direct_declarator '[' type_qualifier_list STATIC assignment_expression ']' | |
| +// | direct_declarator '[' type_qualifier_list assignment_expression ']' | |
| +// | direct_declarator '[' type_qualifier_list ']' | |
| +// | direct_declarator '[' assignment_expression ']' | |
| +// | direct_declarator '(' parameter_type_list ')' | |
| +// | direct_declarator '(' ')' | |
| +// | direct_declarator '(' identifier_list ')' | |
| +// ; | |
| + | |
| +// pointer | |
| +// : '*' type_qualifier_list pointer | |
| +// | '*' type_qualifier_list | |
| +// | '*' pointer | |
| +// | '*' | |
| +// ; | |
| + | |
| +// type_qualifier_list | |
| +// : type_qualifier | |
| +// | type_qualifier_list type_qualifier | |
| +// ; | |
| + | |
| +// parameter_type_list | |
| +// : parameter_list ',' ELLIPSIS | |
| +// | parameter_list | |
| +// ; | |
| + | |
| +// 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 abstract_declarator | |
| +// | specifier_qualifier_list | |
| +// ; | |
| + | |
| +// abstract_declarator | |
| +// : pointer direct_abstract_declarator | |
| +// | pointer | |
| +// | direct_abstract_declarator | |
| +// ; | |
| + | |
| +// direct_abstract_declarator | |
| +// : '(' abstract_declarator ')' | |
| +// | '[' ']' | |
| +// | '[' '*' ']' | |
| +// | '[' STATIC type_qualifier_list assignment_expression ']' | |
| +// | '[' STATIC assignment_expression ']' | |
| +// | '[' type_qualifier_list STATIC assignment_expression ']' | |
| +// | '[' type_qualifier_list assignment_expression ']' | |
| +// | '[' type_qualifier_list ']' | |
| +// | '[' assignment_expression ']' | |
| +// | direct_abstract_declarator '[' ']' | |
| +// | direct_abstract_declarator '[' '*' ']' | |
| +// | direct_abstract_declarator '[' STATIC type_qualifier_list assignment_expression ']' | |
| +// | direct_abstract_declarator '[' STATIC assignment_expression ']' | |
| +// | direct_abstract_declarator '[' type_qualifier_list assignment_expression ']' | |
| +// | direct_abstract_declarator '[' type_qualifier_list STATIC assignment_expression ']' | |
| +// | direct_abstract_declarator '[' type_qualifier_list ']' | |
| +// | direct_abstract_declarator '[' assignment_expression ']' | |
| +// | '(' ')' | |
| +// | '(' parameter_type_list ')' | |
| +// | direct_abstract_declarator '(' ')' | |
| +// | direct_abstract_declarator '(' parameter_type_list ')' | |
| +// ; | |
| + | |
| +// initializer | |
| +// : '{' initializer_list '}' | |
| +// | '{' initializer_list ',' '}' | |
| +// | assignment_expression | |
| +// ; | |
| + | |
| +// initializer_list | |
| +// : designation initializer | |
| +// | initializer | |
| +// | initializer_list ',' designation initializer | |
| +// | initializer_list ',' initializer | |
| +// ; | |
| + | |
| +// designation | |
| +// : designator_list '=' | |
| +// ; | |
| + | |
| +// designator_list | |
| +// : designator | |
| +// | designator_list designator | |
| +// ; | |
| + | |
| +// designator | |
| +// : '[' constant_expression ']' | |
| +// | '.' IDENTIFIER | |
| +// ; | |
| + | |
| +// static_assert_declaration | |
| +// : STATIC_ASSERT '(' constant_expression ',' STRING_LITERAL ')' ';' | |
| +// ; | |
| + | |
| +// 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 | |
| +// : '{' '}' | |
| +// | '{' block_item_list '}' | |
| +// ; | |
| + | |
| +// block_item_list | |
| +// : block_item | |
| +// | block_item_list block_item | |
| +// ; | |
| + | |
| +// block_item | |
| +// : declaration | |
| +// | statement | |
| +// ; | |
| + | |
| +// expression_statement | |
| +// : ';' | |
| +// | expression ';' | |
| +// ; | |
| + | |
| +// selection_statement | |
| +// : IF '(' expression ')' statement ELSE statement | |
| +// | IF '(' expression ')' 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 | |
| +// | FOR '(' declaration expression_statement ')' statement | |
| +// | FOR '(' declaration 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 | |
| +// ; | |
| + | |
| +// declaration_list | |
| +// : declaration | |
| +// | declaration_list declaration | |
| +// ; | |
| + | |
| #[derive(Eq, PartialEq, Clone, Debug)] | |
| pub enum NodeType { | |
| Prog(String), |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment