labath wrote:

Thanks for the summary Andy.

> I went through the thread to understand the current consensus and I see 
> various nice ideas flying around. Let me try to summarize the requirements 
> and the current status quo.
> 
>   * DIL should support synthetic children, whose names can be arbitrary in 
> general case, even `a+b*c`
> 
>    * A common synthetic name is `[0]`, which is used for children of 
> vectors/maps and people want to write `print vec[0]`
>       
>      * `frame variable` supports this by having special support for `[]` 
> "expressions"
> 
>    * We want DIL to be easy & convenient to use in most (simple) cases, but 
> also to be able to support complicated cases and it doesn't have to be 
> _super_ convenient for those

SGTM

> Possible behaviour for DIL:
> 
>   * Make the definition of `identifier` in Lexer to roughly match C or similar
> 
>   * Introduce escaping of identifiers, e.g. with backticks
>       
>     * The expression `` foo->`a*b.c`+1 `` is parsed as approx 
> `foo.GetChildWithName("a*b.c") + 1`

I already spoke at length about identifier names. Quoting of fancy names SGTM. 
I don't think its relevant for this patch (lexing), but since you're also 
mentioning the wider syntax of the language, I want to mention that there's 
also another kind of disambiguation to consider. Forcing a string to be treated 
as an identifier is one thing. Another question is forcing an identifier to be 
treated as a specific kind of entity. For example, if there's a variable and a 
type with the same name, can we say which one we mean? Or can we say we want to 
see the value of a global variable `foo` in a specific compile unit? Or in an 
outer scope that's shadowed by another variable?

We don't exactly support that right now, but e.g. `target variable foo` will 
print *all* global variables with that names. That gets trickier with a more 
complicated parser, because how do you print the result of `global1+global2` if 
there are multiple candidates for each name

> 
>     * Add special support for `[]` in the parser
>       
>       * The expression `` foo.`[1]`  `` is parsed as 
> `foo.GetChildWithName("[1]")`
>       * The expression `foo[1]` tries the following:
>         
>         * `foo.GetChildWithName("1")`
>         * `foo.GetChildWithName("[1]")`
>         * `foo.GetChildAtIndex(1)`

I'd go with just the second option because I'd like to avoid ambiguities and 
fallbacks. I think that's more or less the status quo, at least for the types 
with child providers. We'd need some special handling for C pointers and 
arrays, but that's also what we already have

>       * The expression `foo["bar"]` tries:
>         
>         * `foo.GetChildWithName("bar")`
>         * `foo.GetChildWithName("[bar]")`
>       * The expression `foo[<expr>]` -- `expr` is evaluated and treated as 
> cases above. If the result of `expr` is not a number or a string -- produce 
> an error

I think this is an interesting idea whose usefulness mainly depends on what 
kind of string operations we have in the language. If there's no way to 
construct strings, then I don't think it's very useful. You could write things 
like `some_variable[another_variable]`, but I don't think that's going to be 
useful because for static types (e.g. C structs) you're unlikely to have a 
variable with a value that contains the name of a field, and for types with 
synthetic children the names of the children are not going to have any relation 
to the way it's seen by the code (map<string, string> is still going to have a 
child called `[0]`).

Overall I'd leave this out for the time being because it doesn't impact parsing 
or lexing, just how some (currently invalid) syntax trees can be interpreted.

> For cases where the `GetChildWithName( "1" / "[1]" )` and 
> `GetChildAtIndex(1)` produce different valid results we could shows a 
> warning/error to make it clear to the user that there's some ambiguity. IMO 
> this would be an improvement over the current situation where `print` and 
> `expr` simply produce different results.

I'm not sure how this is going to help. I assume you're referring to the 
`map<int, int>` scenario. In this case, the map object is not going to have a 
child called `"1"`, even if it happens to contain a key with the value `1`. 
(Depending on the other keys, the name of the child containing it could be 
`"[0]"`, `"[1]"`, or `"[47]"`). Or are you proposing to change that?

https://github.com/llvm/llvm-project/pull/123521
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to