问题描述
我正在使用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