Tsql 如何在Antlr4语法中实现EOF

Tsql 如何在Antlr4语法中实现EOF,tsql,antlr4,grammar,Tsql,Antlr4,Grammar,我有一个用于TSQL类语言验证的语法。目前,语法规则将与语句一起使用,例如SUM(column1)+SUM(column2) 我希望解析器抛出一个错误,如果它给出了类似 SUM(第1列)SUM(第2列)。请注意,两个和之间缺少运算符。现在,如果我通过解析器运行此语句,它不会出错。相反,它将返回语句的第一部分,SUM(column1),并完全忽略语句的其余部分 经过研究,我相信我的问题的答案是在我的语法中增加一个EOF。我尝试了几种方法来实现这一点,但它对解析没有任何影响 这是在我的语法文件中,在

我有一个用于TSQL类语言验证的语法。目前,语法规则将与语句一起使用,例如
SUM(column1)+SUM(column2)

我希望解析器抛出一个错误,如果它给出了类似
SUM(第1列)SUM(第2列)
。请注意,两个和之间缺少运算符。现在,如果我通过解析器运行此语句,它不会出错。相反,它将返回语句的第一部分,
SUM(column1)
,并完全忽略语句的其余部分

经过研究,我相信我的问题的答案是在我的语法中增加一个EOF。我尝试了几种方法来实现这一点,但它对解析没有任何影响

这是在我的语法文件中,在参数列表中实现它的最佳方式:

grammar DataAnalysis;

expression          : literal                                   #literalAtomExp
                    | FUNCTION=ID '(' argument_list ')'         #functionExp
                    | INLINE_FUNCTION '(' argument_list ')'     #inlineFunctionExp
                    | '(' expression ')'                        #parenthesisExp
                    | expression (ASTERISK|SLASH) expression    #mulDivExp
                    | expression (PLUS|MINUS) expression        #addSubExp
                    | <assoc=right>  expression '^' expression  #powerExp
                    | QUOTEDTEXT                                #stringExp
                    ;


argument_list       : expression (',' expression)* EOF //implemented here
                    ;


literal             : (TABLE_NAME=ID '.')? COLUMN_NAME=ID
                    | VALUE=NUMBER
                    ;

fragment NAME       : [a-zA-Z0-9_]  ;
fragment LETTER     : [a-zA-Z]      ;
fragment DIGIT      : [0-9]         ;

ASTERISK            : '*' ;
SLASH               : '/' ;
PLUS                : '+' ;
MINUS               : '-' ;

INLINE_FUNCTION     : 'YEAR'
                    | 'MONTH'
                    | 'DAY'
                    ;

NUMBER              : ('-')? DIGIT+ ('.' DIGIT+)? ;

ID                  : LETTER (NAME+) ;

QUOTEDTEXT          : '"' .*? '"' ;

WHITESPACE          : ' ' -> channel(HIDDEN);
语法数据分析;
表达式:literal#literalAtomExp
|FUNCTION=ID'('argument_list')'#functionExp
|内联函数“('argument_list')”#内联函数exp
|“(“表达式”)”#括号
|表达式(星号|斜杠)表达式#mulDivExp
|表达式(加|减)表达式#addSubExp
|表达式“^”表达式#powerExp
|QUOTEDTEXT#stringExp
;
参数列表:表达式(','表达式)*EOF//在此处实现
;
文字:(TABLE_NAME=ID'.')?列名称=ID
|值=数字
;
碎片名称:[a-zA-Z0-9_];
碎片字母:[a-zA-Z];
碎片数字:[0-9];
星号:'*';
斜杠:“/”;
加:“+”;
减:'-';
内联函数:“年”
|“月”
|“一天”
;
编号:('-')?数字+('.'数字+);
ID:字母(姓名+);
QUOTEDTEXT:“'.*?”;
空白:“”->通道(隐藏);
即使这样,解析也不会发现问题,只返回查询的第一部分

总而言之,当我向解析器提供
SUM(column1)SUM(column2)
时,我希望它返回一个错误,因为它没有任何与这种情况相关的规则

不知道我错过了什么。感谢您的指导。

使用“expr\u prime:expression EOF;”扩充语法,并从参数列表规则中删除EOF。用expr_prime()开始解析。

我最后只是把它称为“parse”,而不是“expr_prime”。我相信下划线给了我一些问题。