aboutsummaryrefslogtreecommitdiff
path: root/lldb/docs/dil-expr-lang.ebnf
blob: 04c8ec93a3e21904dc9b77bd3d87e21448bbd6d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
(* Data Inspection Language (DIL) definition - LLDB Debug Expressions *)

(* This is currently a subset of the final DIL Language, matching the current
   DIL implementation. *)

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;