Add the ability for DIL to recognize and process assignment, updating
program variables. Recognizes '=', '+=' and '-=' operators. Increment
and decrement ('++' and '--') will be added in a separate (future) PR.
"*=" and "/=" need to wait until DIL handles multiply and divide
operators.
100 lines
2.9 KiB
EBNF
100 lines
2.9 KiB
EBNF
(* Data Inspection Language (DIL) definition - LLDB Debug Expressions *)
|
|
|
|
(* This is currently a subset of the final DIL Language, matching the current
|
|
DIL implementation. *)
|
|
|
|
expression = assignment_expression ;
|
|
|
|
assignment_expression = shift_expression
|
|
| shift_expression assignment_operator assignment_expression ;
|
|
|
|
assignment_operator = "="
|
|
| "+="
|
|
| "-=" ;
|
|
|
|
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
|
|
| unary_operator cast_expression ;
|
|
|
|
unary_operator = "*" | "&" | "+" | "-";
|
|
|
|
postfix_expression = primary_expression
|
|
| postfix_expression "[" expression "]"
|
|
| postfix_expression "[" expression ":" expression "]"
|
|
| postfix_expression "." id_expression
|
|
| postfix_expression "->" id_expression ;
|
|
|
|
primary_expression = numeric_literal
|
|
| boolean_literal
|
|
| id_expression
|
|
| "(" expression ")" ;
|
|
|
|
id_expression = unqualified_id
|
|
| qualified_id
|
|
| register ;
|
|
|
|
unqualified_id = identifier ;
|
|
|
|
qualified_id = ["::"] [nested_name_specifier] unqualified_id
|
|
| ["::"] identifier ;
|
|
|
|
identifier = ? C99 Identifier ? ;
|
|
|
|
numeric_literal = ? Integer constant: hexademical, decimal, octal, binary ?
|
|
| ? Floating constant ? ;
|
|
|
|
boolean_literal = "true" | "false" ;
|
|
|
|
register = "$" ? Register name ? ;
|
|
|
|
nested_name_specifier = type_name "::"
|
|
| namespace_name '::'
|
|
| nested_name_specifier identifier "::" ;
|
|
|
|
type_id = type_specifier_seq [abstract_declarator] ;
|
|
|
|
type_specifier_seq = type_specifier [type_specifier];
|
|
|
|
type_specifier = ["::"] [nested_name_specifier] type_name
|
|
| builtin_typename ;
|
|
|
|
nested_name_specifier = type_name "::"
|
|
| namespace_name "::"
|
|
| nested_name_specifier identifier "::" ;
|
|
|
|
abstract_declarator = ptr_operator [abstract_declarator] ;
|
|
|
|
ptr_operator = "*"
|
|
| "&";
|
|
|
|
type_name = class_name
|
|
| enum_name
|
|
| typedef_name;
|
|
|
|
builtin_typename = identifier_seq;
|
|
|
|
class_name = identifier ;
|
|
|
|
enum_name = identifier ;
|
|
|
|
typedef_name = identifier ;
|
|
|
|
namespace_name = identifier ;
|
|
|
|
identifier_seq = identifier
|
|
| identifier identifier_seq;
|
|
|
|
|