| (* LLDB Debug Expressions, a subset of C++ *) |
| (* Insired by https://www.nongnu.org/hcb *) |
| |
| expression = assignment_expression ; |
| |
| assignment_expression = conditional_expression ; |
| |
| conditional_expression = logical_or_expression |
| | logical_or_expression "?" expression ":" assignment_expression ; |
| |
| logical_or_expression = logical_and_expression {"||" logical_and_expression} ; |
| |
| logical_and_expression = inclusive_or_expression {"&&" inclusive_or_expression} ; |
| |
| inclusive_or_expression = exclusive_or_expression {"|" exclusive_or_expression} ; |
| |
| exclusive_or_expression = and_expression {"^" and_expression} ; |
| |
| and_expression = equality_expression {"&" equality_expression} ; |
| |
| equality_expression = relational_expression {"==" relational_expression} |
| | relational_expression {"!=" relational_expression} ; |
| |
| relational_expression = shift_expression {"<" shift_expression} |
| | shift_expression {">" shift_expression} |
| | shift_expression {"<=" shift_expression} |
| | shift_expression {">=" shift_expression} ; |
| |
| shift_expression = additive_expression {"<<" additive_expression} |
| | additive_expression {">>" additive_expression} ; |
| |
| additive_expression = multiplicative_expression {"+" multiplicative_expression} |
| | multiplicative_expression {"-" multiplicative_expression} ; |
| |
| multiplicative_expression = cast_expression {"*" cast_expression} |
| | cast_expression {"/" cast_expression} |
| | cast_expression {"%" cast_expression} ; |
| |
| cast_expression = unary_expression |
| | "(" type_id ")" cast_expression ; |
| |
| unary_expression = postfix_expression |
| | "++" cast_expression |
| | "--" cast_expression |
| | unary_operator cast_expression ; |
| |
| unary_operator = "*" | "&" | "+" | "-" | "!" | "~" ; |
| |
| postfix_expression = primary_expression {"[" expression "]"} |
| | primary_expression {"." id_expression} |
| | primary_expression {"->" id_expression} |
| | primary_expression {"++"} |
| | primary_expression {"--"} ; |
| |
| primary_expression = numeric_literal |
| | boolean_literal |
| | pointer_literal |
| | id_expression |
| | "this" |
| | "(" expression ")" ; |
| |
| type_id = type_specifier_seq {abstract_declarator} ; |
| |
| type_specifier_seq = type_specifier {type_specifier_seq} ; |
| |
| type_specifier = simple_type_specifier |
| | cv_qualifier ; |
| |
| simple_type_specifier = {"::"} {nested_name_specifier} type_name |
| | "char" |
| | "char16_t" |
| | "char32_t" |
| | "wchar_t" |
| | "bool" |
| | "short" |
| | "int" |
| | "long" |
| | "signed" |
| | "unsigned" |
| | "float" |
| | "double" |
| | "void" ; |
| |
| nested_name_specifier = type_name "::" |
| | namespace_name '::' |
| | nested_name_specifier identifier "::" |
| | nested_name_specifier simple_template_id "::" |
| |
| type_name = class_name |
| | enum_name |
| | typedef_name |
| | simple_template_id ; |
| |
| class_name = identifier ; |
| |
| enum_name = identifier ; |
| |
| typedef_name = identifier ; |
| |
| simple_template_id = template_name "<" {template_argument_list} ">" ; |
| |
| template_name = identifier ; |
| |
| template_argument_list = template_argument |
| | template_argument_list "," template_argument ; |
| |
| template_argument = type_id |
| | id_expression ; |
| |
| namespace_name = identifier ; |
| |
| cv_qualifier = "const" | "volatile" ; |
| |
| cv_qualifier_seq = cv_qualifier {cv_qualifier_seq} ; |
| |
| abstract_declarator = ptr_operator {abstract_declarator} ; |
| |
| ptr_operator = "*" {cv_qualifier_seq} |
| | "&" ; |
| |
| id_expression = unqualified_id |
| | qualified_id ; |
| |
| unqualified_id = identifier ; |
| |
| qualified_id = {"::"} {nested_name_specifier} unqualified_id |
| | {"::"} identifier ; |
| |
| identifier = ? clang::tok::identifier ? ; |
| |
| numeric_literal = ? clang::tok::numeric_constant ? ; |
| |
| boolean_literal = "true" | "false" ; |
| |
| pointer_literal = "nullptr" ; |