mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Less parser depth
This commit is contained in:
parent
708e68b983
commit
297cfb4857
@ -14,21 +14,29 @@ namespace
|
||||
{
|
||||
|
||||
/// Wrapper to allow mixed lists of nested and normal types.
|
||||
class ParserNestedTableOrExpression : public IParserBase
|
||||
/// Parameters are either:
|
||||
/// - Nested table elements;
|
||||
/// - Enum element in form of 'a' = 1;
|
||||
/// - literal;
|
||||
/// - another data type (or identifier)
|
||||
class ParserDataTypeArgument : public IParserBase
|
||||
{
|
||||
private:
|
||||
const char * getName() const override { return "data type or expression"; }
|
||||
bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override
|
||||
{
|
||||
ParserNestedTable parser1;
|
||||
private:
|
||||
const char * getName() const override { return "data type argument"; }
|
||||
bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override
|
||||
{
|
||||
ParserNestedTable nested_parser;
|
||||
ParserDataType data_type_parser;
|
||||
ParserLiteral literal_parser;
|
||||
|
||||
if (parser1.parse(pos, node, expected))
|
||||
return true;
|
||||
const char * operators[] = {"=", "equals", nullptr};
|
||||
ParserLeftAssociativeBinaryOperatorList enum_parser(operators, std::make_unique<ParserLiteral>());
|
||||
|
||||
ParserExpression parser2;
|
||||
|
||||
return parser2.parse(pos, node, expected);
|
||||
}
|
||||
return nested_parser.parse(pos, node, expected)
|
||||
|| enum_parser.parse(pos, node, expected)
|
||||
|| literal_parser.parse(pos, node, expected)
|
||||
|| data_type_parser.parse(pos, node, expected);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
@ -104,7 +112,7 @@ bool ParserDataType::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
|
||||
++pos;
|
||||
|
||||
/// Parse optional parameters
|
||||
ParserList args_parser(std::make_unique<ParserNestedTableOrExpression>(), std::make_unique<ParserToken>(TokenType::Comma));
|
||||
ParserList args_parser(std::make_unique<ParserDataTypeArgument>(), std::make_unique<ParserToken>(TokenType::Comma));
|
||||
ASTPtr expr_list_args;
|
||||
|
||||
if (!args_parser.parse(pos, expr_list_args, expected))
|
||||
|
Loading…
Reference in New Issue
Block a user