Antlr4语法中如何实现EOF

How to implement EOF in Antlr4 Grammar

我有一个用于 TSQL 式语言验证的语法。目前,语法规则适用于 SUM(column1) + SUM(column2).

等语句

我希望解析器在给出如下内容时抛出错误 SUM(column1) SUM(column2)。注意两个 SUM 之间缺少运算符。现在,如果我 运行 这个语句通过解析器它不会出错。相反,它将 return 语句的第一部分 SUM(column1) 并完全忽略语句的其余部分。

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

这是我认为在 argument_list:

语法文件中实现它的最佳方式
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);

即使这样,解析也没有解决问题,return只是查询的第一部分。

总而言之,当我向解析器 SUM(column1) SUM(column2) 提供信息时,我希望它 return 出现错误,因为它没有针对该情况的任何关联规则。

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

使用 "expr_prime : expression EOF;" 扩充语法,并从 argument_list 规则中删除 EOF。使用 expr_prime().

开始解析