From: Matthias Kruk Date: Sat, 11 Jul 2020 15:54:15 +0000 (+0900) Subject: doc: Add entire C grammar to parser graph X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=ab12e2574a83955e126a1c07cc1958c9a368520a;p=ccc doc: Add entire C grammar to parser graph --- diff --git a/doc/Makefile b/doc/Makefile index 13d6b26..fc9426f 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,4 +1,12 @@ GRAPHS = parser.png tokenizer.png +PHONY = clean + +all: $(GRAPHS) + +clean: + rm -rf $(GRAPHS) + +.PHONY: $(PHONY) %.png: %.dot dot -Tpng -o$@ $< diff --git a/doc/parser.dot b/doc/parser.dot index 07d331b..14d9bb6 100644 --- a/doc/parser.dot +++ b/doc/parser.dot @@ -1,94 +1,389 @@ digraph parser { - expr [label = "expression", fillcolor="#26c326", style=filled]; - assignexpr [label = "assignment-expression", fillcolor="#26c326", style=filled]; - condexpr [label = "conditional-expression", fillcolor="#26c326", style=filled]; - assignop [label = "assignment-operator", fillcolor="#26c326", style=filled]; - unaryexpr [label = "unary-expression", fillcolor="#26c326", style=filled]; - - pfixexpr [label = "postfix-expression", fillcolor="#26c326", style=filled]; - castexpr [label = "cast-expression", fillcolor="#26c326", style=filled]; - unaryop [label = "unary-operator", fillcolor="#d2d2d2", style=filled]; - - priexpr [label = "primary-expression", fillcolor="#26c326", style=filled]; - argexprlist [label = "argument-expression-list", fillcolor="#26c326", style=filled]; - - identifier [label = "identifier", fillcolor="#26c326", style=filled]; - constant [label = "constant", fillcolor="#26c326", style=filled]; - string [label = "string", fillcolor="#26c326", style=filled]; - typename [label = "type-name"]; - - logorexpr [label = "logical-OR-expression", fillcolor="#26c326", style=filled]; - logandexpr [label = "logical-AND-expression", fillcolor="#26c326", style=filled]; - incorexpr [label = "inclusive-OR-expression", fillcolor="#26c326", style=filled]; - excorexpr [label = "exclusive-OR-expression", fillcolor="#26c326", style=filled]; - andexpr [label = "AND-expression", fillcolor="#26c326", style=filled]; - eqexpr [label = "equality-expression", fillcolor="#26c326", style=filled]; - relexpr [label = "relational-expression", fillcolor="#26c326", style=filled]; - shiftexpr [label = "shift-expression", fillcolor="#26c326", style=filled]; - addexpr [label = "additive-expression", fillcolor="#26c326", style=filled]; - mulexpr [label = "multiplicative-expression", fillcolor="#26c326", style=filled]; - - expr -> assignexpr; - assignexpr -> condexpr; - assignexpr -> unaryexpr; - assignexpr -> assignexpr; - assignexpr -> assignop; - - unaryexpr -> unaryop; - unaryexpr -> castexpr; - unaryexpr -> pfixexpr; - unaryexpr -> unaryexpr; - unaryexpr -> typename; - - condexpr -> logorexpr; - condexpr -> expr; - condexpr -> condexpr; - - logorexpr -> logorexpr; - logorexpr -> logandexpr; - - logandexpr -> logandexpr; - logandexpr -> incorexpr; - - incorexpr -> incorexpr; - incorexpr -> excorexpr; - - excorexpr -> excorexpr; - excorexpr -> andexpr; - - andexpr -> andexpr; - andexpr -> eqexpr; - - eqexpr -> relexpr; - eqexpr -> eqexpr; - - relexpr -> shiftexpr; - relexpr -> relexpr; - - shiftexpr -> addexpr; - shiftexpr -> shiftexpr; - - addexpr -> addexpr; - addexpr -> mulexpr; - - mulexpr -> castexpr; - mulexpr -> mulexpr; - - castexpr -> unaryexpr; - castexpr -> castexpr; - castexpr -> typename; - - pfixexpr -> priexpr; - pfixexpr -> pfixexpr; - pfixexpr -> expr; - pfixexpr -> identifier; - pfixexpr -> argexprlist; - - argexprlist -> argexprlist; - argexprlist -> assignexpr; - - priexpr -> identifier; - priexpr -> constant; - priexpr -> string; - priexpr -> expr; + + abstract_declarator [label = "abstract-declarator"]; + additive_expression [label = "additive-expression", fillcolor="#26c326", style=filled]; + and_expression [label = "and-expression", fillcolor="#26c326", style=filled]; + argument_expression_list [label = "argument-expression-list", fillcolor="#26c326", style=filled]; + assignment_expression [label = "assignment-expression", fillcolor="#26c326", style=filled]; + assignment_operator [label = "assignment-operator", fillcolor="#d2d2d2", style=filled]; + + cast_expression [label = "cast-expression", fillcolor="#26c326", style=filled]; + character_constant [label = "character-constant", fillcolor="#26c326", style=filled]; + compound_statement [label = "compound-statement"]; + conditional_expression [label = "conditional-expression", fillcolor="#26c326", style=filled]; + constant [label = "constant", fillcolor="#26c326", style=filled]; + constant_expression [label = "constant-expression"]; + + declaration [label = "declaration"]; + declaration_list [label = "declaration-list"]; + declaration_specifiers [label = "declaration-specifiers", fillcolor="#26c326", style=filled]; + declarator [label = "declarator"]; + direct_abstract_declarator [label = "direct-abstract-declarator"]; + direct_declarator [label = "direct-declarator"]; + + enum_specifier [label = "enum-specifier"]; + enumeration_constant [label = "enumeration-constant"]; + enumerator [label = "enumerator"]; + enumerator_list [label = "enumerator-list"]; + equality_expression [label = "equality-expression", fillcolor="#26c326", style=filled]; + exclusive_or_expression [label = "exclusive-OR-expression", fillcolor="#26c326", style=filled]; + expression [label = "expression", fillcolor="#26c326", style=filled]; + expression_statement [label = "expression-statement"]; + external_declaration [label = "external-declaration", fillcolor="#26c326", style=filled]; + + floating_constant [label = "floating-constant", fillcolor="#26c326", style=filled]; + function_definition [label = "function-definition", fillcolor="#26c326", style=filled]; + + identifier [label = "identifier", fillcolor="#26c326", style=filled]; + identifier_list [label = "identifier-list"]; + inclusive_or_expression [label = "inclusive-OR-expression", fillcolor="#26c326", style=filled]; + init_declarator [label = "init-declarator"]; + init_declarator_list [label = "init-declarator-list"]; + initializer [label = "initializer"]; + initializer_list [label = "initializer-list"]; + integer_constant [label = "integer-constant", fillcolor="#26c326", style=filled]; + iteration_statement [label = "iteration-statement"]; + + jump_statement [label = "jump-statement"]; + + labeled_statement [label = "labeled-statement"]; + logical_and_expression [label = "logical-AND-expression", fillcolor="#26c326", style=filled]; + logical_or_expression [label = "logical-OR-expression", fillcolor="#26c326", style=filled]; + + multiplicative_expression [label = "multiplicative-expression", fillcolor="#26c326", style=filled]; + + parameter_declaration [label = "parameter-declaration"]; + parameter_list [label = "parameter-list"]; + parameter_type_list [label = "parameter-type-list"]; + pointer [label = "pointer"]; + postfix_expression [label = "postfix-expression", fillcolor="#26c326", style=filled]; + primary_expression [label = "primary-expression", fillcolor="#26c326", style=filled]; + + relational_expression [label = "relational-expression", fillcolor="#26c326", style=filled]; + + selection_statement [label = "selection-statement"]; + shift_expression [label = "shift-expression", fillcolor="#26c326", style=filled]; + specifier_qualifier_list [label = "specifier-qualifier-list", fillcolor="#26c326", style=filled]; + statement [label = "statement"]; + statement_list [label = "statement-list"]; + storage_class_specifier [label = "storage-class-specifier", fillcolor="#26c326", style=filled]; + string [label = "string", fillcolor="#26c326", style=filled]; + struct_declaration [label = "struct-declaration"]; + struct_declaration_list [label = "struct-declaration-list"]; + struct_declarator [label = "struct-declarator"]; + struct_declarator_list [label = "struct-declarator-list"]; + struct_or_union [label = "struct-or-union"]; + struct_or_union_specifier [label = "struct-or-union-specifier"]; + + translation_unit [label = "translation-unit", fillcolor="#26c326", style=filled]; + type_name [label = "type-name"]; + type_qualifier [label = "type-qualifier", fillcolor="#26c326", style=filled]; + type_qualifier_list [label = "type-qualifier-list"]; + type_specifier [label = "type-specifier", fillcolor="#26c326", style=filled]; + typedef_name [label = "typedef-name"]; + + unary_expression [label = "unary-expression", fillcolor="#26c326", style=filled]; + unary_operator [label = "unary-operator", fillcolor="#d2d2d2", style=filled]; + + translation_unit -> external_declaration; + translation_unit -> translation_unit; + + external_declaration -> function_definition; + external_declaration -> declaration; + + function_definition -> declaration_specifiers; + function_definition -> declarator; + function_definition -> declaration_list; + function_definition -> compound_statement; + + declaration -> declaration_specifiers; + declaration -> init_declarator_list; + + declaration_list -> declaration; + declaration_list -> declaration_list; + + declaration_specifiers -> storage_class_specifier; + declaration_specifiers -> declaration_specifiers; + declaration_specifiers -> type_specifier; + declaration_specifiers -> type_qualifier; + + type_specifier -> struct_or_union_specifier; + type_specifier -> enum_specifier; + type_specifier -> typedef_name; + + struct_or_union_specifier -> struct_or_union; + struct_or_union_specifier -> identifier; + struct_or_union_specifier -> struct_declaration_list; + + struct_declaration_list -> struct_declaration; + struct_declaration_list -> struct_declaration_list; + + init_declarator_list -> init_declarator; + init_declarator_list -> init_declarator_list; + + init_declarator -> declarator; + init_declarator -> initializer; + + struct_declaration -> specifier_qualifier_list; + struct_declaration -> struct_declarator_list; + + specifier_qualifier_list -> type_specifier; + specifier_qualifier_list -> type_qualifier; + specifier_qualifier_list -> specifier_qualifier_list; + + struct_declarator_list -> struct_declarator; + struct_declarator_list -> struct_declarator_list; + + struct_declarator -> declarator; + struct_declarator -> constant_expression; + + enum_specifier -> identifer; + enum_specifier -> enumerator_list; + + enumerator_list -> enumerator; + enumerator_list -> enumerator_list; + + enumerator -> identifier; + enumerator -> constant_expression; + + declarator -> pointer; + declarator -> direct_declarator; + + direct_declarator -> identifer; + direct_declarator -> declarator; + direct_declarator -> direct_declarator; + direct_declarator -> constant_expression; + direct_declarator -> parameter_type_list; + direct_declarator -> identifier_list; + + pointer -> type_qualifier_list; + pointer -> pointer; + + type_qualifier_list -> type_qualifier; + type_qualifier_list -> type_qualifier_list; + + parameter_type_list -> parameter_list; + + parameter_list -> parameter_declaration; + parameter_list -> parameter_list; + + parameter_declaration -> declaration_specifiers; + parameter_declaration -> declarator; + parameter_declaration -> abstract_declarator; + + identifier_list -> identifer; + identifier_list -> identifier_list; + + initializer -> assignment_expression; + initializer -> initializer_list; + + initializer_list -> initializer; + initializer_list -> initializer_list; + + type_name -> specifier_qualifier_list; + type_name -> abstract_declarator; + + abstract_declarator -> pointer; + abstract_declarator -> direct_abstract_declarator; + + direct_abstract_declarator -> abstract_declarator; + direct_abstract_declarator -> direct_abstract_declarator; + direct_abstract_declarator -> constant_expression; + direct_abstract_declarator -> parameter_type_list; + + typedef_name -> identifier; + + statement -> labeled_statement; + statement -> expression_statement; + statement -> compound_statement; + statement -> selection_statement; + statement -> iteration_statement; + statement -> jump_statement; + + labeled_statement -> identifier; + labeled_statement -> statement; + labeled_statement -> constant_expression; + + expression_statement -> expression; + + compound_statement -> declaration_list; + compound_statement -> statement_list; + + statement_list -> statement; + statement_list -> statement_list; + + selection_statement -> expression; + selection_statement -> statement; + + iteration_statement -> expression; + iteration_statement -> statement; + + jump_statement -> identifier; + jump_statement -> expression; + + expression -> assignment_expression; + expression -> expression; + + assignment_expression -> conditional_expression; + assignment_expression -> unary_expression; + assignment_expression -> assignment_operator; + assignment_expression -> assignment_expression; + + conditional_expression -> logical_or_expression; + conditional_expression -> expression; + conditional_expression -> conditional_expression; + + constant_expression -> conditional_expression; + + logical_or_expression -> logical_and_expression; + logical_or_expression -> logical_or_expression; + + logical_and_expression -> inclusive_or_expression; + logical_and_expression -> logical_and_expression; + + inclusive_or_expression -> exclusive_or_expression; + inclusive_or_expression -> inclusive_or_expression; + + exclusive_or_expression -> and_expression; + exclusive_or_expression -> exclusive_or_expression; + + and_expression -> equality_expression; + and_expression -> and_expression; + + equality_expression -> relation_expression; + equality_expression -> equality_expression; + + relational_expression -> shift_expression; + relational_expression -> relational_expression; + + shift_expression -> additive_expression; + shift_expression -> shift_expression; + + additive_expression -> multiplicative_expression; + additive_expression -> additive_expression; + + multiplicative_expression -> cast_expression; + multiplicative_expression -> multiplicative_expression; + + cast_expression -> unary_expression; + cast_expression -> type_name; + cast_expression -> cast_expression; + + unary_expression -> postfix_expression; + unary_expression -> unary_expression; + unary_expression -> cast_expression; + unary_expression -> unary_operator; + unary_expression -> type_name; + + postfix_expression -> primary_expression; + postfix_expression -> postfix_expression; + postfix_expression -> expression; + postfix_expression -> argument_expression_list; + postfix_expression -> identifier; + + primary_expression -> identifier; + primary_expression -> constant; + primary_expression -> string; + primary_expression -> expression; + + argument_expression_list -> assignment_expression; + argument_expression_list -> argument_expression_list; + + constant -> integer_constant; + constant -> character_constant; + constant -> floating_constant; + constant -> enumeration_constant; + + # expr [label = "expression", fillcolor="#26c326", style=filled]; + # assignexpr [label = "assignment-expression", fillcolor="#26c326", style=filled]; + # condexpr [label = "conditional-expression", fillcolor="#26c326", style=filled]; + # assignop [label = "assignment-operator", fillcolor="#26c326", style=filled]; + # unaryexpr [label = "unary-expression", fillcolor="#26c326", style=filled]; + + # pfixexpr [label = "postfix-expression", fillcolor="#26c326", style=filled]; + # castexpr [label = "cast-expression", fillcolor="#26c326", style=filled]; + # unaryop [label = "unary-operator", fillcolor="#d2d2d2", style=filled]; + + # priexpr [label = "primary-expression", fillcolor="#26c326", style=filled]; + # argexprlist [label = "argument-expression-list", fillcolor="#26c326", style=filled]; + + # identifier [label = "identifier", fillcolor="#26c326", style=filled]; + # constant [label = "constant", fillcolor="#26c326", style=filled]; + # string [label = "string", fillcolor="#26c326", style=filled]; + # typename [label = "type-name"]; + + # logorexpr [label = "logical-OR-expression", fillcolor="#26c326", style=filled]; + # logandexpr [label = "logical-AND-expression", fillcolor="#26c326", style=filled]; + # incorexpr [label = "inclusive-OR-expression", fillcolor="#26c326", style=filled]; + # excorexpr [label = "exclusive-OR-expression", fillcolor="#26c326", style=filled]; + # andexpr [label = "AND-expression", fillcolor="#26c326", style=filled]; + # eqexpr [label = "equality-expression", fillcolor="#26c326", style=filled]; + # relexpr [label = "relational-expression", fillcolor="#26c326", style=filled]; + # shiftexpr [label = "shift-expression", fillcolor="#26c326", style=filled]; + # addexpr [label = "additive-expression", fillcolor="#26c326", style=filled]; + # mulexpr [label = "multiplicative-expression", fillcolor="#26c326", style=filled]; + + # expr -> assignexpr; + # assignexpr -> condexpr; + # assignexpr -> unaryexpr; + # assignexpr -> assignexpr; + # assignexpr -> assignop; + + # unaryexpr -> unaryop; + # unaryexpr -> castexpr; + # unaryexpr -> pfixexpr; + # unaryexpr -> unaryexpr; + # unaryexpr -> typename; + + # condexpr -> logorexpr; + # condexpr -> expr; + # condexpr -> condexpr; + + # logorexpr -> logorexpr; + # logorexpr -> logandexpr; + + # logandexpr -> logandexpr; + # logandexpr -> incorexpr; + + # incorexpr -> incorexpr; + # incorexpr -> excorexpr; + + # excorexpr -> excorexpr; + # excorexpr -> andexpr; + + # andexpr -> andexpr; + # andexpr -> eqexpr; + + # eqexpr -> relexpr; + # eqexpr -> eqexpr; + + # relexpr -> shiftexpr; + # relexpr -> relexpr; + + # shiftexpr -> addexpr; + # shiftexpr -> shiftexpr; + + # addexpr -> addexpr; + # addexpr -> mulexpr; + + # mulexpr -> castexpr; + # mulexpr -> mulexpr; + + # castexpr -> unaryexpr; + # castexpr -> castexpr; + # castexpr -> typename; + + # pfixexpr -> priexpr; + # pfixexpr -> pfixexpr; + # pfixexpr -> expr; + # pfixexpr -> identifier; + # pfixexpr -> argexprlist; + + # argexprlist -> argexprlist; + # argexprlist -> assignexpr; + + # priexpr -> identifier; + # priexpr -> constant; + # priexpr -> string; + # priexpr -> expr; }