`PRIMARY KEY (key1,key2,key3)` VS `PRIMARY KEY key1,key2,key3`

```
create database test;
use test;

create table dict_table ( key1 UInt64, key2 String, key3 String, S String)
Engine MergeTree order by (key1, key2, key3);

CREATE DICTIONARY item_dict ( key1 UInt64, key2 String, key3 String, S String ) 
PRIMARY KEY (key1,key2,key3) 
SOURCE(CLICKHOUSE(TABLE dict_table DB 'test' USER 'default')) 
LAYOUT(complex_key_direct());

Expected one of: list of elements, identifier

CREATE DICTIONARY item_dict ( key1 UInt64, key2 String, key3 String, S String ) 
PRIMARY KEY key1,key2,key3
SOURCE(CLICKHOUSE(TABLE dict_table DB 'test' USER 'default')) 
LAYOUT(complex_key_direct());
Ok.

0 rows in set. Elapsed: 0.007 sec.
```
ParserToken open(TokenType::OpeningRoundBracket);
    ParserToken close(TokenType::ClosingRoundBracket);
    ParserFunctionWithKeyValueArguments key_value_pairs_p;
    ParserList expression_list_p(std::make_unique<ParserIdentifier>(), std::make_unique<ParserToken>(TokenType::Comma), false);
    ParserDictionaryLifetime lifetime_p;
    ParserDictionaryRange range_p;
    ParserDictionaryLayout layout_p;
    ParserDictionarySettings settings_p;
    ASTPtr primary_key;
    ASTPtr ast_source;
    ASTPtr ast_lifetime;
    ASTPtr ast_layout;
    ASTPtr ast_range;
    ASTPtr ast_settings;
    
    if (primary_key_keyword.ignore(pos) && !expression_list_p.parse(pos, primary_key, expected))
        return false;
    
    while (true)
    {
        if (!ast_source && source_keyword.ignore(pos, expected))
        {
            if (!open.ignore(pos))
                return false;
            if (!key_value_pairs_p.parse(pos, ast_source, expected))
                return false;
            if (!close.ignore(pos))
                return false;
            continue;
        }