以 ms sql 解析括号内的内容
parsing bracketed things in ms sql
我正在尝试解析 ms sql,它允许将许多内容括起来。例如,您可以将列名称、table 名称、临时 table 和数据类型括起来。
这可以采用如下形式:
select [#col1], [key], [case], [select], from [mytable]
CREATE TABLE MyTable ([MyCol] [varchar](50) NULL)
我 运行 遇到的问题是,如果我将 "bracketed identifier" 放入我的词法分析器定义中,那么我的解析器将看到像 [MyCol] 和 [varchar] 这样的标记。 [varchar] 不是我的解析器知道的数据类型,但 varchar 是。我的语法无法处理处理一些带括号的标记和一些未带括号的标记的复杂性。
另一方面,如果我从我的词法分析器中取出括号逻辑并将其放入我的解析器,那么我将无法解析恰好包含 sql 关键字的列名。例如:
select [key], [special case] from MyTable
如果重要的话,我将由此生成 C# 代码,而不是 java 代码。
我该如何处理?
在解析器中执行此操作是最好的方法。为了正确处理作为标识符的关键字,您必须将所有允许的关键字添加到您的解析器标识符规则中,类似于我在 MySQL grammar.
中所做的
参见this tsql grammar for ANTLR4. There is SQUARE_BRACKET_ID: '[' ~']'+ ']';
and rule id:
id
: simple_id
| DOUBLE_QUOTE_ID
| SQUARE_BRACKET_ID
;
可以处理 SQUARE_BRACKET_ID 个标识符。
我正在尝试解析 ms sql,它允许将许多内容括起来。例如,您可以将列名称、table 名称、临时 table 和数据类型括起来。
这可以采用如下形式:
select [#col1], [key], [case], [select], from [mytable]
CREATE TABLE MyTable ([MyCol] [varchar](50) NULL)
我 运行 遇到的问题是,如果我将 "bracketed identifier" 放入我的词法分析器定义中,那么我的解析器将看到像 [MyCol] 和 [varchar] 这样的标记。 [varchar] 不是我的解析器知道的数据类型,但 varchar 是。我的语法无法处理处理一些带括号的标记和一些未带括号的标记的复杂性。
另一方面,如果我从我的词法分析器中取出括号逻辑并将其放入我的解析器,那么我将无法解析恰好包含 sql 关键字的列名。例如:
select [key], [special case] from MyTable
如果重要的话,我将由此生成 C# 代码,而不是 java 代码。
我该如何处理?
在解析器中执行此操作是最好的方法。为了正确处理作为标识符的关键字,您必须将所有允许的关键字添加到您的解析器标识符规则中,类似于我在 MySQL grammar.
中所做的参见this tsql grammar for ANTLR4. There is SQUARE_BRACKET_ID: '[' ~']'+ ']';
and rule id:
id
: simple_id
| DOUBLE_QUOTE_ID
| SQUARE_BRACKET_ID
;
可以处理 SQUARE_BRACKET_ID 个标识符。