• flex and bison grouping

    From Archana Deshmukh@21:1/5 to All on Thu May 18 22:54:13 2023
    Hello,

    I would like to parse following line using bison and flex.

    Any help / suggestions are most welcome.

    efg @main(%data: r[(1, 2, 4, 4), float32], %param_1: or[(2, 1, 5, 5),
    float32], %param_2: or[(20), float32], %param_3: or[(5, 2, 5, 5), float32], %param_4: or[(50), float32], %param_5: or[(50, 80), float32], %param_6: Tensor[(50), float32], %param_7: or[(10, 50), float32], %param_8: or[(20), float32]

    Best Regards,
    Archana Deshmukh
    [This looks very straightforward. The Flex tokens are keywords, numbers,
    and punctuation, the bison rules would be a %param or %data expression,
    a list of such expressions, and so on. Is there some particular problem
    you are encountering? -John
    Cheap plug: there's always my book https://amzn.to/3IrtPFS ]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Archana Deshmukh@21:1/5 to Archana Deshmukh on Wed May 24 23:20:22 2023
    On Saturday, May 20, 2023 at 1:26:09 AM UTC+5:30, Archana Deshmukh wrote:
    Hello,

    I would like to parse following line using bison and flex.

    Any help / suggestions are most welcome.

    efg @main(%data: r[(1, 2, 4, 4), float32], %param_1: or[(2, 1, 5, 5), float32], %param_2: or[(20), float32], %param_3: or[(5, 2, 5, 5), float32], %param_4: or[(50), float32], %param_5: or[(50, 80), float32], %param_6: Tensor[(50), float32], %param_7: or[(10, 50), float32], %param_8: or[(20), float32]

    Best Regards,
    Archana Deshmukh
    [This looks very straightforward. The Flex tokens are keywords, numbers,
    and punctuation, the bison rules would be a %param or %data expression,
    a list of such expressions, and so on. Is there some particular problem
    you are encountering? -John
    Cheap plug: there's always my book https://amzn.to/3IrtPFS ]


    Thanks John for response.
    I am able to write flex tokens and bison parser and able to retrieve tokens and values. Now, I want to put these values to a list. I implemented with C linked list
    with simple structure
    struct node{
    char* name;
    int dimensions[4];
    char* type;
    struct node *next;
    };
    I am able to populate the list for "name" parameter. The type is also of type char*. How, I can differentiate between parameter "char* name" or "char* type" when I populate list.

    The flex code has tokens and bison parser code understands these tokens correctly. Now, I need to put these values to list. I think I am missing something here. There is no context in bison code.

    Best Regards,
    Archana Deshmukh
    [If it's not obvious from context what kind of nodes are in the list, add a tag field to the
    node that tells you what kind of node it is. For nodes this small it doesn't really
    matter, but we often use a union to use the same space for fields that appear in different
    kinds of nodes. -John]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From gah4@21:1/5 to Archana Deshmukh on Thu May 25 17:08:55 2023
    On Thursday, May 25, 2023 at 5:49:39 AM UTC-7, Archana Deshmukh wrote:

    (snip)

    I am able to write flex tokens and bison parser and able to retrieve tokens
    and values. Now, I want to put these values to a list. I implemented with C linked list
    with simple structure
    struct node{
    char* name;
    int dimensions[4];
    char* type;
    struct node *next;
    };
    I am able to populate the list for "name" parameter. The type is also of type char*.
    How, I can differentiate between parameter "char* name" or "char* type" when I populate list.

    One that you have to be careful about with C in general, and I suspect in this case,
    is that you might have a pointer to some buffer that is reused. Saving the pointer
    returned by flex might not help. (I suspect John will tell me if this is wrong.)

    You often need to allocate new space, and make a copy to save.
    [You are right -- you need to make a copy of the yytext string in a
    flex action if you want to keep it. Otherwise it'll be overwritten the
    next time the lexer reads a block of input text. This is a very common
    bug. -John]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Hans-Peter Diettrich@21:1/5 to All on Sat May 27 02:08:39 2023
    On 5/26/23 2:08 AM, gah4 wrote:
    On Thursday, May 25, 2023 at 5:49:39 AM UTC-7, Archana Deshmukh wrote:

    I am able to populate the list for "name" parameter. The type is also of type char*.
    How, I can differentiate between parameter "char* name" or "char* type" when I populate list.

    One that you have to be careful about with C in general, and I suspect in this case,
    is that you might have a pointer to some buffer that is reused. Saving the pointer
    returned by flex might not help. (I suspect John will tell me if this is wrong.)

    You often need to allocate new space, and make a copy to save.

    In a typical compiler strings go into lists of literals and identifiers
    (types, variables, functions...). The string has to be stored (copied)
    on the first occurence, later occurences mostly become references to the already existing entry (depending on scope rules).

    [You are right -- you need to make a copy of the yytext string in a
    flex action if you want to keep it. Otherwise it'll be overwritten the
    next time the lexer reads a block of input text. This is a very common
    bug. -John]

    DoDi

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)