我使用这些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