antlr4 TSqlParser.g4 / TSqlLexer.g4区分大小写问题

问题描述

我正在使用These TSql Grammars/Lexers来解析c#目标中的存储过程。

我发现以下方法有问题。

public override void EnterProcedure_param(Procedure_paramContext context)
{
    string txt = context.GetText();

    string datatype = context.data_type().GetText();

    if (IsUserDefinedType(datatype)) // not shown
        DoSomething(datatype);
}

定义存储过程时,它将正确提取数据类型(和txt):

CREATE PROCEDURE [dbo].[PROC_SomeProc]
    @APPINSTID BIGINT
AS ...

但不是

CREATE PROCEDURE [dbo].[PROC_SomeProc]
    @AppInstId BIGINT
AS ...

在后一种情况下,txt为'@AI',数据类型为'I'。

此外,如果参数定义为@appinstid,则永远不会访问该方法

这是否意味着语法一定有缺陷,或者我可能遗漏了一些东西?

解决方法

使用CaseChangingCharStream代替标准令牌流。在此处查看详细信息:https://github.com/antlr/antlr4/blob/master/doc/case-insensitive-lexing.md